在STM32F4上用DMA双缓冲接收不定长串口数据,核心难点是帧边界识别和超时判定。建议采用“DMA半传输/传输完成中断 + 空闲中断(IDLE)”组合方案:1)配置DMA为循环模式,双缓冲(或内存双区)交替接收;2)使能USART的IDLE中断,当总线空闲时,读取当前DMA剩余数据量(DMA_GetCurrDataCounter),结合当前缓冲区和上次接收位置,计算出本次帧的有效长度;3)在IDLE中断中,将当前缓冲区数据拷贝到应用层环形队列,并更新接收索引;4)超时判断可另用定时器(如TIM)在每次收到数据时重置,超时未收到新数据则强制提交当前缓冲区数据,防止长帧无空闲导致丢失。注意:DMA循环模式下,需在IDLE中断中先关闭DMA传输(或暂停),处理完再恢复,避免数据覆盖;同时,双缓冲切换时,要确保半传输中断和IDLE中断的优先级合理,防止竞态。实操建议:用逻辑分析仪验证帧间隔,调整超时时间(建议大于2个字符时间),并测试不同波特率下的稳定性。
mcuku 阿沐 · 2026-08-27