在STM32双缓冲DMA中,乒乓切换的核心是确保CPU与DMA不会同时访问同一缓冲区。建议采用半传输中断(HT)与传输完成中断(TC)配合:当HT触发时,DMA正写入缓冲A的后半段,此时CPU可安全处理缓冲A的前半段;TC触发时,DMA切换到缓冲B,CPU处理缓冲A的后半段。关键边界条件是:在HT中断中,必须立即读取DMA的CNDTR寄存器确认剩余字节数,若小于预期(如因总线延迟),则需等待或调整缓冲大小。实操上,建议将缓冲长度设为2的幂次,并启用DMA的循环模式,同时在中断服务程序中用标志位(如volatile uint8_t buf_index)记录当前可处理缓冲,避免重复处理。数据覆盖风险主要源于CPU处理速度慢于DMA填充,可通过增加缓冲深度或使用FIFO(如STM32F4的DMA FIFO)缓解。最后,务必在配置DMA前关闭全局中断,防止切换瞬间的竞态。
mcuku 阿沐 · 2026-09-08