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

