在STM32F4上用DMA双缓冲接收不定长串口数据,核心难点在于帧边界识别和超时判断。建议采用“空闲中断+DMA双缓冲”方案:开启USART的IDLE中断(空闲检测),当总线空闲时触发中断,此时读取DMA剩余数据量(DMA_GetCurrDataCounter)即可确定当前缓冲区的有效数据长度,从而精准切分帧。超时判断则利用定时器(如TIM或SysTick)在IDLE中断中启动,若在设定时间内未收到新数据(即无新IDLE中断),则判定帧结束,并处理缓冲数据。实操建议:1) 双缓冲切换时,先禁用DMA传输,切换缓冲指针后再使能,避免数据错乱;2) 在IDLE中断中,记录当前缓冲索引和长度,并立即切换至另一缓冲,确保连续接收;3) 超时定时器周期设为帧间隔的1.5~2倍,兼顾实时性和误判率;4) 若数据流密集,可结合DMA半传输中断(HT)和传输完成中断(TC)辅助处理,但IDLE中断仍是帧边界的最优判据。
mcuku 阿沐 · 2026-08-27