一、前言
学习timer定时器,当时学的时候,我感觉是比较好理解的,只是输出比较、输入捕获那一块有点复杂,当时没理解。现在从数据手册开始学起,跟着铁头山羊过了一遍

定时器类型:

二、时基单元
定时器的核心,最基本的模块。
共有3种计数模式,向上计数,向下计数,中央对齐(计数周期*2)
时钟源:从APB2或者APB1来,看时钟是高级定时器还是通用定时器或者基本定时器。
预分频器、计数器、自动重装载值ARR,重复计数器RCR:自己配置寄存器来写
定时器周期配置公式:T=(时钟周期/(PSC+1))*(ARR+1)
得到周期T后,还得看重复计数寄存器有没有配置,看看是多少个周期产生一次事件/中断。

影子寄存器:用来临时存储你要修改的配置,,比如你配置ARR为9,然后CNT已经计数到7了,如果跟你再这个时候突然修改配置,把ARR修改到2,那么CNT就会因为一直达不到ARR一直加到65535,然后在轮回加到2,导致定时器跑飞,所以影子寄存器就是先存下你即将要修改的值,然后等到一个时钟周期修改之后在更新ARR,PSC与RCR也都有影子寄存器。
三、输出比较OC
其核心就是捕获/比较寄存器CRRx(在输出比较里叫做输出比较寄存器),通过CRRx与CNT的比较,来输出波形。每个通用定时器或者高级定时器有4路的输入捕获或输出比较。

PWM
在输出比较的模式下,CCRx的值设置会影响输出信号的高电平时间,所以在这里CCR也负责修改占空比,这也是PWM信号输出的原理

PWM的8种模式和各种波形输出类型
PWM有8种输出模式,我们主要用到的是PWM1和PWM2模式,其他模式了解一下就行。
PWM互补输出(只有高级定时器 TIM1/TIM8 才有)
OCxRef就是我们配置好时基单元和模式选择之后,产生的波形,但是不是最终的波形,最终的波形是在CHx和CHxN输出的,中间还需要进行处理。
处理其实很简单,就是选择正常输出模式或者选择互补输出模式,在这2个模式的电路里,还有一个2路选择器,用来选择是否取反,最后到达MOE使能位,我们使能某一个输出模式即可输出对应的波形到CHx或CHxN。
CNT vs CCRx → 生成OCxRef → 极性选择 → MOE使能 → CHx / CHxN引脚输出互补波形

四、输入捕获IC(Input capture)
输入捕获的原理
原理很简单,外部信号接到定时器通道引脚,硬件检测到我们设定的边沿(上升沿 / 下降沿),自动把当前 CNT 的计数值锁存进 CCRx,我们读出两次捕获的 CNT,相减,就能算出脉冲宽度或者周期。

输入捕获的内部结构
我们看上面那个图,可以看到通道1和通道2的输入捕获是交叉的,通道3和通道4也是,说明这是两两成一对来使用的。
放大输入捕获内部电路,如下:
输入滤波:其实就是一个滤波器,得到纯净的信号,不用管其原理。
边沿检测:就是选择上升沿脉冲还是选择下降沿脉冲
信号选择:比如一路信号从CH1进入,经过滤波器之后,选择上升/下降沿直接触发,则走的通道就是CH1本来的通道进入CCR1,如果选择的是上升/下降沿间接触发,则走的通道是CH2的通道进入CCR2
分频:如果是1分频,那么每次检测到想要检测的边沿都会触发一次CNT记录到CCRx的流程,如果是2分频,就检测到2次才会,以此类推
举例:
如果我们想测得一个PWM信号的脉冲宽度,就需要检测一个脉冲的上升沿及其下降沿,获得上升沿和下降沿的时间差,即可获得脉冲宽度。
所以我们可以让信号从CH1输入,然后上升沿的检测选择:CH1通道,上升沿脉冲,直接,分频系数1,下降沿的检测,我们选择:CH1通道,下降沿脉冲,间接,分频系数1
然后我们在CCR1和CCR2就能分别获得上升沿时的CNT值和下降沿时的CNT值,其差值就是脉冲宽度。

五、定时器相关寄存器
基本定时器(TIM6、TIM7)
基本定时器就是只有简单的时基单元,只支持向上计数,没有捕获比较通道、没有 OC 输出、没有输入捕获、没有从模式。能产生更新事件、更新中断、更新 DMA 请求、TRGO 同步脉冲,不能输出 PWM、不能做输入捕获。

