芯片型号:STM32F103RC
软件开发包:标准外设库
一、定时器简介
- TIM(Timer)定时器
- 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
- 16位计数器、预分频器、自动重装寄存器的时基单元,在 72MHz 计数时钟下可以实现最大 59.65s 的定时, 59.65 s = 65536 × 65536 × 1 72000000 59.65s=65536\times 65536\times\frac{1}{72000000} 59.65s=65536×65536×720000001
- 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
- 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型
- STM32的定时器支持级联的模式:一个定时器的输出可以当作另一个定时器的输入
二、定时器分类
STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分别为基本定时器,通用定时器和高级定时器。
- 基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,没有外部 IO。
- 通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,每个定时器有 4 个外部 IO。
- 高级定时器 TIM1/8 是一个 16 位的可以向上/下计数的定时器,每个定时器有 8 个外部 IO。
类型 | 编号 | 总线 | 功能 |
---|---|---|---|
基本定时器 | TIM6、TIM7 | APB1 | 拥有定时中断、主模式触发DAC的功能 |
通用定时器 | TIM2、TIM3、TIM4、TIM5 | APB1 | 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能 |
高级定时器 | TIM1、TIM8 | APB2 | 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能 |
三、基本定时器功能框图
基本定时器的核心是时基,不仅基本定时器有,通用定时器和高级定时器也有。
3.1 时钟源
定时器时钟 TIMxCLK,即内部时钟 CK_INT,经 APB1 预分频器后分频提供,如果 APB1 预分频系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB1 预分频的系数是 2,即 PCLK1 = 36M,所以定时器时钟 TIMxCLK = 36 x 2 = 72M。
3.2 控制器
控制器用于控制定时器的:复位、使能、计数、触发DAC。
涉及到的寄存器为: CR1/2、 DIER、 EGR、 SR。
3.3 时基单元
3.3.1 预分频器
预分频器 PSC,有一个输入时钟 CK_PSC 和一个输出时钟 CK_CNT。输入时钟 CK_PSC 就是上面时钟源的输出,对于基本定时器而言,就是内部时钟 CK_INT。输出 CK_CNT 则用来驱动计数器 CNT 计数。
PSC 是一个 16 位的预分频器,可以对预分频器时钟 CK_PSC 进行 1~65536 之间的任何一个数进行分频。具体计算方式为:CK_CNT = CK_PSC / (PSC+1)。
3.3.2 计数器
计数器 CNT 在计数器时钟的驱动下开始计数,计数一次的时间为1 / CK_CNT。
计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装载寄存器保存的值的时候产生更新事件,并清零从头开始计数。
3.3.3 自动重装载寄存器
自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。
四、高级定时器和通用定时器功能框图
高级定时器拥有通用定时器全部功能,并额外增加了一些功能。所以这里就以高级定时器为主,主要介绍一下三种定时器相似的部分。
4.1 时钟源
计数器时钟可由下列时钟源提供:
- 内部时钟(CK_INT)
- 外部时钟模式1:外部输入引脚
- 外部时钟模式2:外部触发输入 ETR
- 内部触发输入(ITRx)
4.1.1 内部时钟
内部时钟 CK_INT 即来自于芯片内部,等于 72M,一般情况下,我们都是使用内部时钟。当从模式控制寄存器 TIMx_SMCR 的 SMS 位等于 000 时,则使用内部时钟。
4.1.2 外部时钟模式1
(1)时钟信号输入引脚
当使用外部时钟模式 1 的时候,时钟信号来自于定时器的输入通道,总共有 4 个,分别为 TI1/2/3/4,即 TIMx_CH1/2/3/4。具体使用哪一路信号,由 TIM_CCMRx 的位 CCxS[1:0] 配置,其中 CCMR1 控制 TI1/2, CCMR2 控制 TI3/4。
(2)滤波器
如果来自外部的时钟信号的频率过高或者混杂有高频干扰信号的话,我们就需要使用滤波器对信号重新采样,来达到降频或者去除高频干扰的目的,具体的由 TIMx_CCMRx 的位 ICxF[3:0] 配置。
(3)边沿检测
边沿检测的信号来自于滤波器的输出,在成为触发信号之前,需要进行边沿检测,决定是上升沿有效还是下降沿有效,具体的由 TIMx_CCER 的位 CCxP 和 CCxNP 配置。
(4)触发选择
当使用外部时钟模式 1 时,触发源有两个,一个是滤波后的定时器输入 1(TI1FP1)和滤波后的定时器输入 2(TI2FP2),具体的由 TIMxSMCR 的位 TS[2:0] 配置。
(5)从模式选择
选定了触发源信号后,最后我们需把信号连接到 TRGI 引脚,让触发信号成为外部时钟模式 1 的输入,最终等于 CK_PSC。具体的配置, TIMx_SMCR 的位 SMS[2:0]为 000 即可选择外部时钟模式 1。
4.1.3 外部时钟模式2
(1)时钟信号输入引脚
当使用外部时钟模式 2 的时候,时钟信号来自于定时器的特定输入通道 TIMx_ETR,只有 1 个。
(2)外部触发极性
来自 ETR 引脚输入的信号可以选择为上升沿或者下降沿有效,具体的由 TIMx_SMCR 的位 ETP配置。
(3)外部触发预分频器
由于 ETRP 的信号的频率不能超过 TIMx_CLK(72M)的 1/4,当触发信号的频率很高的情况下,就必须使用分频器来降频,具体的由 TIMx_SMCR 的位 ETPS[1:0] 配置。
(4)滤波器
如果 ETRP 的信号的频率过高或者混杂有高频干扰信号的话,我们就需要使用滤波器对 ETRP 信号重新采样,来达到降频或者去除高频干扰的目的。具体的由 TIMx_SMCR 的位 ETF[3:0] 配置,其中的 fDTS 是由内部时钟 CK_INT 分频得到,具体的由 TIMx_CR1 的位 CKD[1:0] 配置。
(5)从模式选择
经过滤波器滤波的信号连接到 ETRF 引脚后,触发信号成为外部时钟模式 2 的输入,最终等于 CK_PSC。具体的配置,TIMx_SMCR 的位 ECE 为 1 即可选择外部时钟模式 2。
4.1.4 内部触发输入
内部触发输入是使用一个定时器作为另一个定时器的预分频器。硬件上高级控制定时器和通用定时器在内部连接在一起,可以实现定时器同步或级联。主模式的定时器可以对从模式定时器执行复位、启动、停止或提供时钟。
4.2 控制器
控制器部分包括触发控制器、从模式控制器以及编码器接口。
触发控制器用来针对片内外设输出触发信号,比如为其它定时器提供时钟和触发 DAC/ADC 转换。
从模式控制器可以控制计数器复位、启动、递增/递减、计数。
编码器接口专门针对编码器计数而设计。
4.3 时基单元
高级定时器时基单元功能包括四个寄存器,分别是计数器寄存器 (CNT)、预分频器寄存器(PSC)、自动重载寄存器 (ARR) 和重复计数器寄存器 (RCR)。其中重复计数器 RCR 是高级定时器独有,通用和基本定时器没有。前面三个寄存器都是 16 位有效, TIMx_RCR 寄存器是 8 位有效。
4.3.1 预分频器
除输入时钟的来源变多了之外,功能和基本定时器相同。
4.3.2 计数器
高级/通用定时器的计数器有三种计数模式,分别为向上计数模式、向下计数模式和中央对齐模式(向上/向下计数) 。
- 在向上计数模式中,在向上计数模式中,计数器从0计数到自动重载寄存器 ARR 值,然后重新从0开始计数并且产生一个计数器向上溢出事件。
- 在向下计数模式中,计数器从自动重载寄存器 ARR 值开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。
- 在中心对齐模式中,计数器从 0 开始计数到 (ARR-1) 值生成计数器上溢事件,然后从 ARR 值开始向下计数到 1 生成计数器下溢事件;然后再从 0 开始计数,如此循环。每次发生计数器上溢和下溢事件都会生成更新事件。
对于高级定时器,如果禁用重复计数器,在计数器生成上溢/下溢事件就马上生成更新事件 (UEV);如果使能重复计数器,每生成一次上溢/下溢事件重复计数器内容就减 1,直到重复计数器内容为 0 时才会生成更新事件。
4.3.3 自动重装载寄存器
功能和基本定时器相同。
4.3.4 重复次数计数器
在基本/通用定时器发生上/下溢事件时直接就生成更新事件,但对于高级定时器却不是这样,高级定时器在硬件结构上多出了重复计数器,在定时器发生上溢或下溢事件时递减重复计数器的值,只有当重复计数器为 0 时才会生成更新事件。在发生 N+1 个上溢或下溢事件 (N 为RCR 的值) 时产生更新事件。
重复计数器在下述任一条件成立时递减:
- 向上计数模式下每次计数器溢出时;
- 向下计数模式下每次计数器下溢时;
- 中央对齐模式下每次上溢和每次下溢时。
五、影子寄存器
- PSC、ARR、CCR 和 REP 都有影子寄存器,功能框图上有个影子。
- 影子寄存器的存在起到一个缓冲的作用,用户值->寄存器->影子寄存器->起作用,如果不使用影子寄存器,则用户值在写到寄存器之后就直接起作用。
- 影子寄存器的用处:例如在计数器工作期间,如果改变分频值,这个变化不会立即生效,而是会等到本次计数周期结束后,产生了更新事件,预分频器的值才会被传递到影子寄存器中,才会生效。
六、主从触发模式
主从触发模式就是主模式、从模式和触发源选择三个功能的简称。
主模式可以将定时器内部的信号映射到 TRGO(Trigger Out) 引脚,用于触发别的外设。比如,把定时器的更新事件映射到 TRGO,TRGO 直接连接到 DAC 的触发转换引脚上,这样定时器就不需要再通过中断来触发 DAC 了。
从模式就是接收其他外设或者自身外设的一些信号,用于控制自身定时器的运行,也就是被别的信号控制。
触发源选择就是选择从模式的触发信号源,可以将其视为从模式的一部分。触发源选择,指定一个信号映射到 TRGI(Trigger In),然后TRGI 去触发从模式。比如,在输入捕获中,想通过硬件电路实现在捕获之后自动完成 CNT 的清零工作,选中 TI1FP1 为触发信号,从模式选择复位操作,这样 TI1FP1 的信号就可以自动触发 CNT 的清零。
参考视频源于B站up主: 野火科技、江协科技
参考文档:《STM32库开发实战指南——基于野火MINI开发板》