在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