TIM6和TIM7控制寄存器1(TIMx_CR1)
- 位 0 CEN:计数器开关,1 开启计数,0 停止
- 位 1 UDIS:更新事件禁止,1 屏蔽 UEV,不加载影子寄存器、不置 UIF
- 位 2 URS:更新中断源筛选,1 仅计数器溢出才触发更新中断;0 所有来源都可以
- 位 3 OPM:单脉冲模式,1 溢出后硬件自动停定时器;0 循环连续计数
- 位 7 ARPE:ARR 预装载缓冲,1 写 ARR 要等 UEV 才生效;0 写入立即生效
- 其余位:保留,写 0
CR1 用来控制定时器启停、是否循环、ARR 缓冲、更新事件的产生规则。
常用到以下几位:
- CEN (bit0):启停定时器,必用
- ARPE (bit7):ARR 影子寄存器,PWM 必用
- OPM (bit3):单脉冲模式,需要单次波形才开
- URS (bit2):屏蔽 UG 带来的更新中断,调试 / 同步场景用

TIM6和TIM7控制寄存器2(TIMx_CR2)
配置主模式,选择 TRGO(内部触发输出信号)是什么事件,用来同步别的定时器、触发 DAC

TIM6和TIM7 DMA/中断使能寄存器(TIMx_DIER)
TIM6、TIM7 是基本定时器,没有捕获比较通道 ,所以 DIER 里面只有两个有效位,其余全部保留,和通用定时器差别很大。
- UIE=1:定时器产生更新事件 UEV,**通知 CPU 进中断,**送给 NVIC 的中断请求信号
- UDE=1:定时器产生更新事件 UEV,**通知 DMA 搬运数据,**送给 DMA 控制器的 DMA 请求信号


TIM6和TIM7状态寄存器(TIMx_SR)
TIM6、TIM7 是基本定时器,只有 1 个有效标志位,其余全部保留,和通用定时器不一样。
UIF位用来检测是否产生更新中断,需要手动在中断中写0,防止多次进入中断。

TIM6和TIM7事件产生寄存器(TIMx_EGR)
能够触发更新事件 UEV 的情况有 2 种,
第一种就是 CNT 计数计到了 ARR 的值,下一个时钟触发 UEV,第二种是软件写 EGR.UG=1 手动产生 UEV;
CR1 寄存器中的 URS 这一位,决定的是产生更新事件之后,哪一类 UEV 可以置 UIF、进而产生 DMA 请求或者中断;UDIS 位管的是允不允许产生更新事件 UEV,相当于总开关;DIER 寄存器管的是更新中断、更新 DMA 的使能;SR 寄存器的 UIF 位负责记录符合 URS 规则的更新事件已经发生,进入中断后需要软件写 0 清除。

CNT、PSC、ARR寄存器
存储时基单元的值。



