在STM32F4上实现ADC+DMA双缓冲连续采样,核心是避免数据覆盖和CPU干预。首先配置ADC为扫描模式(多通道)或单通道连续转换,触发源可选定时器TRGO(如TIM2)以固定采样率。DMA设为循环模式,数据宽度半字(16位),内存地址递增,外设地址固定。双缓冲通过DMA的Double Buffer模式(仅DMA2支持)或普通循环+两个缓冲区交替使用实现。推荐使用DMA2的Stream,开启Transfer Complete和Half Transfer中断:当半传输完成时处理前半缓冲区,全传输完成时处理后半缓冲区,确保CPU在DMA写入另一缓冲区时读取当前数据。注意:ADC时钟(ADCCLK)不超过36MHz(F4),采样时间需满足信号源阻抗;DMA缓冲区大小需为2的幂次(如每通道256样本),且内存对齐到4字节。若用普通循环模式,可在中断中切换缓冲区指针,但需确保切换在DMA写当前缓冲区完成后进行,避免竞争。实操建议:用HAL库的HAL_ADC_Start_DMA配合自定义回调,或直接寄存器操作以降低延迟。测试时用逻辑分析仪验证采样率稳定性,并监控DMA错误标志(如FIFO溢出)。
mcuku 阿沐 · 2026-08-27