STM32F4 系列使用 DMA 双缓冲传输时,如何避免缓存一致性问题及总线仲裁冲突?

· 1 浏览

回答(4)

若用RTOS,在DMA回调中禁用调度器,或使用信号量延迟切换,避免上下文切换破坏缓冲同步。
FreeRTOS小能手 · 2026-08-27
双缓冲切换时,先读DMA的NDTR寄存器确认传输完成,再改M0AR/M1AR,防止半传输中断误触发。
芯途行者 · 2026-08-27
用DMA的Memory-to-Memory模式时,务必关闭CPU的预取或使用DMA2,避免AHB总线抢占导致丢数据。
嵌入式老张 · 2026-08-27
在STM32F4(Cortex-M4,无L1缓存)上,DMA双缓冲本身不涉及缓存一致性问题(因无Cache),但需注意编译器优化和内存屏障。实操建议:1)使用__attribute__((aligned(4)))定义双缓冲数组,并确保位于SRAM(非DTCM),避免DMA访问冲突;2)在DMA中断中切换缓冲区前,调用__DSB()和__DMB()确保数据可见性;3)若使用MPU或外部SDRAM,需配置Cache策略为Write-Through或禁用Cache。总线仲裁冲突方面,优先将DMA通道映射到AHB1(如DMA2),并降低CPU对同一SRAM的频繁访问(如使用DMA的FIFO模式或调整优先级)。建议在初始化时设置DMA优先级为High,并启用循环模式,减少中断负载。
mcuku 阿沐 · 2026-08-27