通用定时器
通用定时器 = 基本定时器的时基单元 + 从模式控制器 + 4 路独立捕获 / 比较通道(CH1~CH4)
与基本定时器比较
- 计数模式变多:向上计数、向下计数、中心对齐计数三种都支持
- 有从模式控制器(SMCR 寄存器):可以被外部信号触发、复位、门控、同步
- 4 路捕获比较通道 CH1~CH4 ,每一路都可以二选一配置:
- 输出比较模式:输出 PWM、OC 翻转、单脉冲
- 输入捕获模式:测量脉冲宽度、信号周期
- 标志、中断、DMA 请求种类变多 除了原来的更新 UIF,还有:CC1IF/CC2IF/CC3IF/CC4IF(比较捕获标志)、TIF 触发标志等;DIER 里多了 CCxIE、TIE 等中断使能位。
- **MMS 主模式选择全部 8 个模式都能用:**在CR2的MMS位配置
- 可以单独配置每一路通道的预装载(CCMR 寄存器),PWM 模式里非常常用。
- 有 OC 输出引脚,可以输出 PWM 波形到 IO 口
从模式
SMCR 寄存器控制,大概可以理解成初始化定时器之后,它不会自己先跑起来,而是等一个TRGO触发信号来触发这个定时器。
信号源有:另外一个定时器的(也可以叫做主模式的定时器)TRGO触发源(也就是内部 ITR 信号)、外部 IO 引脚 TI1/TI2。
TI1/TI2就是CH1/CH2输入信号作为触发源,是外部硬件信号触发定时器。
TRGO触发源,内部ITR:每个定时器有 4 个 ITR 通道 (ITR0~ITR3),每个通道在芯片设计时固定连到某个特定定时器的 TRGO 。用的时候通过 TS 从这 4 个里选一个。
| 从定时器 | ITR0 | ITR1 | ITR2 | ITR3 |
|---|---|---|---|---|
| TIM1 | TIM5 | TIM2 | TIM3 | TIM4 |
| TIM2 | TIM1 | TIM8 | TIM3 | TIM4 |
| TIM3 | TIM1 | TIM2 | TIM5 | TIM4 |
| TIM4 | TIM1 | TIM2 | TIM3 | TIM8 |
从模式有以下几种模式:
- 复位:信号来了 → CNT 清零,外部信号一到,计数从头开始,用来同步测量信号的相位。
- 门控:信号高 → 计数;信号低 → 停,测量高电平持续时间。
- 触发:信号来了 → 启动,之后自己随便跑,触发信号只负责 "点火启动一次"
- 单脉冲:信号来了 → 跑一轮,跑完自动停,,输出一段固定宽度脉冲,输出一次就停。
TIMx_CR1 通用定时器控制寄存器 1
与基本定时器相比,通用定时器多了 DIR、CMS 这两个,

DIR:设置计数方向,向上或者向下计数,当计数器配置为中央对齐模式或编码器模式时,该位为只读。
CMS1:0:选择中央对齐模式,默认是00,即不使用中央对齐模式。
中央对齐模式有3种。
配置成01:意思是输出比较时,只有在向下计数时,当CCR=CNT时,会触发OCxREF翻转
配置成10:意思是输出比较时,只有在向上计数时,当CCR=CNT时,会触发OCxREF翻转
配置成01:意思是输出比较时,向下计数或向上计数时,CCR=CNT时,就会触发OCxREF翻转
控制寄存器****2(TIMx_CR2)
和基本定时器对比,最大区别:基本定时器的 MMS只有 3 个模式,通用定时器 MMS 全部 8 种模式都开放可用;其余新增位是 CCDS、TI1S、OISx

MMS:MMS的功能就是,,主定时器什么时候作为触发输出(TRGO),基本定时器只有三种,通用定时器有8种。
| MMS2:0 | 名称 | 主定时器什么时候输出 TRGO |
|---|---|---|
| 000 | 复位 | 复位事件发生时输出 TRGO |
| 001 | 使能 | CEN 写 1、定时器开始计数的瞬间输出 TRGO |
| 010 | 更新事件 (UEV) | 更新事件发生时输出 TRGO(TIM6 也支持,最常用) |
| 011 | CC1 比较匹配 | CNT == CCR1 的那一刻输出 TRGO |
| 100 | CC1OC 信号 | OC1REF 边沿变化时刻输出 TRGO |
| 101 | CC2OC 信号 | OC2REF 边沿变化时刻输出 TRGO |
| 110 | CC3OC 信号 | OC3REF 边沿变化时刻输出 TRGO |
| 111 | CC4OC 信号 | OC4REF 边沿变化时刻输出 TRGO |
从模式控制寄存器**(TIMx_SMCR)**
SMCR 就是从模式的总配置寄存器,用来两件事:
①选触发源 TS(听哪里来的信号);
②选 SMS(收到信号之后做什么动作),另外还有一些辅助位。
关键认知:TS 决定"听谁",SMS 决定"听到后干什么",ECE/ETP/CPS/ETF 是 ETR 这条独立通路的前端处理。

