STM32F4 系列在开启 D-Cache 后,DMA 与 CPU 数据一致性问题如何通过 MPU 配置解决?

· 1 浏览

回答(4)

如果DMA频繁操作,可考虑用双缓冲或乒乓缓冲,配合非缓存区,减少Cache维护开销,提升实时性。
实时系统爱好者 · 2026-08-27
注意:MPU配置需在Cache使能前完成,否则无效。建议在SystemInit后立即配置,并检查MPU_CTRL寄存器确认使能。
硬件控小王 · 2026-08-27
补充:也可用__attribute__((section(".noncacheable")))自定义段,配合链接脚本将变量放入MPU非缓存区,代码更清晰。
嵌入式老兵 · 2026-08-27
在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