目录

一. 通用定时器概述(F1)(TIM2/TIM3 /TIM4 /TIM5)

    1. 介绍

    2. 特性

    3. 框图

    4. 相关寄存器

二. 计数器时钟

    1. 计数器时钟选择

(1)内部时钟——CK_INT

(2)外部时钟模式1——外部输入引脚(TIx)

(3)外部时钟模式2——外部触发输入(ETR)

(4)内部触发输入——ITRx

三、输入捕获

    1.理解

    2.大概原理

    3.结构分解

    4.应用

(1)测量脉宽或者频率

(2)PWM输入模式

四、输出比较

    1.理解

    2.结构分解

    3. 详细结构(以通道1为例)

五. 通用定时器输出PWM模式

    1. 介绍

    2. 模式的配置


一. 通用定时器概述(F1)(TIM2/TIM3 /TIM4 /TIM5)

    1. 介绍

通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。

    2. 特性

(1)16位递增、递减、中心对齐计数器(计数值:0~65535)

(2)16位预分频器(分频系数:1~65536)

(3)可用于触发DAC、ADC

(4)在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求

(5)4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式

(6)使用外部信号控制定时器且可实现多个定时器互连的同步电路

(7)支持编码器和霍尔传感器电路等

    3. 框图

bd1ccc6b0c704ccda0b23b3406d265c6.png

    4. 相关寄存器