TS:触发源选择,谁能触发从模式定时器。
| TS | 触发源 | 说明 |
|---|---|---|
| 000~011 | ITR0~ITR3 | 来自其他定时器的 TRGO,查寄存器映射可知 |
| 100 | TI1F_ED | TI1 双边沿检测,上升沿和下降沿都产生脉冲 |
| 101 | TI1FP1 | TI1 经滤波、极性选择后的信号 |
| 110 | TI2FP2 | TI2 经滤波、极性选择后的信号 |
| 111 | ETRF | ETR 经 ETP/CPS/ETF 处理后的信号 |
SMS:触发之后做什么事情
| SMS | 模式 | 行为 | 典型场景 |
|---|---|---|---|
| 000 | 关闭 | 内部时钟正常计数 | 普通定时 |
| 001 | 编码器 1 | TI2FP2 边沿计数,TI1FP1 电平定方向 | 正交编码器 ×2 |
| 010 | 编码器 2 | TI1FP1 边沿计数,TI2FP2 电平定方向 | 正交编码器 ×2 |
| 011 | 编码器 3 | 两路边沿都计数 | 正交编码器 ×4 |
| 100 | 复位模式 | TRGI 上升沿复位 CNT 并产生更新事件 | 主从同步、周期测量、超时复位 |
| 101 | 门控模式 | TRGI 高电平期间计数,低电平停止但不复位 | 测脉宽、有效窗口内计数 |
| 110 | 触发模式 | TRGI 上升沿启动计数,不复位 | 等事件到达再启动 |
| 111 | 外部时钟模式 1 | TRGI 上升沿作为计数时钟 | 外部脉冲计数 |

TIM6、TIM7 基本定时器,只能做主定时器,可以输出 TRGO;没有 SMCR 从模式寄存器,不能做从定时器,无法接收 ITR、TI 这类外部触发信号来控制自己。
状态寄存器**(TIMx_SR)**
记录着定时器发生过什么,会记录在这里。
| 位 | 名称 | 含义 |
|---|---|---|
| 15~13 | 保留 | --- |
| 12 | CC4OF | 通道 4 重复捕获标志 |
| 11 | CC3OF | 通道 3 重复捕获 |
| 10 | CC2OF | 通道 2 重复捕获 |
| 9 | CC1OF | 通道 1 重复捕获 |
| 8 | 保留 | TIM1/TIM8 为 B2IF(刹车 2) |
| 7 | 保留 | TIM1/TIM8 为 BIF(刹车) |
| 6 | TIF | 触发事件标志 |
| 5 | 保留 | TIM1/TIM8 为 COMIF(换相) |
| 4 | CC4IF | 通道 4 捕获/比较 |
| 3 | CC3IF | 通道 3 捕获/比较 |
| 2 | CC2IF | 通道 2 捕获/比较 |
| 1 | CC1IF | 通道 1 捕获/比较 |
| 0 | UIF | 更新事件标志 |

比较重要的有UIF位,用来记录更新事件发生了,如果有更新事件发生,就在这里置1,需要软件置0。
CC1IF~CC4IF就是,在输入捕获模式下,捕捉到边沿了,CCR被写入了,就会置位吗,输出比较下,CNT=CCR了,就会置位。
CC1OF~CC4OF:输入捕获专用,当你输入捕获标志位(CCxIF)没有及时清零时,又来了一个捕获边沿,就会置1,表明你丢了一次捕获。
TIF 记录的是 TRGI 上出现了一个有效触发边沿,至于这个边沿造成什么后果,由 SMS 决定
DMA/中断使能寄存器(TIMx_DIER)
这个寄存器主要是存储中断/DMA请求使能的,需要注意,不要把UIE和UDE(更新中断/DMA请求使能)与TIE和TDE(触发中断/DMA请求使能)搞混。我们常用前者,TIE/TDE 是从模式的"补充",只在你想感知 TRGI 边沿本身时才开。
CCxIE就是比较/捕获中断使能位,CCxDE就是比较/捕获DMA请求使能位。
在输入捕获(CNT的值复制到CCR)或输出比较(CNT=CCR)时,如果使能对应的位,就会允许对应的中断/DMA请求通过。

事件产生寄存器**(TIMx_EGR)**
EGR寄存器可以理解成软件事件源,可以触发更新事件和触发事件,以及捕获/比较事件。

| 位 | 名称 | 产生什么事件 | 对应 SR 标志 |
|---|---|---|---|
| 15~8 | 保留 | --- | --- |
| 7 | BG | 刹车事件(仅高级定时器) | BIF |
| 6 | TG | 触发事件 | TIF |
| 5 | COMG | 换相事件(仅高级定时器) | COMIF |
| 4 | CC4G | 通道 4 捕获/比较事件 | CC4IF |
| 3 | CC3G | 通道 3 捕获/比较事件 | CC3IF |
| 2 | CC2G | 通道 2 捕获/比较事件 | CC2IF |
| 1 | CC1G | 通道 1 | CC1IF |
| 0 | UG | 更新事件 | UIF |
捕获/比较模式寄存器 1(TIMx_CCMR1)与捕获/比较模式寄存器 2(TIMx_CCMR2)

