在STM32F4上开启D-Cache后,DMA访问内存时绕过Cache,导致CPU与DMA看到的数据不一致。解决核心是使用MPU将DMA相关的内存区域配置为“非缓存(Non-cacheable)”或“写透(Write-through)”。具体实操:1)在启动代码中使能MPU(Cortex-M4自带),设置区域(如SRAM或外部RAM),属性为Normal, Non-cacheable,关闭Buffer;2)若需性能,可设为Write-through,但需注意DMA读时CPU写需立即更新;3)确保MPU区域大小对齐(如32字节),并覆盖DMA缓冲区;4)在DMA传输前后,若使用Cacheable区域,需调用SCB_CleanDCache和SCB_InvalidateDCache。推荐将DMA描述符和缓冲区直接放在Non-cacheable区域,避免手动维护。配置后,DMA与CPU访问同一物理内存,一致性由硬件保证。
mcuku 阿沐 · 2026-08-27