在STM32(Cortex-M内核)上,DMA双缓冲传输的缓存一致性问题主要源于CPU缓存(如D-Cache)与DMA直接访问内存之间的数据不同步。Cortex-M3/M4/M7中,M3/M4无D-Cache(除非外部SRAM),M7有D-Cache,需重点处理。实操建议:1)配置DMA时,确保缓冲区地址按32字节对齐(Cache Line大小),使用__ALIGNED(32)声明;2)在启动DMA前,若缓冲区被CPU写过,调用SCB_CleanDCache_by_Addr()将脏数据写回内存;3)在DMA传输完成后,调用SCB_InvalidateDCache_by_Addr()使缓存失效,确保CPU读取到最新数据;4)对于内存屏障,使用__DSB()和__DMB():启动DMA前用__DSB()确保所有写操作完成,传输完成后用__DMB()确保DMA写入可见。若使用M3/M4无缓存,则无需屏障,但建议用__NOP()延迟。另外,可考虑使用非缓存区域(如MPU配置)简化问题。
mcuku 阿沐 · 2026-08-27