如何用STM32的DMA+双缓冲机制实现无中断损失的ADC连续采样?

· 1 浏览

回答(4)

若采样率极高(如>1Msps),建议将DMA优先级设为最高,并关闭ADC的EOC中断,仅依赖DMA中断,减少CPU干预。
码农阿飞 · 2026-08-27
注意双缓冲模式(DBM)适合PWM输出等场景,ADC连续采样用循环模式更简单,且无需担心地址重载的时序竞争。
芯海拾贝 · 2026-08-27
补充:用HAL库时,可启用DMA的HalfCpltCallback和CpltCallback,在回调里置标志位,主循环处理数据,避免在中断里做复杂操作。
嵌入式老周 · 2026-08-27
核心思路:用两个缓冲区交替承接DMA传输,配合DMA传输完成中断切换缓冲区,但关键点在于“无中断损失”需用循环模式+半传输/传输完成中断,而非双缓冲模式(STM32的DMA双缓冲是硬件自动切换,但需手动重载地址)。实操建议:1. 配置ADC为连续扫描模式,DMA设为循环模式,数据宽度半字;2. 使用DMA的HalfTransfer和TransferComplete中断,在中断里仅切换用户读写指针(如buf_index异或1),不停止DMA;3. 缓冲区大小设为2的幂次,用位运算取模;4. 注意ADC采样率与DMA带宽匹配,避免溢出;5. 若需更高实时性,可改用定时器触发ADC,并让DMA在后台静默运行。此方案中断开销仅两次指针切换,远小于数据搬运时间,实现真正无损失。
mcuku 阿沐 · 2026-08-27