CubeMX 配置与基础知识
- GPIO 复用与下载调试接口: CubeMX 开启 GPIO 复用相关代码后,会根据设置配置下载调试接口。需要手动设置下载调试器接口以确保正常下载和调试。
- 波特率:
- 定义:每秒传送的码元数量,即每秒产生多少次高低电平信号。
- 默认情况下,传送一字节信息需要 10 bit (1 位起始位 + 8 位数据位 + 1 位终止位)。
- 计算示例:波特率为 115200 bit/s 时,一秒内可传送 115200 / 10 = 11520 字节的数据。
- 常用波特率:9600, 19200, 38400, 115200 等。
- 重要前提:通信的两个设备必须保持相同的波特率。
- 硬件连接:
- 使用 TTL 串口转 USB 模块。
- 接线规则:交叉连接,即模块的 RX 接设备的 TX,模块的 TX 接设备的 RX。
- 必须共地 (GND 连 GND)。
- 工具:
- 串口调试助手 (用于在 PC 端发送和接收数据)。
- 安装对应的串口驱动 。
串口通信模式
1. 轮询模式 (Polling Mode)
- 必须阻塞程序执行,直到发送或接收完成,或者等待超时。
- 接收时通常需要指定接收固定长度的数据。
2. 中断模式 (Interrupt Mode)
- 触发机制: 每接收或发送一字节数据时触发一次中断。
- 回调函数: 每次接收完成后会执行
HAL_UART_RxCpltCallback回调函数。
- 开启了
USART2 global interrupt(USART2 全局中断)。 - 在
main函数前调用HAL_UART_Receive_IT(&huart2, receiveData, 2);启动中断接收(接收长度为2)。 - 在
HAL_UART_RxCpltCallback中,接收到数据后,通过判断receiveData[0]和receiveData[1]的值来控制 LED 灯的亮灭。 - 关键点: 在回调函数末尾,再次调用
HAL_UART_Receive_IT(&huart2, receiveData, 2);,以便开启下一次中断接收。
- 开启了
3. DMA 模式 (Direct Memory Access Mode)
- 原理: 直接内存访问,由 DMA 控制器硬件帮助搬运数据,不需要 CPU 干预,极大减轻 CPU 负担。
- 配置: 需要在 CubeMX 中设置串口的 DMA 通道。
- 函数后缀: 将发送和接收函数的后缀改为
_DMA(例如HAL_UART_Transmit_DMA)。 - 触发机制: 在接收或发送指定长度的数据完成时产生中断。
4. 串口空闲中断 + DMA 接收不定长数据
- 原理: 当串口接收完一帧数据包后,总线出现空闲状态时触发中断。适合接收长度未知的数据包。
- 回调函数: 改为调用
HAL_UARTEx_RxEventCallback回调函数。
- 使用了
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, receiveData, sizeof(receiveData));开启空闲中断接收。 - 在
HAL_UARTEx_RxEventCallback中,Size参数表示实际接收到的数据长度。然后调用HAL_UART_Transmit_DMA(&huart2, receiveData, Size);将接收到的数据发送回去。 - 同样,在回调末尾需要重新开启接收
HAL_UARTEx_ReceiveToIdle_DMA(...)。
- 使用了
- ⚠️ 重要注意事项:
- 在设置完 DMA 模式接收后,必须关闭 DMA 传输过半中断。
__HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT); - 如果不关闭,当接收数据量达到设定缓冲区大小的一半时,也会触发 DMA 中断,进而导致错误地调用
HAL_UARTEx_RxEventCallback函数,造成数据处理提前或逻辑混乱。
- 在设置完 DMA 模式接收后,必须关闭 DMA 传输过半中断。