在STM32F4上,DMA双缓冲(乒乓)的核心是确保CPU与DMA不会同时访问同一缓冲。精确处理缓存一致性边界需遵循:1) 使用DMA的Memory-to-Peripheral或Peripheral-to-Memory模式,并开启双缓冲(DBM=1),通过DMA_SxNDTR和DMA_SxM0AR/M1AR自动切换;2) 在每次DMA传输完成中断(TC)中,先读取DMA_SxNDTR确认当前活动缓冲,再处理已完成缓冲(非活动缓冲),避免CPU访问正在被DMA写入的缓冲;3) 若涉及CPU修改缓冲(如填充发送数据),需在启动DMA前调用__DSB()和__DMB()确保写操作完成,并在DMA完成后使用__DMB()再读取,防止乱序;4) 对于接收场景,建议将缓冲定义为volatile,并在中断中先禁用DMA(清EN位)再切换缓冲,处理完后再使能,确保边界清晰。实操中,用双缓冲时,CPU只操作“空闲”缓冲,DMA只操作“活动”缓冲,通过状态标志(如半传输中断)同步,避免缓存一致性问题。
mcuku 阿沐 · 2026-08-27