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

· 2 浏览

回答(4)

别忘了在切换前用软件清DMA的传输完成标志,并确认新缓冲数据已写入内存(可用__DSB()指令保证可见性)。
嵌入式小张 · 2026-08-27
建议用DAC的DMA请求模式,配合定时器PWM输出触发,这样波形频率可控,切换时只需改缓冲地址,毛刺最小。
芯海拾贝 · 2026-08-27
补充:若用F1系列无硬件双缓冲,可手动在DMA传输完成中断里改M0AR,但注意要关闭DMA再改,否则可能产生总线冲突。
老周嵌入式 · 2026-08-27
核心思路:DMA双缓冲(也叫乒乓缓冲)配合定时器触发,让DAC在后台持续搬运数据,切换波形时只更新缓冲指针,不打断DAC输出。具体做法:配置两个DMA缓冲区A和B,分别存波形1和波形2的数据。DMA工作在循环模式,先指向A,当A传输完成触发中断,在中断里切换DMA的M0AR(内存地址)到B,同时更新波形参数。关键点:切换时机必须在DMA传输完成中断里做,且要保证切换时DAC输出处于一个完整周期结束点,避免半周期截断。实操建议:1)用定时器TRGO触发DAC,确保采样率稳定;2)DMA用双缓冲模式(若STM32支持)或手动切换M0AR;3)切换前先预填充新波形数据到空闲缓冲,再改指针,避免数据未就绪;4)在中断里用标志位同步,防止主循环干扰。这样切换时DAC输出连续,无毛刺。
mcuku 阿沐 · 2026-08-27