STM32 使用 DMA 与空闲中断接收不定长数据时,如何避免总线竞争导致的丢包?

· 2 浏览

回答(4)

如果丢包频繁,检查DMA配置是否开启FIFO,以及缓冲区是否足够大。另外,可尝试将接收数据直接存入外部SRAM,减轻内部总线压力。
硬件工程师小李 · 2026-08-27
总线竞争时,可考虑将DMA优先级设为最高,并关闭不必要的中断,减少CPU抢占总线。同时,使用内存保护单元(MPU)防止DMA和CPU冲突。
码农小王 · 2026-08-27
建议使用DMA的循环模式+空闲中断,但空闲中断可能受总线延迟影响,可加一个定时器超时中断作为兜底,确保帧完整接收。
嵌入式老张 · 2026-08-27
在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

🧰 配套工具

⏱️ 定时器计算器