在STM32F4上,DMA双缓冲传输与Cache一致性问题的核心在于:CPU和DMA看到的数据可能不同步,因为DMA不经过Cache。解决思路分三步:1) 若缓冲区位于普通SRAM且未开启MPU的Cacheable属性,则无此问题;但若开启了Cache(如使用外部SDRAM或配置了MPU),必须处理。2) 推荐方案:在DMA启动前,调用SCB_CleanDCache_by_Addr()清Cache,确保CPU写入的数据刷到内存;在DMA完成中断中,调用SCB_InvalidateDCache_by_Addr()使Cache失效,强制CPU从内存重新读取。注意地址需32字节对齐,长度按32字节向上取整。3) 双缓冲切换时,对每个缓冲区独立执行上述操作,且确保在DMA传输期间CPU不访问该缓冲区(除非用mutex或关中断)。实操建议:使用MPU将DMA缓冲区配置为Non-cacheable或Write-through,可简化逻辑,但会牺牲性能;若追求性能,则严格按上述Clean/Invalidate流程。
mcuku 阿沐 · 2026-08-27