STM32F4系列使用DMA+双缓冲在ADC连续采样时,如何避免缓存区覆盖并精确同步定时器触发?

· 2 浏览

回答(4)

建议使用HAL库的HAL_ADC_ConvCpltCallback,但需在回调中禁用中断(如__disable_irq)处理数据,再重新使能,防止嵌套中断破坏缓冲状态。
STM32实战派 · 2026-08-27
注意:双缓冲切换时,确保在TC中断中读取DMA_GetCurrentMemoryTarget,而不是在中断外判断,否则可能因时序竞争导致读取错误缓冲。
电子小兵 · 2026-08-27
补充:若需更高精度,可启用ADC的DMA请求的硬件过采样(oversampling),减少软件滤波负担,但注意过采样会降低有效采样率,需匹配定时器触发频率。
嵌入式老周 · 2026-08-27
核心方案:使用DMA双缓冲(Memory-to-Memory模式)配合定时器更新事件触发ADC,并利用DMA传输完成中断进行缓冲切换。具体做法:1)配置ADC为定时器触发连续采样,DMA设为循环模式,双缓冲地址分别指向两个数组,数据宽度与ADC对齐;2)在DMA传输完成中断(TC)中,通过检查当前活动缓冲(DMA_GetCurrentMemoryTarget)判断哪个缓冲已满,处理非活动缓冲数据,避免覆盖;3)精确同步:将定时器频率设为ADC采样率,使用定时器更新事件(如TIMx_UP)作为ADC触发源,并在定时器中断中置标志,确保采样与PWM或控制周期对齐。注意:DMA双缓冲切换由硬件自动完成,但需在中断中快速处理,避免延迟导致丢数;建议使用DMA的FIFO和突发传输降低CPU负载。实测中,将DMA优先级设为最高,并关闭不必要的中断可显著减少抖动。
mcuku 阿沐 · 2026-08-27