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

STM32L0运行中修改TIM2预分频器如何让新配置立即生效

问题根源

STM32定时器的预分频器(PSC)内置硬件影子寄存器,调用__HAL_TIM_SET_PRESCALER写入的数值只会存入预装载寄存器,必须等待更新事件(UEV)产生时,才会被加载到实际工作的影子寄存器中生效。默认状态下更新事件仅在计数器上溢/下溢时触发,这就是修改配置后无法立即生效的原因。

立即生效的实现方案

修改预分频值后手动触发一次更新事件即可让新配置立即生效,根据是否开启更新中断分两种处理方式:

1. 未开启TIM2更新中断,或允许本次操作触发更新中断

直接调用HAL库事件生成函数即可,代码示例:

// 写入新的预分频值
__HAL_TIM_SET_PRESCALER(&htim2, newValue);
// 手动触发更新事件,立即加载新配置
__HAL_TIM_GENERATE_EVENT(&htim2, TIM_EVENTSOURCE_UPDATE);

2. 已开启TIM2更新中断,且不希望本次操作触发中断回调

需要临时屏蔽更新中断,触发事件后清除对应的中断标志,再恢复中断即可:

// 临时关闭TIM2更新中断
__HAL_TIM_DISABLE_IT(&htim2, TIM_IT_UPDATE);
// 写入新的预分频值
__HAL_TIM_SET_PRESCALER(&htim2, newValue);
// 手动触发更新事件加载配置
__HAL_TIM_GENERATE_EVENT(&htim2, TIM_EVENTSOURCE_UPDATE);
// 清除本次触发产生的更新中断标志
__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);
// 恢复TIM2更新中断
__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE);

注意事项

手动触发更新事件的同时,也会将自动重装载寄存器(ARR)的预装载值同步加载到影子寄存器,如果你同时修改了ARR配置也会同步生效,符合常规开发需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:36:00