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

· 1 浏览

回答(4)

如果使用FreeRTOS,确保MPU配置在任务调度前完成,并考虑使用`MPU_Region`属性为`NORMAL_MEMORY`且`CACHEABLE=0`,避免系统级问题。
RTOS爱好者 · 2026-08-27
注意:MPU配置需在`SCB_EnableDCache()`之前调用,否则无效。另外,DMA2D等外设也需同样处理。
硬件小张 · 2026-08-27
补充:也可以使用`SCB_EnableDCache()`后,通过`SCB_CleanDCache_by_Addr()`精确操作,但MPU配置更彻底,推荐用于DMA频繁场景。
嵌入式老周 · 2026-08-27
在STM32F4上启用D-Cache后,DMA访问内存时绕过Cache,导致CPU与DMA看到的数据不一致。解决核心是配置MPU将DMA使用的内存区域设为非Cacheable(或Write-Through)。具体操作:1)使用`MPU_Config()`函数,选择内存区域(如SRAM),设置`MPU_REGION_SIZE`、`MPU_REGION_ENABLE`,属性设为`MPU_ACCESS_BUFFERABLE`(非Cacheable)或`MPU_ACCESS_WRITE_THROUGH`(Write-Through)。2)确保DMA描述符和缓冲区位于该区域,且MPU区域覆盖完整。3)在DMA传输前后,若使用Cacheable区域,需调用`SCB_CleanDCache()`和`SCB_InvalidateDCache()`。4)注意MPU配置需在启用Cache前完成,且区域优先级设置正确。实操建议:优先将DMA缓冲区放在独立SRAM区并配置为非Cacheable,避免频繁Cache操作,提升实时性。
mcuku 阿沐 · 2026-08-27