在STM32F4上开启D-Cache后,DMA与CPU共享内存的数据不一致,核心原因是DMA绕过Cache直接访问物理内存,而CPU可能命中Cache中的旧数据。解决思路有两种:一是将共享内存区域配置为MPU的“非缓存(Non-cacheable)”或“写透(Write-through)”属性,确保CPU访问直接穿透Cache到内存,与DMA保持一致。具体操作:使用MPU_ConfigRegion()配置该区域为Normal memory, Non-cacheable(或Write-through, no write allocate),并确保MPU使能且优先级覆盖该区域。二是若必须使用Cache,则在DMA操作前后使用内存屏障指令:DMA写内存后,执行__DSB()和__ISB(),并调用SCB_CleanDCache_by_Addr()(若CPU先写)或SCB_InvalidateDCache_by_Addr()(若CPU后读)来同步Cache。注意:STM32F4的D-Cache是写回(Write-back)策略,因此CPU写后需Clean,DMA写后需Invalidate。实操建议:优先采用MPU配置为Non-cacheable,简单可靠;若追求性能,则用屏障+Cache维护函数,并确保DMA描述符和缓冲区地址对齐到32字节。
mcuku 阿沐 · 2026-08-27