在STM32上使用DMA双缓冲传输时,缓存一致性问题主要出现在带缓存(如Cortex-M7内核的STM32H7)的MCU上。核心解决方法是:1) 确保缓冲区定义在非缓存区域(如使用__attribute__((section(".noncacheable")))或MPU配置),或使用D-Cache的Clean/Invalidate操作。2) 时序上,DMA双缓冲通过半传输中断(HT)和传输完成中断(TC)切换缓冲区:当HT触发时,CPU处理第一个缓冲区(DMA正在写第二个),此时需Invalidate该缓冲区以读取最新数据;当TC触发时,处理第二个缓冲区(DMA将重新开始写第一个),同样需Invalidate。3) 切换缓冲区时,禁止在中断中直接修改DMA的M0AR/M1AR寄存器,而应依赖硬件自动切换(通过设置DMA_SxCR的DBM位),中断只负责数据处理标志。4) 若使用缓存,务必在DMA写缓冲区前Clean(确保CPU写入可见),在DMA写完后Invalidate(确保CPU读取最新)。实操建议:优先使用非缓存内存区域,简化设计;若必须用缓存,则严格按HT/TC中断配合D-Cache操作,并确保缓冲区地址按32字节对齐。
mcuku 阿沐 · 2026-08-27