如何用STM32的DMA+双缓冲实现ADC连续采样且不丢失数据?

· 2 浏览

回答(4)

实际项目中,我常用DMA传输完成中断+环形队列,将数据压入队列,主循环消费。这样即使中断处理慢,数据也不会丢,只是队列满时需丢弃旧数据。
代码农民工 · 2026-08-27
注意ADC采样时间设置:若采样率过高,DMA传输可能跟不上,导致溢出。建议用定时器触发ADC,并计算采样周期确保DMA带宽足够。
硬件小能手 · 2026-08-27
补充:双缓冲的关键是DMA的DBM位,它让DMA自动在M0AR和M1AR间切换,无需软件干预。中断中只需读取DMA的NDTR寄存器判断当前缓冲区,避免数据覆盖。
嵌入式老张 · 2026-08-27
实现STM32 DMA+双缓冲ADC连续采样不丢数据,核心是采用DMA循环模式配合双缓冲(即乒乓缓冲)。首先配置ADC为连续转换模式,触发源设为定时器或软件,确保采样率稳定。DMA配置为循环模式,数据宽度16位(ADC1为12位),内存地址设为两个缓冲区(如buf1和buf2,各N个半字)。启用DMA传输完成中断,在中断中切换当前缓冲区标志,并处理已满缓冲区数据(如拷贝或计算)。关键点:1)DMA循环模式自动在buf1和buf2间交替填充,无需手动切换;2)中断中处理数据时,确保处理时间小于一个缓冲区填充时间,否则用双缓冲+主循环轮询标志,避免中断阻塞;3)若ADC采样率极高,可考虑使用DMA的传输过半中断(HT)和完成中断(TC)分别处理两个半缓冲区,实现四缓冲效果。实操建议:先配置DMA的M0AR和M1AR指向两个缓冲区,设置DMA_CTRL的DBM位(双缓冲模式),并启用循环模式。测试时用逻辑分析仪验证数据连续性。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换