STM32CubeMX HAL库 串口的使用

1.配置

STM32CubeMX HAL库 串口的使用_第1张图片

2.开启中断后,生成代码 

3.串口的接收

1).开启空闲中断接收

__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE); // 关键步骤:启用空闲中断

2). 启动接收

调用 HAL_UARTEx_ReceiveToIdle_IT 启动异步接收,可以使用连个数组交替接收

#define RX_BUFFER_SIZE 256
uint8_t rx_buffer[RX_BUFFER_SIZE];

// 在 main() 或某个初始化函数中启动接收
HAL_UARTEx_ReceiveToIdle_IT(&huart1, rx_buffer, RX_BUFFER_SIZE);

3).实现接收回调

当以下事件发生时,会触发 HAL_UARTEx_RxEventCallback 回调函数:

  • 接收到指定长度(RX_BUFFER_SIZE)的数据;
  • 检测到空闲(IDLE)状态。

在回调函数中处理接收到的数据

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
  if (huart == &huart1) {
    // Size 是实际接收到的数据长度(可能小于 RX_BUFFER_SIZE)
    if (Size > 0) {
      // 处理数据(例如解析、转发等)
      process_received_data(rx_buffer, Size);
    }

    // 重新启动接收,以持续监听数据
    HAL_UARTEx_ReceiveToIdle_IT(&huart1, rx_buffer, RX_BUFFER_SIZE);
  }
}

接收注意事项‌

  1. 缓冲区大小‌:设置的 RX_BUFFER_SIZE 应足够大以容纳最大预期数据包,否则可能溢出。
  2. 及时重启接收‌:在回调函数中务必重新调用 HAL_UARTEx_ReceiveToIdle_IT,否则后续数据无法接收。 ‌
  3. 数据竞争‌:避免在数据处理过程中修改 rx_buffer,可以使用双缓冲区(Ping-Pong Buffer)策略。 ‌
  4. 错误处理‌:检查 HAL_UARTEx_ReceiveToIdle_IT 的返回值,确保启动成功(返回 HAL_OK)。

4.串口的数据的发送 

以下是 STM32 HAL 库中 ‌UART 数据发送‌的常用方式及使用方法总结:

一、UART 数据发送的三种模式‌

根据 HAL 库设计,可通过以下三种方式实现 UART 数据发送:

轮询模式(阻塞式)‌

调用 HAL_UART_Transmit 函数,CPU 持续等待数据发送完成后再执行后续代码。
适用场景‌:简单调试、低频率小数据量传输。

// 示例代码:发送字符串 "Hello"
uint8_t data[] = "Hello";
HAL_UART_Transmit(&huart2, data, sizeof(data), 100);  // 超时时间 100ms

中断模式(非阻塞)‌

调用 HAL_UART_Transmit_IT 函数启动发送,数据通过中断异步传输,CPU 可并行处理其他任务。
适用场景‌:需提高 CPU 利用率的中等数据量传输。

// 步骤:
// 1. 启动发送
HAL_UART_Transmit_IT(&huart2, data, len);

// 2. 实现发送完成回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart == &huart2) {
        // 发送完成后的处理(如启动下一次发送)
    }
}

DMA 模式(非阻塞)‌

调用 HAL_UART_Transmit_DMA 函数,DMA 控制器直接搬运数据至 UART 外设,完全释放 CPU。
适用场景‌:高速、大数据量传输(如音频流、图像数据)。

// CubeMX 配置:
// 1. 开启 UART DMA 发送通道
// 2. 启动发送
HAL_UART_Transmit_DMA(&huart2, data, len);

二、发送模式选择建议‌

模式    优点                            缺点                          典型应用场景


轮询    实现简单                     阻塞 CPU                 调试输出、简单指令
中断    非阻塞、                     中等效率                  频繁中断可能影响系统实时性    中速数据包传输
DMA    零 CPU 占用、高效    需配置 DMA 通道    高速大数据传输

三、关键配置步骤‌

1.CubeMX 基础配置‌

启用 UART 外设并配置波特率、数据位等参数。
中断模式‌:使能 UART 全局中断(NVIC 设置优先级)。
DMA 模式‌:添加 DMA 通道(方向为 Memory-to-Peripheral)。

2.代码实现要点‌

中断模式‌需实现 HAL_UART_TxCpltCallback 回调函数处理发送完成事件。
DMA 模式‌需确保发送缓冲区在 DMA 传输期间保持有效(避免使用栈内存)。

四、注意事项‌

  1. 错误处理‌:检查函数返回值(如 HAL_OK),并在 HAL_UART_ErrorCallback 中处理超时或硬件错误。
  2. 缓冲区管理‌:避免在发送过程中修改发送缓冲区数据(尤其在使用 DMA 时)。可使用双缓冲区交替发送以提高效率。
  3. 重新启动发送‌:在中断或 DMA 回调中需手动重启发送流程(如需连续传输)。

五、进阶优化‌

自定义协议‌:结合空闲中断(IDLE)实现不定长数据帧接收,与发送逻辑配合使用。
混合模式‌:对关键数据使用中断/DMA,非关键数据使用轮询,平衡系统负载。


通过合理选择发送模式并优化配置,可显著提升 STM32 UART 通信的效率和可靠性。

你可能感兴趣的:(STM32CubeMX,stm32,嵌入式硬件,单片机)