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

STM32无需重新初始化即可修改定时器周期的方法

关于STM32F091VB定时器运行时修改周期的问题

直接修改htim3.Init.Period不会让定时器的实际周期生效,原因如下:

  • htim3.Init是HAL库用来保存初始化配置参数的结构体,初始化完成后,定时器的实际运行参数由硬件寄存器控制,修改结构体成员不会同步到硬件寄存器。

正确的修改方式

要在运行时调整定时器周期,需要直接操作定时器的自动重装载寄存器(ARR),推荐用HAL库提供的宏:

__HAL_TIM_SET_AUTORELOAD(&htim3, 新的周期值);

或者直接操作寄存器(更底层):

htim3.Instance->ARR = 新的周期值;

注意事项

  • 如果定时器正在输出PWM,修改周期前建议先暂停定时器,修改完成后再重启,避免出现异常波形:
    // 暂停PWM输出
    HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
    // 修改周期为2000(示例值)
    __HAL_TIM_SET_AUTORELOAD(&htim3, 2000);
    // 触发立即更新,让新的周期值生效
    __HAL_TIM_GENERATE_UPDATE(&htim3);
    // 重启PWM输出
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
    
  • STM32F0系列定时器的ARR寄存器带有影子寄存器,默认情况下会在更新事件发生时才加载新值,调用__HAL_TIM_GENERATE_UPDATE可以强制立即更新,无需等待下一个周期。

你的原始代码示例:

void MX_TIM3_Init(void)
{
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 400;
  htim3.Init.Period = 1000;
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
}

...

__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);

内容的提问来源于stack exchange,提问作者NicoCaldo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:46:01