You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:24:27