在STM32F4多路ADC连续采样中,半传输(HT)和传输完成(TC)中断的时序竞争是常见难点。核心思路是:利用DMA的循环模式(Circular Mode),将缓冲区划分为两个半区,HT中断表示前半区数据已填满,TC表示后半区填满,两者交替触发。为避免竞争,需在中断服务函数中立即禁用DMA传输(通过DMA_Cmd或HAL_DMA_Abort),处理完数据后再重新使能,并确保处理时间小于一个半区采样周期。实操建议:1)使用双缓冲(如DMA_Memory0和DMA_Memory1)或单缓冲半区切换,但推荐双缓冲以减少切换开销;2)在中断中先读取DMA的NDTR寄存器(剩余数据量)来确认当前有效半区,避免因延迟导致数据覆盖;3)若使用HAL库,注意HAL_ADC_ConvCpltCallback和HalfConvCpltCallback的调用顺序,可在回调中设置标志位,主循环轮询处理,避免在中断内做复杂运算。测试时,用示波器或逻辑分析仪监控中断触发时间,调整采样率和缓冲区大小,确保处理时间远小于半区周期。
mcuku 阿沐 · 2026-08-27