嵌入式MCU口试条记2

[复制链接]
发表于 2025-11-4 03:20:33 | 显示全部楼层 |阅读模式
目次

串口通讯
概论
原理
设置
HAL库代码
1. 初始化函数
2. 数据发送和吸取函数
3. 制止和DMA函数
4. 制止服务函数


串口通讯

概论

我们知道,通讯桥接了两个装备之间的交换。一个经典的例子就是使用串口通讯交换上位机和单片机之间的数据。
比力常见的串口通讯协议是下面这两个:
UART(通用异步收发传输器,Universal Asynchronous Receiver/Transmitter):这里可以看到,如许的协议只有Asynchronous,提示你这个协议是异步的。异步通讯,须要在转达数据的同时,添加起始位、制止位、校验位等举行帧同步放置举行数据裁剪和区分。
USART(通用同步异步收发传输器)则更进一步,支持了同步的通讯方式在同步模式下,USART通过期钟信号与从装备同步数据传输,在异步模式下工作与UART相似。
原理

本质上,就是数据通过数据线移动,从一个装备转达到另一个装备。在串口通讯中,这是通过移位寄存器移位实现的。移出去的位被派发到传输线上转达出去,给下一个移进来的比特腾出来位置。对于担当的装备,那就是担当到来的比特,给下一个到来的比特腾出位置。

过细看,这里的移位寄存器表示图就是在移动将它发送到TX端上从数据线上流出去,另一端如果有来者,则从RX端进入吸取移位寄存器进来。
设置

上面的笼统概述没有同一题目:咋个长度?咋个校验?收发速率怎样?不讨论这些题目,双方无法包管数据的担当和发送是逐一呼应的,极易导致数据担当和发送非常。以是就有了协议,协议约定了两者的动作。


  • 波特率,串口通讯的速率,一样平常须要设置波特率寄存器实现。其盘算公式是:

  • 空闲,一样平常为高电平
  • 起始位,标志一个数据帧的开始,固定为低电平。当数据开始发送时,产生一个降落沿。(空闲–>起始位)
  • 数据位,发送数据帧,1为高电平,0为低电平。低位先行。 好比 发送数据帧0x0F 在数据帧里就是低位线性 即 1111 0000
  • 校验位,用于数据验证,根据数据位的盘算得来。有奇校验,偶校验和无校验。
    奇校验(Odd Parity):确保数据帧中1的数目为奇数。 偶校验(Even Parity):确保数据帧中1的数目为偶数。
  • 制止位,用于数据的隔断,固定为高电平。数据帧发送完成后,产生一个上升沿。(数据传输–>制止位)
HAL库代码

1. 初始化函数



  • HAL_UART_Init()
    这个函数一样平常如果使用CubeMx设置的话就会给你写好了,它用于初始化UART外设,包罗波特率、数据位、制止位、奇偶校验和硬件流控制。通常在步调开始时调用此函数,以设置UART通讯的根本参数。
    1. HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);
    复制代码
    参数分析

    • huart:指向UART句柄的指针,句柄包罗了UART的全部设置参数,如波特率、数据位、制止位等。
    返回值
       

    • HAL_OK:初始化乐成。
    • HAL_ERROR:初始化失败。
    使用示例
    1. UART_HandleTypeDef huart1;
    2. huart1.Instance = USART1;
    3. huart1.Init.BaudRate = 9600;
    4. huart1.Init.WordLength = UART_WORDLENGTH_8B;
    5. huart1.Init.StopBits = UART_STOPBITS_1;
    6. huart1.Init.Parity = UART_PARITY_NONE;
    7. huart1.Init.Mode = UART_MODE_TX_RX;
    8. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    9. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    10. HAL_UART_Init(&huart1);
    复制代码

