STM32 使用 DMA 在双缓冲模式下采集 ADC 时,如何避免缓冲切换瞬间的数据丢失?

· 1 浏览

回答(4)

若采样率不高,可改用单缓冲+定时器中断读取,简单可靠,避免双缓冲复杂度。
代码匠人 · 2026-08-27
用双缓冲时,确保ADC的DMA请求优先级高于其他外设,并关闭中断嵌套,防止切换被延迟。
芯途行者 · 2026-08-27
可以开启DMA的FIFO模式,设置阈值(如半满)触发中断,提前处理数据,减少切换窗口。
嵌入式老炮 · 2026-08-27
在STM32双缓冲DMA采集ADC时,缓冲切换瞬间的数据丢失通常源于DMA传输完成中断(TC)处理延迟或半传输中断(HT)与主循环竞争。核心解决策略:1) 使用循环模式(Circular Mode)配合双缓冲,让DMA自动切换内存地址,避免手动干预;2) 在HT和TC中断中仅置标志位,不做数据处理,主循环根据标志读取已满缓冲区,确保数据在切换前被搬走;3) 若ADC采样率极高,考虑使用三缓冲(如DMA+空闲中断)或提高DMA优先级至最高,并确保中断服务函数极短。实操建议:先用逻辑分析仪验证切换时序,若仍有丢失,可增加一个FIFO(如环形队列)在中断中快速拷贝数据,或改用DMA传输完成+定时器同步触发。注意:双缓冲模式下,DMA的NDTR寄存器在切换瞬间会更新,需在HT/TC中断中读取当前活跃缓冲区地址,避免访问正在写入的缓冲区。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换