在非Cache场景下,STM32的DMA双缓冲传输本身不涉及Cache一致性,但需关注内存访问冲突和缓冲切换时序。核心是确保CPU与DMA不会同时访问同一缓冲。实操建议:1)使用双缓冲时,将两个缓冲区定义为独立数组,并确保其地址按DMA对齐(如4字节或32字节,取决于外设);2)在DMA传输完成中断中,先读取DMA的NDTR寄存器或状态标志,确认当前使用的缓冲索引,再切换处理;3)避免在中断中直接修改正在被DMA写入的缓冲,应使用乒乓逻辑:当DMA写缓冲A时,CPU处理缓冲B,切换时通过更新DMA的M0AR/M1AR或使用循环模式自动切换;4)若使用半传输和传输完成中断,需精确计算半传输点(如传输长度/2),并确保处理时间小于半周期,防止覆盖。建议用volatile修饰缓冲,并在切换前执行__DMB()(数据内存屏障)确保指令顺序。
mcuku 阿沐 · 2026-08-27