TIM 更新事件软件触发场景
下面结合STM32实际开发场景,分场景讲什么时候必须用软件触发更新事件(写EGR.UG),每个场景配实操例子,很好理解。
1. 改了PSC预分频、ARR自动重装,想立刻生效
TIM的PSC、ARR都带影子寄存器,默认只有硬件溢出才会更新参数。
不写UG:改完ARR/PSC,要等计数器走完当前周期,新频率/周期才生效;
写UG软件更新:参数马上载入影子,波形瞬间切换。
例子: 电机调速、LED呼吸灯动态改频率,不想等一整个周期延迟,改完ARR立刻TIMx->EGR |= TIM_EGR_UG;。
2. 定时器刚初始化,上电统一同步所有影子寄存器
初始化TIM后直接开计数,CNT、PSC、CCR影子寄存器状态不一致,第一波波形容易异常。 初始化末尾手动触发一次UG:
CNT计数器清零
PSC、ARR、所有CCR捕获比较寄存器同步更新 保证上电第一周期波形就正确,无毛刺。
3. 运行中修改PWM占空比,立刻刷新波形
CCR寄存器同样影子缓冲,默认溢出才更新。 比如舵机、电机FOC、调光,实时调节CCR:
TIM_SetCompare1(TIM1, new_ccr); TIM1->EGR |= TIM_EGR_UG; // 立刻更新占空比,不用等溢出4. 需要随时清零计数器CNT(编码器、脉冲计数)
编码器模式、外部脉冲计数模式: 想中途重置计数值,不用等到计数溢出,直接软件UG,CNT马上清零。 适用:限位归零、分段计数、每次采样复位计数。
5. 主动触发更新中断,不用等溢出
开启更新中断UIE后,置UG会直接进更新中断服务函数。 适用场景:
单次定时校准、采样复位;
按键触发一次定时任务,不用等定时器走完周期;
调试时手动进中断测试逻辑。
6. 主从定时器同步,手动统一对齐多路定时器
多TIM主从同步(多路PWM、多路同步采样): 正常靠主定时器硬件溢出同步,若中途需要重新对齐所有定时器,在主TIM软件触发UG,同步信号一次性发给所有从定时器,多路CNT同时清零同步。
7. DMA搬运TIM参数,同步刷新DMA缓冲区
用DMA循环更新ARR/CCR做渐变灯光、阶梯波形时,DMA更新完缓冲区后,软件触发UG,让硬件立刻加载DMA新值,保证波形连贯无跳变。
极简总结使用场景
动态改频率、分频、PWM占空比,需要立即生效;
定时器初始化收尾,同步所有寄存器影子;
编码器/脉冲计数,随时清零CNT;
手动触发一次更新中断,执行单次任务;
多路定时器主从同步、重新对齐;
DMA配合定时器动态输出波形同步刷新。
反过来:如果不需要立刻更新参数、不需要中途清零计数器,只靠定时器自然溢出工作,就完全不用软件触发UG。
