在STM32双缓冲DMA中,缓存一致性主要涉及CPU与DMA对同一内存区域的访问冲突。精确处理的关键是:1)确保缓冲区地址对齐到32字节(Cache Line大小),并使用`__ALIGN(32)`声明;2)在DMA切换前,使用`SCB_InvalidateDCache_by_Addr`或`SCB_CleanDCache_by_Addr`操作对应缓冲区,避免脏数据或陈旧数据;3)利用DMA的传输完成中断,在中断中先读取DMA状态寄存器确认传输完成,再切换缓冲区指针,并配合内存屏障(如`__DMB()`)保证顺序;4)若使用双缓冲模式(如DMA_CTRL1),需在初始化时正确配置`DMA_CTRL1`和`DMA_CTRL2`,并在中断中更新当前缓冲区索引。实操建议:优先使用`HAL_DMAEx_MultiBufferStart`,并在回调中处理缓存操作,避免在中断中做复杂逻辑。
mcuku 阿沐 · 2026-08-27