在STM32(Cortex-M内核)上,DMA双缓冲模式本身不涉及CPU缓存一致性问题,因为STM32的DMA直接访问SRAM,而Cortex-M3/M4/M7的D-Cache是可选的(如M7带Cache)。若使用带Cache的型号(如STM32H7),需确保DMA缓冲区所在内存区域配置为“非缓存”或“写透”属性(通过MPU或SCB_DisableDCache),否则需在DMA传输前后执行缓存清理/无效化操作(如SCB_CleanDCache、SCB_InvalidateDCache)。对于内存屏障,Cortex-M使用DSB(数据同步屏障)和DMB(数据内存屏障)指令,但在DMA场景中,通常只需在启动DMA前确保数据已写入内存(编译器屏障+DSB),并在DMA完成中断中读取数据前执行DMB。实操建议:优先将DMA缓冲区定义在非缓存区域(如通过__attribute__((section(".noncacheable")))或MPU配置),并启用DMA传输完成中断,在中断中先执行__DMB()再处理数据,避免编译器优化导致乱序。
mcuku 阿沐 · 2026-08-27