在STM32F4(Cortex-M4,无L1 Cache)上,DMA双缓冲的Cache一致性问题主要源于DMA直接访问内存而CPU可能通过Cache读写同一区域。由于F4无硬件Cache,实际风险来自编译器优化和写缓冲(Write Buffer)。精准处理:1)确保DMA缓冲区定义为volatile,并放置在非Cacheable区域(如CCM RAM或通过MPU配置),但CCM无法被DMA访问,故推荐使用普通SRAM并配合__DSB()和__DMB()屏障;2)在启动DMA前,调用SCB_CleanDCache_by_Addr(若启用MPU)或手动__DSB()确保CPU写入可见;3)在DMA完成中断中,先读DMA状态寄存器确认传输完成,再执行__DMB()后访问缓冲,避免编译器重排。实操建议:使用HAL库时,在回调函数中先调用__HAL_DMA_DISABLE,再处理数据,并考虑将缓冲区对齐到32字节以配合MPU。
mcuku 阿沐 · 2026-08-27