2. STM32定时器概述:分类、结构与时钟源
各位同学,咱们今天来聊聊STM32的定时器。说实话,我刚接触STM32那会儿,看到参考手册里定时器那一大堆寄存器,头都大了。但后来我发现,只要把定时器的分类和内部结构搞明白,后面写PWM代码就跟搭积木一样简单。
定时器是STM32里最常用的外设之一。它不仅能计时、计数,还能输出PWM、捕获输入信号。咱们这个项目要用PWM控制舵机,所以定时器是绕不开的核心模块。
2.1 定时器分类:三种定时器,各司其职
STM32的定时器分三类:基本定时器、通用定时器、高级定时器。它们的关系有点像汽车里的手动挡、自动挡和赛车变速箱——功能依次增强,但基础原理相通。
| 类型 | 典型型号 | 主要功能 | 适用场景 |
|---|---|---|---|
| 基本定时器 | TIM6、TIM7 | 基础计时、触发DAC | 简单延时、定时中断 |
| 通用定时器 | TIM2~TIM5 | 计时、PWM输出、输入捕获 | 舵机控制、电机调速 |
| 高级定时器 | TIM1、TIM8 | 全部通用功能 + 互补输出、刹车、死区 | 电机控制、三相逆变 |
我个人的习惯是:做舵机控制这类项目,优先用通用定时器。功能够用,配置也不复杂。高级定时器虽然强大,但寄存器多,新手容易踩坑。
2.2 定时器内部结构:拆开看看里面有什么
你想想看,定时器本质上就是个计数器。给它一个时钟源,它就开始数数。数到某个值,就产生中断或者翻转电平。就这么简单。
下面这张图是我自己画的定时器内部结构框图,把核心模块都标出来了。你看一眼就能明白数据是怎么流动的。
这张图里,我重点标出了几个关键模块:
- 时钟源:定时器工作的心跳,决定了计数速度
- PSC预分频器:把时钟频率降下来,让定时器跑得慢一点
- CNT计数器:核心部件,从0数到ARR的值
- ARR自动重装载:设定计数上限,到了就重新开始
- 输出控制:决定什么时候输出高电平、什么时候输出低电平
我记得有次做项目,舵机抖得厉害。查了半天,发现是PSC预分频器配置错了,导致PWM频率不对。从那以后,我每次配置定时器都会先算一遍时钟树。
2.3 定时器时钟源:从哪来,到哪去
定时器的时钟源,说白了就是给它提供计数脉冲的源头。STM32的定时器时钟源有几种选择:
- 内部时钟(CK_INT):来自APB总线,最常用。咱们项目就用这个。
- 外部时钟模式1(TIx):从外部引脚输入脉冲,用于外部事件计数。
- 外部时钟模式2(ETR):从专用ETR引脚输入,适合高速外部信号。
- 内部触发(ITRx):其他定时器级联,一个定时器触发另一个。
你可能会问:这么多时钟源,我该用哪个?
我的建议是:做PWM输出,直接用内部时钟。简单、稳定、够用。外部时钟和触发模式,等以后做编码器测速或者多定时器同步时再研究。
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
2.5 定时器中断与事件
定时器除了输出PWM,还能产生中断。常见的中断事件有:
- 更新中断:计数器溢出时触发,也就是CNT数到ARR的值
- 捕获/比较中断:输入捕获或输出比较时触发
- 触发中断:外部触发事件时触发
在咱们的舵机控制项目里,主要用更新中断来产生PWM周期,用捕获/比较中断来调整占空比。不过说实话,用中断控制PWM占空比有点大材小用。咱们后面会讲,直接用定时器的PWM模式,硬件自动输出,CPU都不用管。