2. 数据发送和吸取函数



  • HAL_UART_Transmit()
    用于通过UART发送数据。此函数可以在壅闭模式、非壅闭模式或制止模式下工作。
    1. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
    复制代码
    参数分析

    • huart:指向UART句柄的指针。
    • pData:指向要发送的数据的指针。
    • Size:要发送的数据字节数。
    • Timeout:超时时间,单位为毫秒。
    返回值
       

    • HAL_OK:数据发送乐成。
    • HAL_ERROR:发送失败。
    使用示例
    1. uint8_t msg[] = "Hello UART!";
    2. HAL_UART_Transmit(&huart1, msg, sizeof(msg)-1, 1000);
    复制代码

  • HAL_UART_Receive()
    用于从UART吸取数据。该函数也可以在壅闭模式、非壅闭模式或制止模式下工作。
    1. HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
    复制代码
    参数分析

    • huart:指向UART句柄的指针。
    • pData:指向吸取数据的缓冲区。
    • Size:要吸取的数据字节数。
    • Timeout:超时时间,单位为毫秒。
    返回值
       

    • HAL_OK:数据吸劳绩功。
    • HAL_ERROR:吸取失败。
    使用示例
    1. uint8_t receivedData[10];
    2. HAL_UART_Receive(&huart1, receivedData, 10, 1000);
    复制代码

3. 制止和DMA函数



  • HAL_UART_Transmit_IT()
    这种方式就是异步的,实行完这个函数只是委托函数开始转发,步调流继续实行。用于通过制止方式发送数据。当数据发送完成时,会触发制止。
    1. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
    复制代码
    参数分析

    • huart:指向UART句柄的指针。
    • pData:指向要发送的数据的指针。
    • Size:要发送的数据字节数。
    返回值
       

    • HAL_OK:数据发送任务已启动。
    • HAL_ERROR:启动失败。
    使用示例
    1. uint8_t msg[] = "Hello UART!";
    2. HAL_UART_Transmit_IT(&huart1, msg, sizeof(msg)-1);
    复制代码

  • HAL_UART_Receive_IT()
    用于通过制止方式吸取数据。吸取的数据将在制止服务步调(ISR)中处置处罚。
    1. HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
    复制代码
    参数分析

    • huart:指向UART句柄的指针。
    • pData:指向吸取数据的缓冲区。
    • Size:要吸取的数据字节数。
    返回值
       

    • HAL_OK:吸取任务已启动。
    • HAL_ERROR:启动失败。
    使用示例
    1. uint8_t receivedData[10];
    2. HAL_UART_Receive_IT(&huart1, receivedData, 10);
    复制代码

  • HAL_UART_Transmit_DMA()
    用于通过DMA(直接内存访问)发送数据。DMA可以使数据传输不占用CPU,从而进步数据传输服从。
    1. HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
    复制代码
    参数分析

    • huart:指向UART句柄的指针。
    • pData:指向要发送的数据的指针。
    • Size:要发送的数据字节数。
    返回值
       

    • HAL_OK:DMA传输已启动。
    • HAL_ERROR:启动失败。
    使用示例
    1. uint8_t msg[] = "Hello UART!";
    2. HAL_UART_Transmit_DMA(&huart1, msg, sizeof(msg)-1);
    复制代码

  • HAL_UART_Receive_DMA()
    用于通过DMA吸取数据。DMA可以有效地将数据从UART缓冲区传输到内存,而无需CPU干预。
    1. HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
    复制代码
    参数分析

    • huart:指向UART句柄的指针。
    • pData:指向吸取数据的缓冲区。
    • Size:要吸取的数据字节数。
    返回值
       

    • HAL_OK:DMA吸取已启动。
    • HAL_ERROR:启动失败。
    使用示例
    1. uint8_t receivedData[10];
    2. HAL_UART_Receive_DMA(&huart1, receivedData, 10);
    复制代码

4. 制止服务函数

在使用制止模式时,须要实现制止回调函数。这些函数由HAL库调用。我们须要做的就是实现这些函数(风趣的是默认的实现是__weak的,意味着用户的界说从属于强界说,编译器优先采取用户实现。)


  • HAL_UART_TxCpltCallback()
    当数据发送完成时,这个回调函数会被调用。
    1. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
    复制代码
  • HAL_UART_RxCpltCallback()
    当数据吸取完成时,这个回调函数会被调用。
    1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
    复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表