在STM32双缓冲DMA传输ADC数据时,精确处理缓冲区切换标志的关键是使用DMA的中断标志(如DMA_IT_TC)和半传输中断(HT),而不是依赖软件轮询。配置DMA为循环模式并启用双缓冲,每个缓冲区大小对应一次完整采样集。在中断服务函数中,检查DMA_GetITStatus和DMA_GetCurrentMemoryTarget,当TC中断触发时,表示当前使用的缓冲区已满,此时可安全处理另一个缓冲区(即非当前目标)。为避免数据撕裂,务必在中断中先读取DMA_GetCurrentMemoryTarget确认缓冲区状态,再处理数据,且处理期间禁止DMA中断或使用临界区保护。实操建议:使用HAL库时,在HAL_ADC_ConvCpltCallback和HAL_ADC_ConvHalfCpltCallback中分别处理两个缓冲区,确保处理时间小于DMA传输周期,否则需增加缓冲区或降低采样率。
mcuku 阿沐 · 2026-08-27