| 用途 | 靠哪些位 |
|---|---|
| 定方向 | CCxS:输入还是输出,输入时选信号从哪来 |
| 定输出行为 | OCxM:PWM、翻转、强制电平、冻结;OCxPE:预装载;OCxFE/OCxCE:快速响应和单脉冲 |
| 定输入行为 | ICxPSC:每几个边沿捕获一次;ICxF:滤掉毛刺 |
| 给其他模块供信号 | CCxS=01 把引脚接到 TI1/TI2,供 SMCR 选作触发源或编码器输入 |
以捕获/比较模式寄存器 1(TIMx_CCMR1)为例,我们看寄存器,要先知道CCxS是什么意思。
| CCxS | 含义 |
|---|---|
| 00 | 输出模式(比较输出) |
| 01 | 输入模式,ICx 映射到 TIx |
| 10 | 输入模式,ICx 映射到另一路 TI(交叉) |
| 11 | 输入模式,ICx 映射到 TRC(内部触发,少用) |
先定 CCxS,再配其他位。 CCxS=00 时按输出模式解释,非 00 时按输入模式解释。改方向时最好整个字节重写,不要只改一位。
捕获**/比较使能寄存器(TIMx_CCER)**

这个寄存器,复制使能捕获/比较功能,以及控制输入捕获捕获的是上升沿,还是下降沿,输出比较是高电平有效,还是低电平有效。
ARR/CNT/PSC寄存器与CCRx寄存器
存储时基单元的值,以及CCR寄存器的值。
六、总的理解
我对应定时器总的理解就是,以时基单元为核心,以输入捕获/输出比较功能为辅,能够实现定时、或者自主设计触发某一事件的外设。
浅层理解
最简单的就是,我初始化一个定时器,到时间了我就触发中断或者DMA请求,就已经可以做很多事情了。
再深入一点,我们可以通过输出比较输出PWM波形,通过输入捕获监视并获得输入波形的参数。甚至也可以在输出比较模式下,CNT=CCR时更新中断或DMA请求,以及输入捕获模式下,捕获到边沿后,更新中断和DMA请求。
深入了解主模式和从模式的关系和原理
如果在深入一些,就到我最近才了解的了,定时器的主模式和从模式。
主模式的话:
主模式的定时器,通过TRGO信号,触发从模式的定时器、其他外设,基本定时器也能做主定时器,有3种配置方式发送TRGO信号:定时器复位,定时器使能,有更新事件发生。看CR2寄存器里的MMS位配置成什么模式决定什么时候发出TRGO信号。
然后如果是通用定时器,CR2寄存器的MMS位,就会多5种发出TRGO信号的时机,与输出比较(CNT=CCR)和输入捕获(捕获到边沿信号)有关。
从模式的话:
只有通用/高级定时器才能作为从模式的定时器。主模式谁都可以。但是基本定时器能产生 TRGO 但只给 DAC 等外设。
顾名思义,从模式的定时器不直接启动,而是作为一个从机,等待主机发送TRGO信号之后才启动。与SMCR寄存器相关,这个寄存器配置的是主/从模式的各种参数。
从模式也不是只有某个定时器的TRGO信号才能启动它,从模式的定时器也有很多的信号来源。
一共有3种,一种是主定时器的TRGO,接到从定时器的ITR通道触发从定时器;一种是来自外部信号TIx,经过滤波/极性选择之后,输入到从定时器;还有一种是外部触发引脚 ETR,ETR 和 TI1/TI2 是不同的引脚、不同的路径:ETR 有自己独立的极性(ETP)、预分频(CPS)、滤波器(ETF),是一条专门的触发输入通路;TI1/TI2 是通道引脚,走捕获输入级。
更新事件UEV与触发事件(Trigger Event)
更新事件我理解的是能产生定时中断和DMA请求,触发事件我理解的是,指的是主模式/从模式之间的TRGO信号。
更新事件能产生更新中断/DMA 请求;也能通过 MMS=010 让主定时器发送 TRGO。TRGO 传到从定时器后,从定时器的 TRGI 上才产生触发事件。