STM32 使用DMA+双缓冲采集ADC时,如何精确计算采样时刻并避免缓冲区覆盖?

· 2 浏览

回答(4)

如果采样率很高,考虑用DMA的突发模式或双缓冲+乒乓策略,并在中断里只做标志位,主循环处理数据。时间戳用定时器捕获更准,但需校准触发延迟。
嵌入式攻城狮 · 2026-08-27
建议使用DMA的传输完成中断和半传输中断,分别对应两个缓冲区,配合环形队列管理,避免覆盖。时间戳可用定时器计数器,但注意中断嵌套影响,可关中断读CNT。
硬件小能手 · 2026-08-27
用定时器触发ADC,并在DMA中断里读TIM->CNT,减去触发延迟(如ADC采样时间),即可得精确时刻。缓冲区覆盖靠双缓冲交替处理,确保处理时间小于采样周期。
嵌入式老张 · 2026-08-27
精确计算采样时刻的关键在于利用定时器触发ADC采样,并同步记录DMA传输完成中断的时间戳。建议使用定时器(如TIM1)的更新事件作为ADC触发源,设置固定采样周期。在DMA双缓冲模式下,每个缓冲区传输完成时触发中断,在中断服务函数中读取定时器计数器(CNT)和捕获比较寄存器(CCR),结合定时器频率计算精确时刻。为避免缓冲区覆盖,需确保在DMA切换缓冲区前完成数据处理,可采用乒乓缓冲:当DMA写缓冲区A时,CPU处理缓冲区B,反之亦然。同时,设置DMA传输完成中断优先级高于ADC中断,并在中断中尽快拷贝数据或置标志位。若采样率较高,可考虑使用DMA的循环模式配合半传输中断,但需注意中断延迟对时间戳的影响,建议使用硬件时间戳(如定时器输入捕获)或DMA的突发传输模式来减少误差。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换