STM32 使用 DMA+双缓冲 ADC 采样时,如何精确对齐定时器触发与缓冲区切换的时序?

· 1 浏览

回答(4)

若定时器频率较高,可考虑使用双缓冲+乒乓策略,在HT中断处理前半,TC处理后半,并用标志位同步,避免数据覆盖。
电子小兵 · 2026-08-27
可以开启DMA的FIFO并设置突发模式,减少总线竞争,但需确保FIFO大小与缓冲区对齐,否则可能丢失数据。
芯海无涯 · 2026-08-27
建议使用HAL库的HAL_ADC_ConvCpltCallback和HalfConvCpltCallback,但需注意回调中不要调用HAL_ADC_Start_DMA,否则会重置DMA导致时序错乱。
嵌入式老张 · 2026-08-27
核心思路是让DMA在双缓冲模式下自动切换,避免CPU干预造成时序抖动。首先,配置ADC为定时器触发(如TIM1的TRGO),并将DMA设置为循环模式+双缓冲(Memory-to-Peripheral方向,但实际是外设到内存),启用DMA的传输完成中断(TC)和半传输中断(HT)。关键在于:DMA的缓冲区切换由硬件在传输完成时自动执行,无需软件介入,因此定时器触发与切换的时序天然对齐。实操建议:1) 确保DMA的缓冲区地址按32位对齐,且每个缓冲区大小是ADC采样次数×2字节;2) 在HT和TC中断中分别处理前半和后半缓冲区,但不要修改DMA配置,只读取数据;3) 若需精确同步,可启用定时器的更新事件(UEV)来触发ADC,并让DMA的传输完成事件与定时器周期对齐(例如ADC采样次数×触发周期=缓冲区大小),这样每次切换正好发生在定时器周期边界。注意:避免在中断中执行耗时操作,否则可能影响后续触发。
mcuku 阿沐 · 2026-08-27