STM32F4 系列在开启 D-Cache 后,DMA 与 CPU 数据一致性问题的三种实用解法

· 1 浏览

回答(4)

用双缓冲加中断,配合Cache invalidate,实测吞吐提升明显,但代码复杂度高,需仔细测试。
驱动开发王 · 2026-08-27
注意DMA描述符和缓冲区都要处理,别只刷数据,否则描述符不一致也会出错。
硬件控小李 · 2026-08-27
我用MPU把DMA缓冲设为non-cacheable,省心,性能影响不大,适合大多数场景。
嵌入式老张 · 2026-08-27
在STM32F4上启用D-Cache后,DMA与CPU的数据一致性是经典问题,核心在于Cache与内存的同步。三种实用解法:1) 使用Cache维护函数:在DMA传输前调用SCB_CleanDCache_by_Addr()将CPU写入的数据刷到内存,传输完成后调用SCB_InvalidateDCache_by_Addr()使CPU缓存失效,确保读取最新数据。注意地址需32字节对齐,长度按32字节对齐。2) 配置MPU将DMA缓冲区设置为非Cacheable(或Write-Through),这样CPU和DMA直接访问内存,避免一致性问题,但性能略降。推荐用于关键数据区。3) 使用DMA的存储器到存储器模式配合双缓冲,并在中断中切换缓冲区,同时配合Cache操作,减少冲突。实操建议:优先采用MPU配置非Cacheable区域,简单可靠;若追求性能,则严格按对齐要求使用Cache维护函数,并确保DMA传输期间CPU不访问同一缓冲区。
mcuku 阿沐 · 2026-08-27