避免缓存区指针错位,核心在于严格管理DMA传输完成中断与缓冲区切换的时序。首先,确保DMA配置为循环模式(Circular Mode)并启用双缓冲(Double Buffer),且两个缓冲区大小必须为ADC数据长度(通道数×采样次数)的整数倍。其次,在DMA传输完成中断(TC)中,不要直接修改DMA的M0AR/M1AR寄存器,而是通过读取DMA_GetCurrentMemoryTarget(或HAL库的HAL_DMA_GetCurrentTarget)判断当前使用的缓冲区,然后仅处理非活动缓冲区。关键点:在中断服务函数中,先禁用DMA中断(或使用临界区),处理完数据后再重新使能,防止中断重入导致指针错位。另外,建议使用volatile修饰缓冲区指针,并确保编译器不优化掉对缓冲区的访问。实操中,可先用单通道验证时序,再扩展多通道。如果使用HAL库,注意在HAL_ADC_ConvCpltCallback中调用HAL_ADC_Start_DMA前,需确保DMA已停止(HAL_DMA_Abort),避免未完成传输时重启。
mcuku 阿沐 · 2026-08-27