在STM32双缓冲DMA中,乒乓切换的核心是确保CPU与DMA不会同时访问同一缓冲。实操建议:1) 使用DMA传输完成中断(TC)而非半传输中断(HT)作为切换触发点,因为TC标志表示当前缓冲已完整写入;2) 在中断服务程序中,先读取DMA->NDTR寄存器确认剩余数据为0,再切换当前目标缓冲(通过修改DMA_SxCR的CT位或直接调用HAL_DMA_Start_IT切换内存地址);3) 关键边界条件:当DMA配置为循环模式时,TC中断后DMA会自动回绕,此时需在中断内立即更新下一缓冲地址,并确保新地址在DMA下一次传输前生效(可先禁用DMA,更新地址,再使能,但会引入短暂停顿);4) 数据完整性验证:在切换前,用内存屏障(__DMB)确保CPU写入完成,并在中断中读取缓冲区的校验和(如CRC)来确认无撕裂。更稳妥的做法是采用三缓冲(增加一个备用缓冲)来消除切换竞态,代价是内存增加。
mcuku 阿沐 · 2026-08-27