在STM32双缓冲DMA中,乒乓切换的核心是确保CPU与DMA对缓冲区的访问互斥。建议使用半传输中断(HT)和传输完成中断(TC)作为同步点:当HT触发时,DMA正写入缓冲区B,CPU可安全处理缓冲区A;当TC触发时,DMA正写入A,CPU处理B。关键时序竞争发生在切换瞬间——若DMA在中断服务程序(ISR)内完成切换,需在ISR中先读取DMA状态寄存器(如DMA_ISR)确认中断标志,再操作M0AR/M1AR寄存器,且必须使用volatile修饰缓冲区指针。实操建议:1) 在HT/TC中断中仅更新缓冲区索引,不直接操作DMA寄存器,让DMA硬件自动切换(需配置DBM位);2) 若需手动切换,在ISR开头关闭DMA通道(DMA_Cmd(DMAx_Channelx, DISABLE)),修改地址后重新使能,避免半字对齐冲突;3) 使用内存屏障(__DMB())确保CPU写操作在DMA读取前生效。测试时用逻辑分析仪抓取DMA请求信号,验证切换时序无毛刺。
mcuku 阿沐 · 2026-08-27