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

· 1 浏览

回答(4)

若采样率不高,可降低ADC时钟或增加缓冲区深度,让切换时间远小于采样周期,自然规避丢失。
码农阿强 · 2026-08-27
开启ADC的DMA请求,并配置DMA的FIFO(若支持),可缓冲切换瞬间的数据,减少丢失概率。
硬件小白 · 2026-08-27
用环形缓冲区替代双缓冲,DMA写满一半触发中断,CPU处理另一半,切换无间隙,但需保证处理速度。
嵌入式老张 · 2026-08-27
核心思路是让DMA始终有可写的缓冲区,避免切换瞬间ADC数据无处存放。实操建议:1) 使用STM32的DMA双缓冲模式(DBM),配置两个缓冲区,DMA自动在满时切换,无需CPU干预,但需注意切换瞬间可能有一两个样本写入旧缓冲区末尾或新缓冲区开头,若应用允许可忽略;若要求严格,可启用ADC的DMA溢出中断(OVR),在切换时暂停ADC采集,待DMA切换完成再恢复,但会引入短暂采样间隙。2) 更优方案:使用DMA的循环模式+双缓冲(如F4/F7系列),配合定时器触发ADC,让采样率略高于需求,在切换时丢弃边界样本,保证有效数据连续。3) 确保缓冲区大小是ADC数据宽度的整数倍,且DMA配置为半传输和传输完成中断,在中断中处理数据,避免CPU在切换时读写缓冲区。4) 若使用HAL库,注意在回调中及时处理,避免中断延迟导致DMA覆盖。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换