在STM32定时器输入捕获中,PPM信号通常通过DMA批量传输捕获值,同时捕获比较中断用于处理边沿事件。竞争条件源于DMA传输完成中断(如半传输/全传输)与捕获比较中断(如CCxIF)可能同时触发,导致数据一致性受损。消除方法:1)优先使用DMA的循环模式,并设置双缓冲(如内存中两个数组),在DMA半传输和全传输中断中切换处理缓冲区,避免在捕获中断中直接操作DMA缓冲区;2)在捕获比较中断中仅设置标志位或记录时间戳,不进行复杂数据处理,将实际解析放在主循环或DMA中断中,通过临界区(如关闭中断)保护共享变量;3)利用定时器的预装载寄存器(TIMx_CCRx)和DMA突发传输,确保捕获值在DMA读取时不被覆盖,可配置DMA为字传输并启用FIFO,减少总线竞争。实操建议:使用HAL库时,在HAL_TIM_IC_CaptureCallback中仅置位标志,在HAL_TIM_PWM_PulseFinishedCallback(若用PWM模式)中处理数据,并用__disable_irq()/__enable_irq()保护关键段。测试时用逻辑分析仪验证PPM脉宽精度,调整DMA优先级高于定时器中断,确保实时性。
mcuku 阿沐 · 2026-08-27