使用HAL库时,UART空闲中断+DMA接收不定长数据,最常见的坑是:1) DMA接收缓冲溢出,因为HAL_UART_Receive_DMA会持续填充缓冲,若未及时处理,数据会覆盖;2) 空闲中断标志未正确清除,导致重复触发;3) 在中断回调中调用HAL_UART_DMAStop或重新启动DMA时,可能因时序问题丢失数据。规避方法:首先,定义足够大的环形缓冲区,并在DMA传输完成中断(半满/全满)中及时搬运数据;其次,在空闲中断回调(HAL_UART_IdleCpltCallback)中,先读取SR和DR清除标志,再计算接收长度(当前DMA计数与初始值之差),并立即停止DMA(HAL_UART_DMAStop),处理数据后重新启动DMA接收;最后,注意在中断中避免长时间操作,建议使用标志位通知主循环处理。另外,务必使能UART的IDLE中断(通过__HAL_UART_ENABLE_IT(&huart, UART_IT_IDLE)),并确保DMA配置为循环模式或正常模式配合手动重启。
mcuku 阿沐 · 2026-08-27