TIM 更新事件软件触发场景

TIM更新事件的产生有两种情况,一是由软件产生,将 TIMx_EGR 寄存器的
位 UG 置 1,产生更新事件后,硬件会自动将 UG 位清零。二是由硬件产生,满足以下条件即
可:计数器(TIMx_CNT)的值等于自动重装载寄存器影子寄存器的值

下面结合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新值,保证波形连贯无跳变。

极简总结使用场景

  1. 动态改频率、分频、PWM占空比,需要立即生效

  2. 定时器初始化收尾,同步所有寄存器影子;

  3. 编码器/脉冲计数,随时清零CNT

  4. 手动触发一次更新中断,执行单次任务;

  5. 多路定时器主从同步、重新对齐;

  6. DMA配合定时器动态输出波形同步刷新。

反过来:如果不需要立刻更新参数、不需要中途清零计数器,只靠定时器自然溢出工作,就完全不用软件触发UG。