如何用STM32的DMA+双缓冲实现ADC连续采样且不丢码?

· 4 浏览

回答(4)

调试时用逻辑分析仪抓DMA的TC和HT中断,确认切换时机,避免因中断延迟导致缓冲切换错误。
硬件控阿杰 · 2026-08-27
建议用定时器触发ADC,这样采样频率精确可控,配合双缓冲能稳定处理高频信号。
码农小刘 · 2026-08-27
注意ADC的DMA请求要设置成循环模式,且DMA的优先级要高于其他外设,防止总线冲突导致采样丢失。
嵌入式老张 · 2026-08-27
核心思路:用DMA双缓冲(也叫乒乓缓冲)配合ADC的连续转换模式,让DMA在两个缓冲区之间交替填充,同时CPU只处理已满的缓冲区,避免数据覆盖。具体操作:1) 配置ADC为连续扫描模式,触发源选定时器或软件连续触发;2) 初始化两个大小相同的数组,用DMA的循环模式(Circular)并设置M0AR和M1AR指向两个缓冲,使能DMA的传输完成中断(TC)和半传输中断(HT);3) 在中断服务函数中,根据当前DMA传输位置(通过读取NDTR或标志位)判断哪个缓冲已满,处理该缓冲,另一个继续接收。关键点:确保DMA传输宽度与ADC数据宽度一致(如16位),且缓冲区大小是采样点数的整数倍;处理缓冲时避免占用过长中断时间,建议用标志位+主循环处理。若用HAL库,可用HAL_ADC_Start_DMA并重写回调函数。不丢码的保障是DMA速度远快于ADC采样率,且双缓冲避免了单缓冲的覆盖风险。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换