(1)从模式控制寄存器(TIMx_SMCR

3a883be3eefe4507aa9253d9ef3a25a6.png

位15(ETP):外部触发极性

位13:12(ETPS):外部触发预分频【 频率必须最多是CK_INT频率的1/4 】

位14(ECE):外部时钟使能位【 设置该位与选择外部时钟模式1并将TRGI连到ETRF(SMS=111和TS=111)具有相同功效 】

位11:8(ETF):外部触发滤波【 定义了对ETRP信号采样的频率和对ETRP数字滤波的带波器是一个事件计数器,它记录到N个事件后会产生一个输出的跳变(1/0) 】

位6:4(TS):触发选择

a2a748cae5434e9d9237d9153f8da663.png

位2:0(SMS):从模式选择

(2)捕获/比较模式寄存器 1(TIMx_CCMR1

0d424f810ddc4c35861e6862858216b1.png

位9:8(CC2S): 捕获/比较2选择

位7(OC1CE):输出比较1清0使能

位6:4(OC1M):输出比较1模式

位3(OC1PE):输出比较1预装载使能

位1:0(CC1S):捕获/比较1选择

位7:4(IC1F):输入捕获1滤波器( 定义了TI1输入的采样频率及数字滤波器长度)

(3)控制寄存器 1(TIMx_CR1

d14b9d5959e64744b475575879c40398.png

位9:8(CKD):时钟分频因子【 定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例 】

(4)捕获/比较使能寄存器(TIMx_CCER

c9d9c8c54e4b42cb855e0ac2074cae57.png

位5(CC2P):输入/捕获2输出极性

位1(CC1P):输入/捕获1输出极性

位0(CC1E):输入/捕获1输出使能

(5)控制寄存器 2(TIMx_CR2)

cc6847defc4543d6989288fd7bfed7d4.png

位6:4(MMS):主模式选择

d2b1e28f17b2448bb2ebc38dad3a9354.png

(6)捕获/比较寄存器 1(TIMx_CCR1

79413b7e329b41f291fe8ea89105a62e.png

若CC1通道配置为输出:CCR1包含了装入当前捕获/比较1寄存器的值(预装载值)。如果在TIMx_CCMR1寄存器(OC1PE位)中末选择预裝载特性,写入的数值会被立即传输至当前寄存器中。否则只有当更新事件发生时,此预装载值才传输至当前捕获/比较1寄存器中。当前捕获/比较寄存器参与同计数器TIMx_CNT的比较,并在OC1端口上产生输出信号。

若CC1通道配置为输入:CCR1包含了由上一次输入捕获1事件(lC1)传输的计数器值。

二. 计数器时钟

    1. 计数器时钟选择

d579ca16f96a4f78a210c61a71b23e25.png

(1)内部时钟——CK_INT(来自外设总线APB提供的时钟)

        来自于芯片内部,等于72MHz。一般情况下,我们都是使用内部时钟。

配置方法:从模式控制寄存器TIMx_SMCR设置SMS=000

(2)外部时钟模式1——外部输入引脚(TIx)(来自定时器通道1或者通道2引脚的信号)

配置方法:设置TIMx_SMCR的SMS=111

①时钟信号输入引脚

        当使用外部时钟模式1的时候,时钟信号来自于定时器的输入通道,共有4个,分别为TI1/2/3/4,即TIMx_CH1/2/3/4。具体使用哪一路信号,由TIM_CCMRx的位CCxS[1:0]配置(其中CCMR1控制T1/2,CCMR2控制TI3/4)。

②滤波器

        如果来自外部的时钟信号的频率过高或者混杂有高频干扰信号的话,我们就需要使用滤波器对信号重新采样,来达到降频或者去除高频干扰的目的,具体由TIMx_CCMRx的位ICxF[3:0]配置。

③边缘检测器

        边沿检测的信号来自于滤波器的输出,在成为触发信号之前,需要进行边沿检测,决定是上升沿有效还是下降沿有效,具体由TIMx_CCER的位CCxP和CCxNP配置。

④触发选择

        当使用外部时钟模式1时,触发源有两个:滤波后的定时器输入1(TI1FP1)和滤波后的定时器输入2(TI2FP2),具体由TIMx_SMCR的位TS[2:0]配置。

⑤从模式选择

        选定了触发源信号后,最后我们需把信号连接到TRGI引脚,让触发信号成为外部时钟模式1的输入,最终等于CK_PSC,然后驱动计数器CNT计数。具体配置TIMx_SMCR的位SMS[2:0]为000,即可选择外部时钟模式1。

⑥使能计数器

        经过上面的5个步骤之后,最后我们只需使能计数器开始计数,外部时钟模式1的配置就算完成。使能计数器由TIMx_CR1的位CEN配置。

例:配置向上计数器在Tl2输入端的上升沿计数:

①配置TIMx_CCMR1寄存器CC2S=’01’,配置通道2检测T12输入的上升沿

②配置TIMx_CCMR1寄存器的IC2F,选择输入滤波器带宽(如果不需要滤波器,保持IC2F=0000)

③配置TIMx_CCER寄存器的CC2P='0’,选定上升沿极性

④配置TIMx_SMCR寄存器的SMS='111',选择定时器外部时钟模式1

⑤配置TIMx SMCR寄存器中的TS='110’,选定T12作为触发输入源

⑥设置TIMx_CR1寄存器的CEN=‘1’,启动计数器

【 当上升沿出现在TI2,计数器计数一次,且TIF标志被设置 】

8962a8efd9144d538756a202106ea327.png

(3)外部时钟模式2——外部触发输入(ETR)(来自可以复用为TIMx_ETR的IO引脚)

配置方法:设置TIMx_SMCR的ECE=1

①时钟信号输入引脚

        当使用外部时钟模式2的时候,时钟信号来自于定时器的特定输入通道TIMx_ETR,只有1个。

②外部触发极性

        来自ETR引脚输入的信号可以选择为上升沿或者下降沿有效,具体由TIMx_SMCR的位ETP配置。

③外部触发预分频器

        由于ETRP的信号的频率不能超过TIMx_CLK (72M)的1/4,在触发信号的频率很高的情况下,就必须使用分频器来降频,具体由TIMx_SMCR的位ETPS[1:0]配置。

④滤波器

        如果ETRP的信号的频率过高或者混杂有高频干扰信号的话,我们就需要使用滤波器对ETRP信号重新采样,来达到降频或者去除高频干扰的目的。具体由TIMx_SMCR的位ETF[3:0]配置,其中的fDTS由内部时钟CK_INT分频得到,具体由TIMx_CR1的位CKD[1:0]配置。

⑤模式选择

        经过滤波器滤波的信号连接到ETRF引脚后,触发信号成为外部时钟模式2的输入,最终等于CK_PSC,然后驱动计数器CNT计数。具体配置TIMx_SMCR的位ECE为1,即可选择外部时钟模式2。

⑥使能计数器

        经过上面的5个步骤之后,最后只需使能计数器开始计数,外部时钟模式2的配置就算完成。使能计数器由TIMx_CR1的位CEN配置。

例:配置在ETR下每2个上升沿计数一次的向上计数器:

①不需要滤波器,置TIMx_SMCR寄存器中的ETF=0000

②设置预分频器,置TIMX_SMCR寄存器中的ETPS=01

③设置在ETR的上升沿检测,置TIMxSMCR寄存器中的ETP=0

④开启外部时钟模式2,置TIMx_SMCR寄存器中的ECE=1

⑤启动计数器,置TIMx_CR1寄存器中的CEN=1

【 计数器在每2个ETR上升沿计数一次 】

40710da898a64759b089a91f03c8fa52.png

(4)内部触发输入——ITRx(用于与芯片内部其它通用/高级定时器级联)

补:使用一个定时器作为另一个定时器的预分频器

d510545850bf4f71aa589d2ed75a547c.png

24a0436c56dd486291265ecf92a91f18.png

三、输入捕获

    1.理解

        输入捕获可以对输入的信号的上升沿、下降沿或者双边沿进行捕获,常用的有测量输入信号的脉宽和测量PWM输入信号的频率和占空比这两种。

    2.大概原理

        当捕获到信号的跳变沿的时候,把计数器CNT的值锁存到捕获寄存器CCR中,把前后两次捕获到的CCR寄存器中的值相减,就可以算出脉宽或者频率。如果捕获的脉宽的时间长度超过你的捕获定时器的周期,就会发生溢出,这个我们需要做额外的处理。

    3.结构分解

① 输入通道

        需要被测量的信号从定时器的外部引脚TIMx_CH1/2/3/4进入,通常叫T1/2/3/4。

② 输入滤波器和边沿检测器

        当输入的信号存在高频干扰的时候,需要对输入信号进行滤波,即进行重新采样。根据采样定律,采样的频率必须大于等于两倍的输入信号频率。比如输入的信号为1MHz,又存在高频的信号干扰,那么此时就很有必要进行滤波,可以设置采样频率为2MHz,这样可以在保证采样到有效信号的基础上把高于2MHz的高频干扰信号过滤掉。

        滤波器的配置由CR1寄存器的位CKD[1:0]和CCMR1/2的位ICxF[3:0]控制。从ICxF位的描述可知,采样频率f可以由fCK_INT和fDTS分频后的时钟提供( fCK_INT是内部时钟,fDTS是fCK_INT经过分频后得到的频率,分频因子由CKD[1:0]决定,可以是不分频,2分频或者是4分频 )。

        边沿检测器用来设置信号在捕获的时候在什么边沿有效,可以是上升沿、下降沿或者双边沿,由CCER寄存器的位CCxP和CCxNP决定。

③ 捕获通道

        捕获通道就是图中的IC1/2/3/4,每个捕获通道都有相对应的捕获寄存器CCR1/2/3/4,当发生捕获的时候,计数器CNT的值就会被锁存到捕获寄存器中

        这里要搞清楚输入通道和捕获通道的区别,输入通道是用来输入信号的,捕获通道是用来捕获输入信号的通道,一个输入通道的信号可以同时输入给两个捕获通道。比如输入通道TI1的信号经过滤波边沿检测器之后的TI1FP1和TI1FP2可以进入捕获通道IC1和IC2【 这就是PWM输入捕获,只有一路输入信号(TI1)却占用了两个捕获通道 (IC1和IC2) 】。当只需要测量输入信号的脉宽时候,用一个捕获通道即可。输入通道和捕获通道的映射关系具体由寄存器CCMRx的位CCxS[1:0]配置。

④ 预分频器

        用于决定发生多少个事件时进行一次捕获。具体的由寄存器CCMRx的位ICxPSC配置,如果希望捕获信号的每一个边沿,则不分频。

⑤ 捕获寄存器

        经过预分频器的信号ICxPS是最终被捕获的信号,当发生捕获时(第1次),计数器CNT的值会被锁存到捕获寄存器CCR中,还会产生CCxI中断,相应的中断位CCxIF(在SR寄存器中)会被置位,通过软件或者读取CCR中的值可以将CCxIF清0。如果发生第2次捕获(即重复捕获:CCR寄存器中己捕获到计数器值且CCxIF标志已置1),则捕获溢出标志位CCxOF(在SR寄存器中)会被置位,CCxOF只能通过软件清零

    4.应用

        输入捕获一般应用在两个方面:脉冲跳变沿时间测量和PWM输入测量

(1)测量脉宽或者频率

①测量频率

        当捕获通道TIx上第1次出现上升沿时,发生第1次捕获,计数器CNT的值会被锁存到捕获寄存器CCR中,而且还会进入捕获中断在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到value1中

        当出现第2次上升沿时,发生第2次捕获,计数器CNT的值会再次被锁存到捕获寄存器CCR中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到value3中,并清除捕获记录标志

        利用value3和value1的差值我们就可以算出信号的周期(频率)

②测量脉宽

        当捕获通道TIx上第1次出现上升沿时,发生第1次捕获,计数器CNT的值会被锁存到捕获寄存器CCR中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到value1中。然后把捕获边沿改变为下降沿捕获,目的是捕获后面的下降沿。

        当下降沿到来的时候,发生第2次捕获,计数器CNT的值会再次被锁存到捕获寄存器CCR中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到value3中,并清除捕获记录标志。然后把捕获边沿设置为上升沿捕获

        利用value1可以求出脉冲宽度,利用value1与value3的比值可以求出占空比。在测量脉宽过程中需要来回的切换捕获边沿的极性,如果测量的脉宽时间比较长,定时器就会发生溢出,溢出的时候会产生更新中断,可以在中断里面对溢出进行记录处理。

(2)PWM输入模式(更简便的测量脉宽和频率

        当使用PWM输入模式的时候,因为一个输入通道(TIx)会占用两个捕获通道(ICx),所以一个定时器在使用PWM输入的时候最多只能使用两个输入通道(TIx)。

以输入通道TI1工作在PWM输入模式为例:

        PWM信号由输入通道TI1进入,因为是PWM输入模式的缘故,信号会被分为两路:一路是TI1FP1,另外一路是TI2FP2。其中一路是周期,另一路是占空比,具体一路信号对应周期还是占空比,得从程序上设置哪一路信号作为触发输入,作为触发输入的哪一路信号对应的就是周期,另一路就是对应占空比。作为触发输入的那一路信号还需要设置极性,是上升沿还是下降沿捕获。一旦设置好触发输入的极性,另外一路硬件就会自动配置为相反的极性捕获,无需软件配置。

        一句话概括就是:选定输入通道,确定触发信号,然后设置触发信号的极性即可。因为是PWM输入的缘故,另一路信号则由硬件配置,无需软件配置。使用PWM输入模式的时候必须将从模式控制器配置为复位模式(配置寄存器SMCR的位SMS[2:0]来实现),即当我们启动触发信号开始进行捕获的时候,同时把计数器CNT复位清零

        PWM信号由输入通道TI1进入,配置TI1FP1为触发信号,上升沿捕获。当上升沿的时候IC1和IC2同时捕获计数器CNT清零,到了下降沿的时候,IC2捕获,此时计数器CNT的值被锁存到捕获寄存器CCR2中,到了下一个上升沿的时候,IC1捕获,计数器CNT的值被锁存到捕获寄存器CCR1中。

        其中CCR2+1测量的是脉宽,CCR1+1测量的是周期。( 要注意的是:CCR2和CCR1的值在计算占空比和频率的时候都必须加1,因为计数器是从0开始计数的

        从软件上来说,用PWM输入模式测量脉宽和周期更容易,付出的代价是需要占用两个捕获寄存器

四、输出比较

    1.理解

        输出比较就是通过定时器的外部引脚对外输出控制信号,有冻结、将通道X(x=1,2,3,4)设置为( 匹配时输出有效电平、将通道X设置为匹配时输出无效电平、翻转、强制变为无效电平、强制变为有效电平、PWM1和PWM2 )8种模式,具体使用哪种模式由寄存器CCMRx的位OCxM[2:0]配置。其中PWM模式是输出比较中的特例,使用的也最多。

    2.结构分解

ac0ba8418fae438daee9d5937b4b205f.png

① 比较寄存器

        当计数器CNT的值与比较寄存器CCR的值相等的时候,输出参考信号OCxREF的信号的极性就会改变,其中OCxREF=1(高电平)称为有效电平,OCxREF=0(低电平)称为无效电平,并且会产生比较中断CCxI,相应的标志位CCxIF (SR寄存器中)会置位。然后OCxREF再经过一系列的控制之后就成为真正的输出信号OCx。

③输出引脚

        输出比较的输出信号最终是通过定时器的外部IO来输出的,分别为CH1~4。

    3. 详细结构(以通道1为例)

(1)捕获/比较通道1的主电路——输出部分

a11158f73c244d2ba0c69aa30da02bb6.png

(2)捕获/比较通道1——输出部分

7c070286363a45deae2a483f86abdc36.png

五. 通用定时器输出PWM模式

    1. 介绍

bd5a6e70bbd84fc69e052b053cbe6686.png

2aeb355aa1824dccbf120d935ca99e0b.jpeg

【 ARR:自动重装载寄存器的值    CCRx:捕获/比较寄存器x的值 】

PWM模式1:

        递增:CNT < CCRx,输出有效电平    CNT >= CCRx,输出无效电平

        递减:CNT > CCRx,输出无效电平    CNT <= CCRx,输出有效电平

PWM模式2:

        递增:CNT < CCRx,输出无效电平    CNT >= CCRx,输出有效电平

        递减:CNT > CCRx,输出有效电平    CNT <= CCRx,输出无效电平

        原理:当 CNT 值小于 CCRx 的时候,IO输出低电平(0),当CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率。

    2. 模式的配置

(1)配置定时器基础工作参数:HAL_TIM_PWM_Init() (初始化定时器TIM3并设置ARR、PSC等参数)

7d240b06cd074f78b365d0f77b000613.png

d4a446d8bce241ddabe67d64c0bc6243.png

ff76c5071d424179b080969099fd3461.png

(2)定时器PWM输出MSP初始化:HAL_TIM_PWM_MspInit()  (配置NVIC、CLOCK、GPIO等)

(3)配置PWM模式/比较值等:HAL_TIM_PWM_ConfigChannel()(配置PWM模式、比较值、输出极性等)

b8b72fca360b463ca97b9015747a0071.png

(4)使能输出并启动计数器:HAL_TIM_PWM_Start()  (使能开启输出并启动计数器)——开始产生PWM信号

8a2fa8f2dd7943df9dc881e1c37dee73.png

80779058a984418f8413e90f7ba4ceda.png

(5)修改比较值控制占空比(可选):__HAL_TIM_SET_COMPARE() (修改比较值)

f9c0d02659ad411aba8a7543fc760056.png

(6)使能通道预装载(可选):__HAL_TIM_ENABLE_OCxPRELOAD()  (使能通道预装载)

89618bc469b1429981a1d42f9675c79a.png

9b7eb24548fd480b8038ab63794b2fc6.png

 (7) 参考代码

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