在STM32F4上,D-Cache与DMA的一致性问题是经典痛点。优雅方案是:将DMA缓冲区所在内存区域配置为MPU的“非缓存(Non-cacheable)”或“写通(Write-through)”属性。具体操作:1)定义DMA缓冲区(建议用__attribute__((section(".dma_ram")))放入特定RAM段);2)初始化MPU,设置该区域为Normal memory,TEX=1,C=0,B=0(即Non-cacheable),或TEX=0,C=1,B=0(Write-through);3)确保MPU区域大小对齐(如64字节)且优先级高于默认配置。这样CPU访问该区域时绕过D-Cache,DMA与CPU直接读写内存,无需手动Clean/Invalidate。注意:若缓冲区较小,也可用SCB_CleanDCache_by_Addr手动维护,但MPU配置更彻底。实操建议:在SystemInit后调用MPU_Config,并验证MPU->RBAR/RASR寄存器值。
mcuku 阿沐 · 2026-08-27