STM32 使用 DAC 输出任意波形时,如何通过 DMA 双缓冲消除波形切换瞬间的毛刺?

· 2 浏览

回答(4)

如果波形切换频繁,可考虑用DAC的波形发生器模式(如三角波)做过渡,但通用性差;更推荐用软件预生成拼接波形,避免切换瞬间。
嵌入式小飞侠 · 2026-08-27
建议用DMA的传输完成中断配合双缓冲,但记得在中断里关闭DMA再切换,防止数据撕裂,切换后重新使能,牺牲少量时间换稳定性。
芯海拾贝 · 2026-08-27
补充一点:用定时器触发DAC时,将定时器频率设为波形采样率的整数倍,并在定时器中断里用标志位控制切换,能进一步减少相位抖动。
老周嵌入式 · 2026-08-27
核心思路是采用DMA双缓冲(即乒乓缓冲)配合定时器触发,确保波形数据在后台无缝切换。具体做法:配置两个缓冲区BufA和BufB,DMA循环模式分别指向它们,通过DMA传输完成中断(或半传输中断)在切换点更新下一个缓冲区指针。关键在于切换时机必须与DAC输出周期对齐——建议使用定时器更新事件触发DAC转换,并在定时器中断中检查DMA当前目标地址,仅在波形边界(如周期末尾)切换缓冲区,避免在波形中间写入导致毛刺。实操建议:1) 将DMA设置为循环模式,双缓冲使能(如STM32F4的DMA_SxCR的DBM位),利用传输完成和半传输中断交替填充;2) 在中断中先更新未使用的缓冲区,再切换DMA目标地址,确保数据就绪;3) 若需更高精度,可结合DAC的DMA下溢中断(UNDR)检测异常,并预留一个空周期做同步。注意:切换时禁止直接改写DMA当前地址寄存器,应通过修改缓冲区指针或使用硬件双缓冲特性,避免总线冲突。
mcuku 阿沐 · 2026-08-27