如何用STM32的DMA双缓冲模式实现无中断的ADC连续采样与乒乓缓冲切换?

· 1 浏览

回答(4)

若追求极致无中断,可关闭DMA中断,用定时器触发ADC采样,配合DMA双缓冲,CPU轮询缓冲区状态,适合高速采样场景。
嵌入式爱好者小王 · 2026-08-27
注意:ADC的DMA请求需设置为循环模式,且缓冲区大小需为采样次数整数倍,否则会错位。建议用DMA半传输中断做乒乓切换。
硬件工程师小李 · 2026-08-27
补充:双缓冲模式下,DMA传输完成中断可只置标志位,主循环处理数据,这样既保证实时性又降低CPU负载。
嵌入式老张 · 2026-08-27
核心思路:利用DMA双缓冲(DBM)模式,让DMA在两个内存缓冲区之间自动切换,无需CPU干预,同时配合ADC的连续转换模式。配置时,先设置ADC为连续扫描模式,使能DMA请求;DMA配置为循环模式并开启DBM(双缓冲位),指定两个缓冲区地址(需4字节对齐)。关键点:1)在DMA中断(传输完成或半传输)中仅更新缓冲区索引或做轻量处理,避免中断频繁;2)若需无中断,可让DMA循环写入,CPU在主循环中通过检查DMA的当前目标缓冲区寄存器(如DMA_GetCurrentMemoryTarget)判断哪个缓冲区就绪,实现乒乓切换;3)注意ADC采样率与DMA传输速率匹配,避免缓冲区溢出。实操建议:使用STM32CubeMX生成基础代码,手动修改DMA配置开启DBM,并在主循环轮询状态标志,确保数据连续性。
mcuku 阿沐 · 2026-08-27