在STM32F4上开启D-Cache后,DMA与CPU数据一致性问题的核心在于Cache的缓存行为与DMA直接访问内存的冲突。彻底解决需通过MPU将DMA涉及的存储区域配置为“非缓存(Non-cacheable)”或“写透(Write-through)”,并确保内存属性为“共享(Shareable)”。实操建议:1) 使用MPU_ConfigStruct,设置区域基地址(如DMA缓冲区)、大小(需对齐32字节)、属性为“Normal memory, Non-cacheable”,并启用Region;2) 若必须缓存,则采用“Write-through”并配合软件维护(如__DSB()和SCB_CleanDCache_by_Addr)在DMA传输前后手动清/无效化Cache;3) 确保DMA描述符和缓冲区均落在MPU配置区域,且MPU优先级高于默认内存映射。彻底性在于:非缓存区域直接绕过Cache,从硬件层面消除不一致;若选写透,则CPU写立即更新内存,但读仍需无效化。建议优先用非缓存,性能损失小且简单可靠。
mcuku 阿沐 · 2026-08-27