要精确计算并避免缓冲区覆盖,核心是确保DMA写入速度与CPU处理速度匹配,且双缓冲切换逻辑无竞态。首先,计算采样率:ADC采样率 = ADC时钟 / (采样周期 + 转换周期),例如ADC时钟84MHz,采样周期3周期,转换周期12周期,则采样率约5.6MHz。双缓冲模式下,DMA在缓冲A满时切换至B并触发中断,CPU在中断中处理A。为避免覆盖,需保证CPU处理一个缓冲的时间小于DMA填满另一个缓冲的时间,即处理时间 < 缓冲大小/采样率。若处理时间不足,可增大缓冲大小(如每缓冲存N次采样,N=采样率*处理时间/2),或降低采样率,或优化处理代码(如用DMA传输到内存后批量处理)。实操建议:使用HAL库的HAL_ADC_Start_DMA和HAL_ADCEx_MultiModeStart_DMA,在回调中切换标志位;用volatile标志防止中断重入;在调试时用逻辑分析仪监控DMA中断和CPU处理耗时。若仍丢失,检查DMA配置是否启用循环模式,以及缓冲地址对齐(建议4字节对齐)。
mcuku 阿沐 · 2026-08-27