如何解决STM32定时器中途重启设置新值后定时异常问题?
定时器手动重启后延时异常的解决办法
当前定时器的中断处理逻辑为:每次触发中断时先停止定时器,更新预分频值与自动重载值,清除更新标志后重启定时器。该逻辑在正常中断流程下运行正常,但手动在定时器溢出前停止并重启时,会延续上次剩余的延时——例如原设置15秒延时,运行1秒后停止并改为1秒延时,重启后却需等待约13秒才触发中断,而非预期的1秒。
问题根源
手动停止定时器时,定时器的**计数器(CNT)**并未自动清零,仍保留着上次运行到的数值。重启后,计数器会从这个残留值开始,继续计数到新设置的自动重载值(ARR),实际延时为(新ARR - 残留CNT) / (时钟频率/预分频),而非预期的新ARR / (时钟频率/预分频)。
修复方案
在更新定时器参数后,添加清零计数器的操作,确保重启时计数器从0开始计数。修改后的代码如下:
HAL_TIM_Base_Stop_IT(&htim); // do stuff __HAL_TIM_SET_PRESCALER(&htim, new_p); __HAL_TIM_SET_AUTORELOAD(&htim, new_a); __HAL_TIM_SET_COUNTER(&htim, 0); // 新增:强制清零计数器 __HAL_TIM_CLEAR_FLAG(&htim, TIM_FLAG_UPDATE); HAL_TIM_Base_Start_IT(&htim);
补充说明
- 清零计数器的操作也可以放在
HAL_TIM_Base_Stop_IT之后,只要保证在调用HAL_TIM_Base_Start_IT前完成即可。 - 若定时器启用了自动重载缓冲(ARPE位置1),需确认参数更新的时机,但核心问题仍由计数器残留值导致,清零操作可通用解决该类问题。
内容的提问来源于stack exchange,提问作者user3157047
相关产品推荐
相关产品推荐

