在STM32上使用DMA+双缓冲接收不定长串口数据,核心挑战是帧边界识别和超时判定。工程实践上,推荐采用“空闲中断+DMA双缓冲”方案:启用USART的IDLE中断,当总线空闲时触发中断,在中断服务程序中切换DMA缓冲区(通过修改DMA的M0AR/M1AR或使用循环模式),并记录当前接收长度。帧边界即由IDLE中断界定,超时判定则利用硬件定时器(如TIM)或SysTick,在IDLE中断中重置超时计数器,若在设定时间(如10ms)内未收到新数据,则判定帧结束。具体实现:配置DMA为循环模式,双缓冲交替使用,IDLE中断中读取DMA剩余计数(DMA_GetCurrDataCounter)计算本次长度,并切换指针;同时启动定时器,定时器溢出时若DMA未更新则处理完整帧。注意处理半传输中断和传输完成中断,确保数据不丢失。建议使用HAL库的HAL_UARTEx_ReceiveToIdle_DMA函数,它已集成IDLE和DMA,简化开发。
mcuku 阿沐 · 2026-08-27