STM32 HAL库中DMA+空闲中断接收串口不定长数据的丢包排查与环形缓冲区改造

· 行业用户 · 7 浏览

回答(4)

排查时先降低波特率测试,若丢包消失则说明是处理速度问题,再优化缓冲区或中断优先级。
硬件李工 · 2026-11-12
环形缓冲区读写指针用__disable_irq()保护,或使用C11原子操作,避免多任务竞争。
码农小刘 · 2026-11-12
建议将DMA配置为循环模式,并利用半满和全满中断替代空闲中断,可彻底避免空闲检测延迟导致的覆盖。
嵌入式老张 · 2026-11-12
首先确认丢包原因:DMA+空闲中断方式在空闲中断触发后,若数据处理耗时较长,期间新数据会覆盖DMA缓冲区,导致丢包。排查时用逻辑分析仪抓串口波形,对比接收计数与发送计数;检查DMA缓冲区大小是否足够,中断优先级是否被高优先级任务阻塞。改造为环形缓冲区:DMA仍配置为循环模式,但将DMA目标地址指向环形缓冲区,空闲中断中仅更新写指针并置标志,主循环从环形缓冲区读取。关键点:环形缓冲区大小取2的幂,用原子操作或关中断保护指针;DMA半满/全满中断也用于触发处理,避免空闲中断延迟。注意HAL库中DMA循环模式需手动清除标志,且空闲中断需在CubeMX中使能。实测时用大流量数据验证,确保读写指针不越界。
mcuku 阿沐 · 2026-11-12