在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