2. STM32定时器概述:分类、结构与时钟源

各位同学,咱们今天来聊聊STM32的定时器。说实话,我刚接触STM32那会儿,看到参考手册里定时器那一大堆寄存器,头都大了。但后来我发现,只要把定时器的分类和内部结构搞明白,后面写PWM代码就跟搭积木一样简单。

定时器是STM32里最常用的外设之一。它不仅能计时、计数,还能输出PWM、捕获输入信号。咱们这个项目要用PWM控制舵机,所以定时器是绕不开的核心模块。

2.1 定时器分类:三种定时器,各司其职

STM32的定时器分三类:基本定时器、通用定时器、高级定时器。它们的关系有点像汽车里的手动挡、自动挡和赛车变速箱——功能依次增强,但基础原理相通。

类型 典型型号 主要功能 适用场景
基本定时器 TIM6、TIM7 基础计时、触发DAC 简单延时、定时中断
通用定时器 TIM2~TIM5 计时、PWM输出、输入捕获 舵机控制、电机调速
高级定时器 TIM1、TIM8 全部通用功能 + 互补输出、刹车、死区 电机控制、三相逆变

我个人的习惯是:做舵机控制这类项目,优先用通用定时器。功能够用,配置也不复杂。高级定时器虽然强大,但寄存器多,新手容易踩坑。

小提示: 咱们项目里控制舵机,用通用定时器的PWM输出模式就够了。别一上来就开高级定时器,除非你要控制无刷电机。

2.2 定时器内部结构:拆开看看里面有什么

你想想看,定时器本质上就是个计数器。给它一个时钟源,它就开始数数。数到某个值,就产生中断或者翻转电平。就这么简单。

下面这张图是我自己画的定时器内部结构框图,把核心模块都标出来了。你看一眼就能明白数据是怎么流动的。

STM32通用定时器内部结构框图 时钟源 PSC 预分频器 CNT 计数器 ARR 自动重装载 输出控制 TIMx_CHy 引脚 中断/事件 数据流说明: 时钟源 → PSC分频 → CNT计数 → 与ARR比较 → 输出控制 → 引脚输出PWM 同时CNT计数到ARR时,产生更新事件,触发中断或DMA

这张图里,我重点标出了几个关键模块:

  • 时钟源:定时器工作的心跳,决定了计数速度
  • PSC预分频器:把时钟频率降下来,让定时器跑得慢一点
  • CNT计数器:核心部件,从0数到ARR的值
  • ARR自动重装载:设定计数上限,到了就重新开始
  • 输出控制:决定什么时候输出高电平、什么时候输出低电平

我记得有次做项目,舵机抖得厉害。查了半天,发现是PSC预分频器配置错了,导致PWM频率不对。从那以后,我每次配置定时器都会先算一遍时钟树。

2.3 定时器时钟源:从哪来,到哪去

定时器的时钟源,说白了就是给它提供计数脉冲的源头。STM32的定时器时钟源有几种选择:

  1. 内部时钟(CK_INT):来自APB总线,最常用。咱们项目就用这个。
  2. 外部时钟模式1(TIx):从外部引脚输入脉冲,用于外部事件计数。
  3. 外部时钟模式2(ETR):从专用ETR引脚输入,适合高速外部信号。
  4. 内部触发(ITRx):其他定时器级联,一个定时器触发另一个。

你可能会问:这么多时钟源,我该用哪个?

我的建议是:做PWM输出,直接用内部时钟。简单、稳定、够用。外部时钟和触发模式,等以后做编码器测速或者多定时器同步时再研究。

重点记忆: 通用定时器的时钟频率 = APB总线频率 × 2(如果APB预分频系数不为1)。比如APB1是36MHz,预分频系数为2,那定时器时钟就是72MHz。

2.4 定时器配置的核心参数

配置定时器,其实就是配置三个关键参数。我习惯用这个公式来算:

定时器溢出频率 = 定时器时钟 / (PSC + 1) / (ARR + 1)

其中:
- 定时器时钟:比如72MHz
- PSC:预分频系数,0~65535
- ARR:自动重装载值,0~65535

举个例子。咱们要输出50Hz的PWM信号来控制舵机:

定时器时钟 = 72MHz
目标频率 = 50Hz

假设 PSC = 71,则计数频率 = 72MHz / (71+1) = 1MHz
那么 ARR = 1MHz / 50Hz - 1 = 19999

所以:PSC = 71,ARR = 19999
注意: 我曾经犯过一个低级错误——把PSC和ARR的值搞反了。结果PWM频率完全不对,舵机根本不转。后来我养成了一个习惯:每次配置完定时器,先用逻辑分析仪看看波形,确认频率对了再往下走。

2.5 定时器中断与事件

定时器除了输出PWM,还能产生中断。常见的中断事件有:

  • 更新中断:计数器溢出时触发,也就是CNT数到ARR的值
  • 捕获/比较中断:输入捕获或输出比较时触发
  • 触发中断:外部触发事件时触发

在咱们的舵机控制项目里,主要用更新中断来产生PWM周期,用捕获/比较中断来调整占空比。不过说实话,用中断控制PWM占空比有点大材小用。咱们后面会讲,直接用定时器的PWM模式,硬件自动输出,CPU都不用管。