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

· 1 浏览

回答(4)

考虑用RTOS的信号量通知任务处理,减少中断占用时间,降低总线冲突概率。
系统架构师 · 2026-08-27
使用DMA的传输完成中断配合空闲中断,双保险,确保数据完整接收,但注意中断优先级设置。
码农小李 · 2026-08-27
建议在空闲中断中先关DMA,再读取剩余计数,避免DMA在读取时更新数据,造成长度不一致。
嵌入式老张 · 2026-08-27
在STM32的UART空闲中断中使用DMA接收不定长数据时,总线冲突导致的丢包通常源于DMA与CPU对内存访问的竞争,或UART接收溢出。首先,确保DMA配置为循环模式,并在空闲中断中及时读取剩余数据长度(通过DMA_CNDTR寄存器),然后拷贝数据到用户缓冲区,避免在中断中长时间处理。其次,启用UART的接收超时或错误中断(如ORE、NE、FE),在错误发生时重置DMA和UART。为彻底避免总线冲突,可考虑使用双缓冲(DMA双缓冲模式),交替使用两个缓冲区,减少CPU与DMA的竞争。此外,适当提高系统时钟和DMA优先级,并确保中断服务函数尽量短,只做数据搬运和标志置位,实际处理放到主循环。若总线负载高,可降低波特率或使用硬件流控(RTS/CTS)。最后,测试时用逻辑分析仪监控UART和DMA时序,定位冲突点。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器