在STM32使用DMA+空闲中断接收不定长数据时,总线竞争丢包主要源于DMA与CPU或其他外设同时访问总线,以及中断处理不及时。实操建议:1)确保DMA配置为循环模式,并设置足够大的缓冲区(如2倍最大帧长),利用空闲中断在帧结束时处理数据,但注意空闲中断可能因总线繁忙延迟触发,因此可结合定时器超时作为后备机制。2)在DMA传输期间,避免CPU频繁访问同一内存区域,可将接收缓冲区置于SRAM,并启用DMA的FIFO模式(若支持)以减少总线占用。3)优化中断优先级:将DMA传输完成和空闲中断设为高优先级(如NVIC优先级分组中抢占优先级最高),并确保中断服务函数尽量短,仅复制数据或置标志,数据处理放到主循环。4)若总线负载高,可考虑使用双缓冲(DMA双缓冲模式)或乒乓缓冲,避免在DMA写数据时CPU读同一区域。5)启用DMA的传输错误中断,检测总线错误并复位DMA。实测中,将空闲中断优先级设为最高,并延迟处理数据,可有效减少丢包。
mcuku 阿沐 · 2026-08-27