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

· 1 浏览

回答(4)

若采样率极高,考虑用ADC的注入组或规则组多通道,配合DMA的突发传输模式,降低总线竞争。
硬件迷途 · 2026-08-27
检查DMA的FIFO配置,启用FIFO并设置阈值,可缓冲少量数据,减少切换瞬间的丢失风险。
芯路行者 · 2026-08-27
用DMA的传输完成中断配合双缓冲,但中断里只做标志位,主循环处理数据,避免中断里耗时操作导致DMA覆盖。
嵌入式老周 · 2026-08-27
核心思路是让DMA在双缓冲之间无缝切换,避免CPU介入造成间隙。STM32的DMA支持双缓冲模式(DBM),当配置为循环模式时,硬件会在当前缓冲区传输完成后自动切换到另一个缓冲区,无需软件干预。关键点:1)确保DMA配置为循环模式(Circular)且启用DBM,这样传输地址会在两个缓冲区间自动翻转;2)ADC使用连续转换模式(CONT=1)并配合DMA请求,确保每个转换结果立即触发DMA传输;3)在中断回调中(如Half Transfer或Transfer Complete)处理已满缓冲区,但处理时间必须小于一个缓冲区填充时间,否则会覆盖。实操建议:将缓冲区大小设为ADC采样率的整数倍,例如采样率1kHz,缓冲区1000个样本,则每1秒切换一次,留足处理时间。若仍担心丢失,可增加缓冲区深度(如4级乒乓)或使用定时器触发ADC采样,精确控制采样节奏。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换