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
相关产品推荐
相关产品推荐

