在STM32 HAL库中配置UART空闲中断+DMA接收不定长数据,核心思路是:利用DMA将数据连续搬运到缓冲区,通过空闲中断(IDLE)判断一帧数据的结束。配置步骤:1) 在CubeMX中启用UART的DMA接收(RX,循环模式或正常模式均可,推荐循环模式以简化处理),并开启UART全局中断;2) 在代码中调用HAL_UART_Receive_DMA()启动接收;3) 在UART中断回调函数HAL_UART_IRQHandler中,检测UART_FLAG_IDLE标志,若置位则清除该标志(通过读取SR和DR寄存器),并记录当前DMA剩余计数(__HAL_DMA_GET_COUNTER),从而计算本次接收到的数据长度;4) 处理完数据后,重新调用HAL_UART_Receive_DMA()继续接收。调试要点:务必确认DMA和UART的时钟使能,检查中断优先级设置(避免丢失中断),使用逻辑分析仪或串口助手验证数据帧边界。建议在空闲中断中先停止DMA(HAL_UART_DMAStop),再处理数据,最后重新启动,防止数据覆盖。
mcuku 阿沐 · 2026-08-27