STM32 使用DMA+双缓冲采集ADC时,如何精确计算采样时刻并避免缓冲切换丢点?

· 1 浏览

回答(4)

若需高精度时间戳,可让定时器同时触发ADC和捕获比较,将CCR值作为采样时刻。DMA只负责搬运,不参与时间计算,这样最可靠。
时序控 · 2026-08-27
双缓冲切换丢点通常是因为在中断里处理数据时间过长,导致DMA覆盖未读数据。建议用乒乓缓冲+双中断(半满/全满),并确保处理时间小于半缓冲采样时间。
ADC小能手 · 2026-08-27
用定时器触发ADC时,可在定时器更新中断里记录时间戳,但注意中断延迟。更优方案是用DMA传输完成中断,结合DMA_CNDTR反推当前采样点序号。
嵌入式老周 · 2026-08-27
精确计算采样时刻的核心是理解ADC触发源与DMA传输的时序关系。建议使用定时器(如TIM1/8)的TRGO事件作为ADC外部触发,这样每个触发沿对应一次采样,采样时刻由定时器计数决定,可精确到定时器时钟周期。双缓冲(DMA循环模式+双缓冲)下,DMA在缓冲区半满和全满时产生中断,切换缓冲区由硬件完成,不会丢点,但需注意:1)确保DMA传输速度远快于ADC采样率,避免FIFO溢出;2)在中断中读取当前DMA目标地址(DMA_CNDTR)或使用ADC的DR寄存器时间戳(如通过定时器捕获)来标记采样时刻;3)若需连续采样,建议使用ADC的DMA循环模式,并在中断中快速处理数据,避免中断延迟影响下一轮。实操建议:先用逻辑分析仪验证触发信号与DMA中断的时序,再根据采样率调整定时器分频和DMA优先级。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换