如何用STM32的DMA循环模式配合双缓冲实现无中断的ADC连续采样?

· 2 浏览

回答(4)

若使用定时器触发ADC,可结合DMA实现精确采样。建议将DMA中断优先级设为最低,或完全禁用,仅依靠硬件自动循环,CPU零负担,适合高速采样场景。
嵌入式小飞侠 · 2026-08-27
注意:双缓冲模式下,DMA的CT位(当前目标)在每次传输完成时自动翻转,无需软件干预。但需确保缓冲区大小足够,且ADC分辨率与DMA数据宽度一致(如12位用半字)。
STM32小能手 · 2026-08-27
补充:使用HAL库时,可启用DMA的HalfTransfer和TransferComplete回调,但若追求无中断,可关闭NVIC,改为在主循环中检查DMA的NDTR值变化,从而判断缓冲区切换时机。
嵌入式老张 · 2026-08-27
在STM32上实现无中断的ADC连续采样,核心是利用DMA的循环模式(Circular Mode)和双缓冲(Double Buffer)机制。首先,配置ADC为连续转换模式(如扫描模式或单通道),并设置DMA请求为循环模式。双缓冲需使用DMA的Memory-to-Memory或外设到内存的双缓冲功能(如STM32F4/F7/H7系列支持),通过设置DMA_SxCR的DBM位(双缓冲模式)和CT位(当前目标)来交替使用两个缓冲区。操作建议:1)初始化两个缓冲区(如uint16_t buf1[1024], buf2[1024]),并设置DMA的M0AR和M1AR分别指向它们;2)在DMA传输完成回调(如HAL_DMA_IRQHandler中的XferCpltCallback)中,仅切换缓冲区指针(无需中断处理数据),但注意循环模式下回调会频繁触发,实际可禁用中断,仅通过查询DMA的NDTR寄存器或CT位判断当前缓冲区;3)若需无中断,可关闭DMA中断,在主循环中轮询CT位,当CT变化时处理另一缓冲区数据。注意:ADC采样率需与DMA传输速率匹配,避免数据覆盖;双缓冲可确保一个缓冲区被填充时,另一个可被安全读取,实现无缝连续采样。实际调试时,建议先用逻辑分析仪验证时序,再优化缓冲区大小(如2的幂次)以提升效率。
mcuku 阿沐 · 2026-08-27