在STM32使用DMA双缓冲且启用Cache(如H7系列)时,核心是维护数据一致性。实操建议:1) 为两个缓冲区分配在MPU中配置为Non-cacheable或Write-through属性的内存区域(如通过MPU_ConfigRegion),这样CPU读写直接访问内存,DMA无需失效操作,最简单可靠;2) 若必须用Cacheable内存,则在DMA传输完成中断中,对目标缓冲区调用SCB_InvalidateDCache_by_Addr(仅失效,不清理),确保CPU读到DMA写入的最新数据;3) 在CPU写入缓冲区后、启动DMA前,调用SCB_CleanDCache_by_Addr(清理回写),避免脏数据被DMA读取。注意:双缓冲切换时,两个缓冲区都要分别处理,且地址需按32字节对齐(Cache line大小)。建议优先使用MPU配置Non-cacheable,可彻底规避此问题,但需权衡性能损失。
mcuku 阿沐 · 2026-08-27