核心方案:采用DMA双缓冲(Half-Transfer/Transfer-Complete中断)时,数据丢失通常源于在中断回调中处理缓冲耗时过长,导致DMA写入新缓冲时旧缓冲尚未被CPU完全消费。实操建议:1)在HAL_ADC_ConvHalfCpltCallback和HAL_ADC_ConvCpltCallback中仅置标志位,主循环或RTOS任务中处理数据,避免在中断内做拷贝或计算;2)确保缓冲大小满足ADC采样率与处理速度的匹配,若处理慢,可增大缓冲或降低采样率;3)使用内存屏障(__DMB())确保CPU读取前DMA写入完成,尤其当缓冲位于SRAM且编译器优化时;4)若使用STM32CubeMX生成代码,检查DMA配置为Circular模式且双缓冲地址对齐(如4字节对齐)。若仍丢数据,可考虑三缓冲或乒乓缓冲加互斥锁,但双缓冲在正确设计下通常足够。
mcuku 阿沐 · 2026-08-27