STM32 使用DMA+双缓冲采集ADC时,如何避免缓冲区切换瞬间丢样本?

· 1 浏览

回答(4)

如果用的是STM32H7系列,可启用DMA的burst模式,并配置ADC为overrun检测。若发生overrun,说明切换太慢,需优化中断优先级或改用MDMA级联。
硬核工程师 · 2026-08-27
试试用定时器触发ADC采样,并同步DMA传输,这样采样节奏可控。双缓冲切换时,DMA硬件会自动处理,只要确保中断服务函数不阻塞,丢样本概率极低。
芯海拾贝 · 2026-08-27
用DMA双缓冲时,务必开启DMA的传输完成中断,并在中断里只翻转标志位,数据处理放主循环。若仍丢点,检查ADC的DMA请求是否在采样保持阶段触发,可调整采样时间延长保持窗口。
嵌入式老周 · 2026-08-27
在STM32的DMA+双缓冲ADC采集中,缓冲区切换瞬间丢样本的根因通常是DMA传输完成中断与ADC采样时序竞争。核心解决思路是:确保DMA在ADC采样间隙完成缓冲区指针切换,并利用硬件双缓冲特性(如STM32F4/F7的DMA double buffer mode)自动切换,避免软件干预。实操建议:1)配置DMA为循环模式+双缓冲,使能传输完成中断(TC)和半传输中断(HT),在中断中仅更新数据处理标志,不执行耗时操作;2)将ADC采样率降低至DMA传输带宽的1/3以下,留足切换时间;3)若使用单缓冲手动切换,需在ADC转换结束(EOC)中断中切换,而非DMA中断,并确保切换代码在下一个采样周期开始前完成;4)对于高采样率场景,可改用DMA的FIFO模式或增加缓冲深度(如4缓冲),减少切换频率。实测中,将DMA优先级设为最高,并关闭中断嵌套,可显著降低丢样本概率。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换