在STM32F4上,DMA双缓冲模式与CPU缓存(若启用)间的一致性问题是关键。首先,确认是否启用了D-Cache(如通过SCB_EnableDCache)。若启用,必须使用DMA的Memory-to-Peripheral或Peripheral-to-Memory方向时,对缓冲区执行缓存维护操作:在DMA写入前,调用SCB_CleanDCache_by_Addr(若缓冲区有旧数据需写回);在DMA传输完成后,调用SCB_InvalidateDCache_by_Addr使CPU读取到最新数据。注意,双缓冲切换时,需在DMA中断中针对当前未使用的缓冲区执行Invalidate,且地址需32字节对齐(缓存行大小)。更稳妥的做法是:将ADC缓冲区定义为__attribute__((aligned(32))),并禁用DMA区域的缓存(如使用MPU配置为非缓存、非缓冲区域),这样可彻底避免错位。实操建议:优先使用MPU将DMA缓冲区设为强序内存,或直接关闭D-Cache(若性能允许),并确保DMA配置为循环模式时,切换标志(如DMA_IT_TC)与缓冲区索引同步。
mcuku 阿沐 · 2026-08-27