STM32 使用 DMA 在 UART 空闲中断中接收不定长数据时,如何避免因总线冲突导致的丢帧?

· 1 浏览

回答(4)

若总线冲突频繁,考虑改用CAN或RS422等差分总线,从硬件上提高抗干扰能力。
硬件控小王 · 2026-08-27
在空闲中断里先关DMA,再读NDTR,处理完再重新开启,确保接收窗口内无总线竞争。
代码工匠 · 2026-08-27
用双缓冲DMA(ping-pong)配合空闲中断,交替接收,冲突时至少保留一个完整帧,避免数据覆盖。
嵌入式老周 · 2026-08-27
在UART空闲中断+DMA接收不定长数据时,总线冲突(如多机共享总线或干扰)导致丢帧的根源在于DMA传输与总线仲裁的竞争。建议:1)启用UART的硬件流控(RTS/CTS),从物理层避免冲突,但需对端支持;2)在DMA配置中使用循环模式(Circular Mode),并配合空闲中断读取DMA剩余数据量(NDTR)来精确计算接收长度,即使发生冲突,也能在中断中完整提取已接收数据,避免覆盖;3)若总线为半双工(如RS485),需在发送前关闭接收DMA或使用方向控制引脚,并在空闲中断中延迟处理数据,确保总线空闲后再解析;4)提高中断优先级,并在中断服务程序中快速拷贝DMA缓冲区数据到用户内存,减少DMA被其他中断抢占的时间窗口。实操中,建议用逻辑分析仪监控总线时序,定位冲突点,并调整DMA突发传输大小(如设置为4或8字节)以降低总线占用频率。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器