STM32 F103 通用高级定时器

定时器寄存器分类:

时基单元寄存器:

13.4.10 TIM1和TIM8计数器(TIMx_CNT);13.4.11 TIM1和TIM8预分频器(TIMx_PSC);13.4.12 TIM1和TIM8自动重装载寄存器(TIMx_ARR);13.4.13 TIM1和TIM8重复计数寄存器(TIMx_RCR)

控制和状态寄存器:

13.4.1 TIM1和TIM8控制寄存器1(TIMx_CR1);13.4.2 TIM1和TIM8控制寄存器2(TIMx_CR2);13.4.3 TIM1和TIM8从模式控制寄存器(TIMx_SMCR);13.4.5 TIM1和TIM8状态寄存器(TIMx_SR)

捕获/比较模式、使能、死区寄存器:

13.4.7 TIM1和TIM8捕获/比较模式寄存器1(TIMx_CCMR1);13.4.8 TIM1和TIM8捕获/比较模式寄存器2(TIMx_CCMR2);13.4.9 TIM1和TIM8捕获/比较使能寄存器(TIMx_CCER);13.4.18 TIM1和TIM8刹车和死区寄存器(TIMx_BDTR)

捕获比较CCR寄存器:

13.4.14 TIM1和TIM8捕获/比较寄存器1(TIMx_CCR1);13.4.15 TIM1和TIM8捕获/比较寄存器2(TIMx_CCR2);13.4.16 TIM1和TIM8捕获/比较寄存器3(TIMx_CCR3);13.4.17 TIM1和TIM8捕获/比较寄存器(TIMx_CCR4)

不常用寄存器:

13.4.4 TIM1和TIM8 DMA/中断使能寄存器(TIMx_DIER);13.4.6 TIM1和TIM8事件产生寄存器;13.4.19 TIM1和TIM8 DMA控制寄存器(TIMx_DCR);134.20 TIM1和TIM8连续模式的DMA地址(TIMx_DMAR)

 

32.1 高级控制定时器


高级控制定时器(TIM1 和TIM8)和通用定时器在基本定时器的基础上引入了外部引脚,可以实现输入捕获和输出比较功能。

高级控制定时器比通用定时器增加了可编程死区互补输出、重复计数器、带刹车(断路)功能,这些功能都是针对工业电机控制方面。
高级控制定时器时基单元包含一个16 位自动重装载寄存器ARR,一个16 位的计数器CNT,可向上/下计数,一个16 位可编程预分频器PSC,预分频器时钟源有多种可选,有内部的时钟、外部时钟。还有一个8 位的重复计数器RCR,这样最高可实现40 位的可编程定时。

32.2 高级控制定时器功能框图

1. ①时钟源


高级控制定时器有四个时钟源可选:
内部时钟源CK_INT
 外部时钟模式1:外部输入引脚TIx(x=1,2,3,4)

 外部时钟模式2:外部触发输入ETR
 内部触发输入(ITRx)


内部时钟源(CK_INT)


内部时钟CK_INT 即来自于芯片内部,等于72M,一般情况下,我们都是使用内部时钟。当从模式控制寄存器TIMx_SMCR 的SMS 位等于000 时,则使用内部时钟。

(暂时没有用到,其它时钟源略过)

外部时钟模式1

①:时钟信号输入引脚
当使用外部时钟模式1 的时候,时钟信号来自于定时器的输入通道,总共有4 个,分别为TI1/2/3/4 , 即TIMx_CH1/2/3/4 。具体使用哪一路信号, 由TIM_CCMRx 的位CCxS[1:0]配置,其中CCMR1 控制TI1/2,CCMR2 控制TI3/4。
②:滤波器
如果来自外部的时钟信号的频率过高或者混杂有高频干扰信号的话,我们就需要使用滤波器对信号重新采样,来达到降频或者去除高频干扰的目的,具体的由TIMx_CCMRx的位ICxF[3:0]配置。
③:边沿检测
边沿检测的信号来自于滤波器的输出,在成为触发信号之前,需要进行边沿检测,决定是上升沿有效还是下降沿有效,具体的由TIMx_CCER 的位CCxP 和CCxNP 配置

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

⑤:从模式选择(配置成外部时钟模式)
选定了触发源信号后,最后我们需把信号连接到TRGI 引脚,让触发信号成为外部时钟模式1 的输入, 最终等于CK_PSC, 然后驱动计数器CNT 计数。具体的配置TIMx_SMCR 的位SMS[2:0]为000 即可选择外部时钟模式1。
⑥:使能计数器
经过上面的5 个步骤之后,最后我们只需使能计数器开始计数,外部时钟模式1 的配置就算完成。使能计数器由TIMx_CR1 的位CEN 配置。

 

外部时钟模式2

使用ETR引脚

 

内部触发输入


内部触发输入是使用一个定时器作为另一个定时器的预分频器。硬件上高级控制定时器和通用定时器在内部连接在一起,可以实现定时器同步或级联。主模式的定时器可以对从模式定时器执行复位、启动、停止或提供时钟。

 

 

2. ②控制器


高级定时器控制器部分包括触发控制器、从模式控制器以及编码器接口。触发控制器用来针对片内外设输出触发信号,比如为其它定时器提供时钟和触发DAC/ADC 转换。
编码器接口专门针对编码器计数而设计。从模式控制器可以控制计数器复位、启动、递增/递减、计数。有关控制器部分只需熟练阅读寄存器描述即可。

3. ③时基单元

高级控制定时器时基单元功能包括四个寄存器,分别是计数器寄存器(CNT)、预分频器寄存器(PSC)、自动重载寄存器(ARR)和重复计数器寄存器(RCR)。其中重复计数器RCR是高级定时器独有,通用和基本定时器没有。前面三个寄存器都是16 位有效,TIMx_RCR寄存器是8 位有效。
预分频器PSC
预分频器PSC,有一个输入时钟CK_PSC 和一个输出时钟CK_CNT。输入时钟CK_PSC 就是上面时钟源的输出,输出CK_CNT 则用来驱动计数器CNT 计数。通过设置预分频器PSC 的值可以得到不同的CK_CNT , 实际计算为: fCK_CNT 等于fCK_PSC/(PSC[15:0]+1),可以实现1 至65536 分频。
计数器CNT
高级控制定时器的计数器有三种计数模式,分别为递增计数模式、递减计数模式和递增/递减(中心对齐)计数模式。
(1) 递增计数模式,计数器从0 开始计数,每来一个CK_CNT 脉冲计数器就增加1,直到计数器的值与自动重载寄存器ARR 值相等,然后计数器又从0 开始计数并生成计数器上溢事件,计数器总是如此循环计数。如果禁用重复计数器,在计数器生成上溢事件就马上生成更新事件(UEV);如果使能重复计数器,每生成一次上溢事件重复计数器内容就减1,直到重复计数器内容为0 时才会生成更新事件。
(2) 递减计数模式,计数器从自动重载寄存器ARR 值开始计数,每来一个CK_CNT 脉冲计数器就减1,直到计数器值为0,然后计数器又从自动重载寄存器ARR 值开始递减计数并生成计数器下溢事件,计数器总是如此循环计数。如果禁用重复计数器,计数器生成下溢事件就马上生成更新事件;如果使能重复计数器,每生成一次下溢事件重复计数器内容就减1,直到重复计数器内容为0 时才会生成更新事件。
(3) 中心对齐模式下,计数器从0 开始递增计数,直到计数值等于(ARR-1)值生成计数器上溢事件,然后从ARR 值开始递减计数直到1 生成计数器下溢事件。然后又从0 开始计数,如此循环。每次发生计数器上溢和下溢事件都会生成更新事件。
自动重载寄存器ARR
自动重载寄存器ARR 用来存放与计数器CNT 比较的值,如果两个值相等就递减重复计数器。可以通过TIMx_CR1 寄存器的ARPE 位控制自动重载影子寄存器功能,如果ARPE 位置1,自动重载影子寄存器有效,只有在事件更新时才把TIMx_ARR 值赋给影子寄存器,即下一个周期赋给影子寄存器。如果ARPE 位为0,则修改TIMx_ARR 值马上有效,立即赋值给影子寄存器。
重复计数器RCR
在基本/通用定时器发生上/下溢事件时直接就生成更新事件,但对于高级控制定时器却不是这样,高级控制定时器在硬件结构上多出了重复计数器,在定时器发生上溢或下溢事件是递减重复计数器的值,只有当重复计数器为0 时才会生成更新事件。在发生N+1 个上溢或下溢事件(N 为RCR 的值)时产生更新事件。

    

4. ④输入捕获

输入捕获可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,常用的有测量输入信号的脉宽和测量PWM输入信号的频率和占空比这两种。
输入捕获的大概的原理就是,当捕获到信号的跳变沿的时候,把计数器CNT 的值锁存到捕获寄存器CCR 中,把前后两次捕获到的CCR 寄存器中的值相减,就可以算出脉宽或者频率。如果捕获的脉宽的时间长度超过你的捕获定时器的周期,就会发生溢出,这个我们需要做额外的处理。
①输入通道CH1
需要被测量的信号从定时器的外部引脚TIMx_CH1/2/3/4 进入,通常叫TI1/2/3/4,在后面的捕获讲解中对于要被测量的信号我们都以TIx 为标准叫法。
输入滤波器和边沿检测器滤波器是升频,分频器是减频)
当输入的信号存在高频干扰的时候,我们需要对输入信号进行滤波,即进行重新采样,根据采样定律,采样的频率必须大于等于两倍的输入信号。比如输入的信号为1M,又存在高频的信号干扰,那么此时就很有必要进行滤波,我们可以设置采样频率为2M,这样可以在保证采样到有效信号的基础上把高于2M 的高频干扰信号过滤掉。
滤波器的配置由CR1 寄存器的位CKD[1:0]和CCMR1/2 的位ICxF[3:0]控制。从ICxF位的描述可知,采样频率fSAMPLE 可以由fCK_INT 和fDTS分频后的时钟提供,其中是fCK_INT内部时钟,fDTS 是fCK_INT 经过分频后得到的频率,分频因子由CKD[1:0]决定,可以是不分频,2 分频或者是4 分频。

边沿检测器用来设置信号在捕获的时候是什么边沿有效,可以是上升沿,下降沿,或者是双边沿,具体的由CCER 寄存器的位CCxP 和CCxNP 决定。
③捕获通道IC1 IC2
捕获通道就是图中的IC1/2/3/4,每个捕获通道都有相对应的捕获寄存器CCR1/2/3/4,当发生捕获的时候,计数器CNT 的值就会被锁存到捕获寄存器中。这里我们要搞清楚输入通道和捕获通道的区别,输入通道是用来输入信号的,捕获通道是用来捕获输入信号的通道,一个输入通道的信号可以同时输入给两个捕获通道。比如输入通道TI1 的信号经过滤波边沿检测器之后的TI1FP1 和TI1FP2 可以进入到捕获通道IC1 和IC2,其实这就是我们后面要讲的PWM 输入捕获,只有一路输入信号(TI1)却占用了两个捕获通道(IC1 和IC2)。当只需要测量输入信号的脉宽时候,用一个捕获通道即可。输入通道和捕获通道的映射关系具体由寄存器CCMRx 的位CCxS[1:0]配置
④预分频器
ICx 的输出信号会经过一个预分频器,用于决定发生多少个事件时进行一次捕获。具体的由寄存器CCMRx 的位ICxPSC 配置,如果希望捕获信号的每一个边沿,则不分频。
捕获寄存器CCR
经过预分频器的信号ICxPS 是最终被捕获的信号,当发生捕获时(第一次),计数器CNT 的值会被锁存到捕获寄存器CCR 中,还会产生CCxI 中断,相应的中断位CCxIF(在SR 寄存器中)会被置位,通过软件或者读取CCR 中的值可以将CCxIF 清0。如果发生第二次捕获(即重复捕获:CCR 寄存器中已捕获到计数器值且 CCxIF 标志已置 1),则捕获溢出标志位CCxOF(在SR 寄存器中)会被置位,CCxOF 只能通过软件清零

 

5. ⑤输出比较

 

输出比较就是通过定时器的外部引脚对外输出控制信号,将通道X(x=1,2,3,4)设置为匹配时输出有效电平、无效电平、翻转、强制变为无效电平、强制变为有效电平、PWM1 和PWM2 这八种模式,具体使用哪种模式由寄存器CCMRx 的位OCxM[2:0]配置。其中PWM 模式是输出比较中的特例,使用的也最多。
比较寄存器
计数器CNT 的值跟比较寄存器CCR 的值相等的时候,输出参考信号OCxREF 的信号的极性就会改变,其中OCxREF=1(高电平)称之为有效电平,OCxREF=0(低电平)称之为无效电平,并且会产生比较中断CCxI,相应的标志位CCxIF(SR 寄存器中)会置位。然后OCxREF 再经过一系列的控制之后就成为真正的输出信号OCx/OCxN。
②死区发生器
在生成的参考波形OCxREF 的基础上,可以插入死区时间,用于生成两路互补的输出信号OCx 和OCxN,死区时间的大小具体由BDTR 寄存器的位DTG[7:0]配置。死区时间的大小必须根据与输出信号相连接的器件及其特性来调整

 

③输出控制(输出极性和使能控制)

在输出比较的输出控制中,参考信号OCxREF 在经过死区发生器之后会产生两路带死区的互补信号OCx_DT 和OCxN_DT(通道1~3 才有互补信号,通道4 没有,其余跟通道1~3 一样),这两路带死区的互补信号然后就进入输出控制电路。

如果没有加入死区控制,那么进入输出控制电路的信号就直接是OCxREF,进入输出控制电路的信号会被分成两路,一路是原始信号,一路是被反向的信号,

由寄存器CCER 的位CCxP 和CCxNP 控制OC1、OC1N哪路输出原始信号或反向信号,然后输出到外部引脚OC1\OC1N,再由寄存器CCER 的位CxE/CxNE 配置使能输出
如果加入了断路(刹车)功能,则断路和死区寄存器BDTR 的MOE、OSSI 和OSSR这三个位会共同影响输出的信号。
④输出引脚
输出比较的输出信号最终是通过定时器的外部IO 来输出的,分别为CH1/2/3/4,其中前面三个通道还有互补的输出通道CH1/2/3N

6. ⑥断路功能暂时没有用到,略过



断路功能就是电机控制的刹车功能,使能断路功能时,根据相关控制位状态修改输出信号电平。在任何情况下,OCx 和OCxN 输出都不能同时为有效电平,这关系到电机控制常用的H 桥电路结构原因,造成短路。
断路源可以是时钟故障事件,由内部复位时钟控制器中的时钟安全系统(CSS)生成,也可以是外部断路输入IO,两者是或运算关系。
系统复位启动都默认关闭断路功能,将断路和死区寄存器(TIMx_BDTR)的BKE 为置1,使能断路功能。可通过TIMx_BDTR 寄存器的BKP 位设置设置断路输入引脚的有效电平,设置为1 时输入BRK 为高电平有效,否则低电平有效。
发送断路时,将产生以下效果:

 TIMx_BDTR 寄存器中主输出模式使能(MOE)位被清零,输出处于无效、空闲或复位状态;
根据相关控制位状态控制输出通道引脚电平;当使能通道互补输出时,会根据情况自动控制输出通道电平;
 将TIMx_SR 寄存器中的 BIF 位置 1,并可产生中断和DMA 传输请求。
 如果 TIMx_BDTR 寄存器中的 自动输出使能(AOE)位置 1,则MOE 位会在发生下一个UEV 事件时自动再次置 1。

 

32.3 输入捕获应用


输入捕获一般应用在两个方面,一个方面是脉冲跳变沿时间测量,另一方面是PWM输入测量。

32.3.1 测量脉宽或者频率

1. 测量频率
当捕获通道TIx 上出现上升沿时,发生第一次捕获,计数器CNT 的值会被锁存到捕获寄存器CCR 中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到value1 中。当出现第二次上升沿时,发生第二次捕获,计数器CNT 的值会再次被锁存到捕获寄存器CCR 中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到value3 中,并清除捕获记录标志。利用value3 和value1 的差值我们就可以算出信号的周期(频率)。
2. 测量脉宽
当捕获通道TIx 上出现上升沿时,发生第一次捕获,计数器CNT 的值会被锁存到捕获寄存器CCR 中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到value1 中。然后把捕获边沿改变为下降沿捕获,目的是捕获后面的下降沿。当下降沿到来的时候,发生第二次捕获,计数器CNT 的值会再次被锁存到捕获寄存器CCR 中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到value3 中,并清除捕获记录标志。然后把捕获边沿设置为上升沿捕获。

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


32.3.2 PWM输入模式


测量脉宽和频率还有一个更简便的方法就是使用PWM 输入模式,该模式是输入捕获的特例,只能使用通道1 和通道2,通道3 和通道4 使用不了。与上面那种只使用一个捕获寄存器测量脉宽和频率的方法相比,PWM输入模式需要占用两个捕获寄存器。
 


当使用PWM 输入模式的时候,因为一个输入通道(TIx)会占用两个捕获通道(ICx),所以一个定时器在使用PWM输入的时候使用两个输入通道(TIx)。我们以输入通道TI1 工作在PWM 输入模式为例来讲解下具体的工作原理,其他通道以此类推即可。
PWM 信号由输入通道TI1 进入,因为是PWM 输入模式的缘故,信号会被分为两路,一路是TI1FP1,另外一路是TI2FP2。其中一路是周期,另一路是占空比,具体哪一路信号对应周期还是占空比,得从程序上设置哪一路信号作为触发输入,作为触发输入的那一路信号对应的就是周期,另一路就是对应占空比。作为触发输入的那一路信号还需要设置极性,是上升沿还是下降沿捕获,一旦设置好触发输入的极性,另外一路硬件就会自动配置为相反的极性捕获,无需软件配置。

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

PWM 信号由输入通道TI1 进入,配置TI1FP1 为触发信号,上升沿捕获。当上升沿的时候IC1 和IC2 同时捕获,见上面功能框图,计数器CNT 清零,到了下降沿的时候,IC2 捕获,此时计数器CNT 的值被锁存到捕获寄存器CCR2 中,到了下一个上升沿的时候,IC1 捕获,计数器CNT 的值被锁存到捕获寄存器CCR1 中。其中CCR2+1 测量的是脉宽CCR1+1 测量的是周期。这里要注意的是CCR2 和CCR1 的值在计算占空比和频率的时候都必须加1,因为计数器是从0 开始计数的。
从软件上来说,用PWM 输入模式测量脉宽和周期更容易,付出的代价是需要占用两个捕获寄存器。

32.4 输出比较应用


输出比较模式总共有8 种,具体的由寄存器CCMRx 的位OCxM[2:0]配置。我们这里只讲解最常用的PWM模式,其他几种模式具体的看数据手册即可。


32.4.1 PWM输出模式


PWM 输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装寄存器ARR 的值决定,占空比由比较寄存器CCR 的值决定
PWM 模式分为两种,PWM1 和PWM2,总得来说是差不多,就看你怎么用而已,具体的区别见表格 32-1。
表格 32-1 PWM1 与PWM2 模式的区别
模式           计数器CNT                 计算方式                  说明
PWM1     递增 CNT<CCR,      通道CH 为有效,      否则为无效
               递减 CNT>CCR,      通道CH 为无效,      否则为有效
PWM2     递增 CNT<CCR,      通道CH 为无效,      否则为有效
               递减 CNT>CCR,      通道CH 为有效,      否则为无效


下面我们以PWM1 模式来讲解,以计数器CNT 计数的方向不同还分为边沿对齐模式和中心对齐模式。PWM 信号主要都是用来控制电机,一般的电机控制用的都是边沿对齐
模式,FOC 电机一般用中心对齐模式。我们这里只分析这两种模式在信号感官上(即信号波形)的区别,具体在电机控制中的区别不做讨论。

1. PWM边沿对齐模式
在递增计数模式下,计数器从 0 计数到自动重载值( TIMx_ARR 寄存器的内容),然后重新从 0 开始计数并生成计数器上溢事件

CC1OF:捕获/比较1重复捕获标记;CC1IF:捕获/比较1中断标记 ;UIF:更新中断标记 (Update interrupt flag)

在边沿对齐模式下,计数器CNT 只工作在一种模式,递增或者递减模式。这里我们以CNT 工作在递增模式为例,图中,ARR=8,CCR=4,CNT 从0 开始计数,当CNT<CCR 的值时,OCxREF 为有效的高电平, 于此同时, 比较中断寄存器CCxIF 置位。CCR=<CNT<=ARR 时,OCxREF 为无效的低电平。然后CNT 又从0 开始计数并生成计数器上溢事件,以此循环往复。
2. PWM中心对齐模式

在中心对齐模式下,计数器CNT 是工作做递增/递减模式下。开始的时候,计数器CNT 从 0 开始计数到自动重载值减1(ARR-1),生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。
图 32-14 是PWM1 模式的中心对齐波形,ARR=8,CCR=4。第一阶段计数器CNT 工作在递增模式下,从0 开始计数,当CNT<CCR 的值时,OCxREF 为有效的高电平,当CCR=<CNT<<ARR 时,OCxREF 为无效的低电平递增是从0到7,递减是从8到1.

第二阶段计数器CNT 工作在递减模式从ARR 的值开始递减,当CNT>CCR 时,OCxREF 为无效的低电平,当CCR=>CNT>=1时,OCxREF 为有效的高电平
在波形图上我们把波形分为两个阶段,第一个阶段是计数器CNT 工作在递增模式的波形,这个阶段我们又分为①和②两个阶段,第二个阶段是计数器CNT 工作在递减模式的波形,这个阶段我们又分为③和④两个阶段。要说中心对齐模式下的波形有什么特征的话,那就是①和③阶段的时间相等,②和④阶段的时间相等。


中心对齐模式又分为中心对齐模式1/2/3 三种,具体由寄存器CR1 位CMS[1:0]配置。具体的区别就是比较中断中断标志位CCxIF 在何时置1:中心模式1 在CNT 递减计数的时候置1,中心对齐模式2 在CNT 递增计数时置1,中心模式3 在CNT 递增和递减计数时都置1。


32.5 定时器初始化结构体详解


在标准库函数头文件stm32f1xx_tim.h 中对定时器外设建立了四个初始化结构体,分别为时基初始化结构体TIM_TimeBaseInitTypeDef 、输出比较初始化结构体TIM_OCInitTypeDef、输入捕获初始化结构体TIM_ICInitTypeDef 和断路和死区初始化结构体TIM_BDTRInitTypeDef,高级控制定时器可以用到所有初始化结构体,通用定时器不能使用TIM_BDTRInitTypeDef 结构体,基本定时器只能使用时基结构体。接下来我们具体讲解下这四个结构体。


1. 时基初始化结构体TIM_TimeBaseInitTypeDef


时基结构体TIM_TimeBaseInitTypeDef 用于定时器基础参数设置,与TIM_TimeBaseInit 函数配合使用完成配置。

//定时器基本初始化结构体
1 typedef struct {
2 uint16_t TIM_Prescaler; // 预分频器
3 uint16_t TIM_CounterMode; // 计数模式
4 uint32_t TIM_Period; // 定时器周期
5 uint16_t TIM_ClockDivision; // 时钟分频
6 uint8_t TIM_RepetitionCounter; // 重复计算器
7 } TIM_TimeBaseInitTypeDef;

(5) TIM_Prescaler:定时器预分频器设置,时钟源经该预分频器才是定时器计数时钟CK_CNT,它设定PSC 寄存器的值。计算公式为:计数器时钟频率 (fCK_CNT) 等于fCK_PSC / (PSC[15:0] + 1),可实现1 至65536 分频。



(7) TIM_Period:定时器周期,实际就是设定自动重载寄存器ARR 的值,ARR 为要装载到实际自动重载寄存器(即影子寄存器)的值,可设置范围为0 至65535。

(6) TIM_CounterMode:DIR CMS 定时器计数方式,可设置为向上计数、向下计数以及中心对齐。高级控制定时器允许选择任意一种。

(8) TIM_ClockDivision:寄存器位CKD,设置定时器时钟CK_INT 频率与死区发生器数字滤波器采样时钟频率分频比。可以选择1、2、4 分频。

 

CEN:使能计数器

DIR:计数方向 (Direction)

CMS[1:0]:选择中央对齐模式 (Center-aligned mode selection) 位6:5 。00:边沿对齐模式。计数器依据方向位(DIR)向上或向下计数。

ARPE:自动重装载预装载允许位 (Auto-reload preload enable) 位7 。0:TIMx_ARR寄存器没有缓冲; 1:TIMx_ARR寄存器被装入缓冲器。

CKD[1:0]: 时钟分频因子 (Clock division) ,结构体TIM_ClockDivision:时钟分频,

(9) TIM_RepetitionCounter:重复计数器,只有8 位,只存在于高级定时器。

2. 输出比较初始化结构体TIM_OCInitTypeDef


输出比较结构体TIM_OCInitTypeDef 用于输出比较模式,与TIM_OCxInit 函数配合使用完成指定定时器输出通道初始化配置。高级控制定时器有四个定时器通道,使用时都必须单独设置。

//代码清单 32-2 定时器比较输出初始化结构体
1 typedef struct {
2 uint16_t TIM_OCMode; // 比较输出模式
3 uint16_t TIM_OutputState; // 比较输出使能
4 uint16_t TIM_OutputNState; // 比较互补输出使能
5 uint32_t TIM_Pulse; // 脉冲宽度
6 uint16_t TIM_OCPolarity; // 输出极性
7 uint16_t TIM_OCNPolarity; // 互补输出极性
8 uint16_t TIM_OCIdleState; // 空闲状态下比较输出状态
9 uint16_t TIM_OCNIdleState; // 空闲状态下比较互补输出状态
10 } TIM_OCInitTypeDef;

(1) TIM_OCMode:比较输出模式选择,总共有八种,常用的为PWM1/PWM2。它设定CCMRx 寄存器OCxM[2:0]位的值。

输出比较模式:

CC1S[1:0]:捕获/比较1 选择 (Capture/Compare 1 selection) 位1:0 这2位定义通道的方向(输入/输出),及输入脚的选择: 00:CC1通道被配置为输出;

OC1PE:输出比较1预装载使能 (Output compare 1 preload enable) 位3. 0:禁止TIMx_CCR1寄存器的预装载功能,可随时写入TIMx_CCR1寄存器,并且新写入的数值立即起作用。

OC1M[2:0]:输出比较1模式,110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

 

(2) TIM_OutputState:比较输出使能,决定最终的输出比较信号OCx 是否通过外部引脚输出。它设定TIMx_CCER 寄存器CCxE/CCxNE 位的值。
(3) TIM_OutputNState:比较互补输出使能,决定OCx 的互补信号OCxN 是否通过外部引脚输出。它设定CCER 寄存器CCxNE 位的值。
(5) TIM_OCPolarity:比较输出极性,可选OCx 为高电平有效或低电平有效。它决定着定时器通道有效电平。它设定CCER 寄存器的CCxP 位的值。
(6) TIM_OCNPolarity:比较互补输出极性,可选OCxN 为高电平有效或低电平有效。它设定TIMx_CCER 寄存器的CCxNP 位的值。

 

CC1E:输入/捕获1输出使能

CC1NE: 互补使能

CC1P:输入/捕获1输出极性 (Capture/Compare 1 output polarity) 位1 。CC1通道配置为输出: 0:OC1高电平有效 1:OC1低电平有效。

             CC1通道配置为输入: 该位选择是IC1还是IC1的反相信号作为触发或捕获信号。 0:不反相:捕获发生在IC1的上升沿;当用作外部触发器时,IC1不反相。

 


(7) TIM_OCIdleState:空闲状态时通道输出电平设置,可选输出1 或输出0,即在空闲状态(BDTR_MOE 位为0)时,经过死区时间后定时器通道输出高电平或低电平。它设定CR2 寄存器的OISx 位的值。
(8) TIM_OCNIdleState:空闲状态时互补通道输出电平设置,可选输出1 或输出0,即在空闲状态(BDTR_MOE 位为0)时,经过死区时间后定时器互补通道输出高电平或低电平。它设定是CR2 寄存器的OISxN 位的值。

(4) TIM_Pulse:比较输出脉冲宽度,实际设定比较寄存器CCR 的值,决定脉冲宽度。可设置范围为0 至65535。

 

3. 输入捕获初始化结构体TIM_ICInitTypeDef


输入捕获结构体TIM_ICInitTypeDef 用于输入捕获模式,与TIM_ICInit 函数配合使用完成定时器输入通道初始化配置。如果使用PWM 输入模式需要与TIM_PWMIConfig 函数配合使用完成定时器输入通道初始化配置。

代码清单 32-3 定时器输入捕获初始化结构体
1 typedef struct {
2 uint16_t TIM_Channel; // 输入通道选择
3 uint16_t TIM_ICPolarity; // 输入捕获触发选择
4 uint16_t TIM_ICSelection; // 输入捕获选择
5 uint16_t TIM_ICPrescaler; // 输入捕获预分频器
6 uint16_t TIM_ICFilter; // 输入捕获滤波器
7 } TIM_ICInitTypeDef;

(1) TIM_Channel:捕获通道ICx 选择,可选TIM_Channel_1、TIM_Channel_2、TIM_Channel_3 或TIM_Channel_4 四个通道。它设定CCMRx 寄存器CCxS 位 的值。

(3) TIM_ICSelection:输入通道选择,捕获通道ICx 的信号可来自三个输入通道,分别为TIM_ICSelection_DirectTI、TIM_ICSelection_IndirectTI 或TIM_ICSelection_TRC,具体的区别见图 32-15。如果是普通的输入捕获,4 个通道都可以使用,如果是PWM输入则只能使用通道1 和通道2。它设定CCRMx 寄存器的CCxS[1:0]位的值。
 

(4) TIM_ICPrescaler:输入捕获通道预分频器,可设置1、2、4、8 分频,它设定CCMRx寄存器的ICxPSC[1:0]位的值。如果需要捕获输入信号的每个有效边沿,则设置1 分频即可。
(5) TIM_ICFilter:输入捕获滤波器设置,可选设置0x0 至0x0F。它设定CCMRx 寄存器ICxF[3:0]位的值。一般我们不使用滤波器,即设置为0。

 

 

输入捕获模式:

CC1S[1:0]:捕获/比较1选择 。 01:TIM_Channel_1 CC1通道被配置为输入,IC1映射在TI1上;10:CC1通道被配置为输入,IC1映射在TI2上;

IC1PSC[1:0]:输入/捕获1预分频器 (Input capture 1 prescaler) 位3:2 这2位定义了CC1输入(IC1)的预分频系数。 00:无预分频器,捕获输入口上检测到的每一个边沿都触发一次捕获;

IC1F[3:0]:输入捕获1滤波器 (Input capture 1 filter),这几位定义了TI1输入的采样频率及数字滤波器长度。数字滤波器由一个事件计数器组成,它记录到N个事件后会产生一个输出的跳变:0000:无滤波器,以fDTS采样 ,0001:采样频率fSAMPLING=fCK_INT,N=2,1000:采样频率fSAMPLING=fDTS/8,N=6

 

(2) TIM_ICPolarity:输入捕获边沿触发选择,可选上升沿触发、下降沿触发或边沿跳变触发。它设定CCER 寄存器CCxP 位和CCxNP 位的值。

 

CC1E:输入/捕获1输出使能

CC1NE: 互补使能

CC1P:输入/捕获1输出极性 (Capture/Compare 1 output polarity) 位1 。CC1通道配置为输出: 0:OC1高电平有效 1:OC1低电平有效。

             CC1通道配置为输入: 该位选择是IC1还是IC1的反相信号作为触发或捕获信号。 0:不反相:捕获发生在IC1的上升沿;当用作外部触发器时,IC1不反相。

 

4. 断路和死区初始化结构体TIM_BDTRInitTypeDef(暂时没有用到,略过


断路和死区结构体TIM_BDTRInitTypeDef 用于断路和死区参数的设置,属于高级定时器专用,用于配置断路时通道输出状态,以及死区时间。它与TIM_BDTRConfig 函数配置使用完成参数配置。这个结构体的成员只对应BDTR 这个寄存器。

代码清单 32-4 断路和死区初始化结构体
1 typedef struct {
2 uint16_t TIM_OSSRState; // 运行模式下的关闭状态选择
3 uint16_t TIM_OSSIState; // 空闲模式下的关闭状态选择
4 uint16_t TIM_LOCKLevel; // 锁定配置
5 uint16_t TIM_DeadTime; // 死区时间
6 uint16_t TIM_Break; // 断路输入使能控制
7 uint16_t TIM_BreakPolarity; // 断路输入极性
8 uint16_t TIM_AutomaticOutput; // 自动输出使能
9 } TIM_BDTRInitTypeDef;

(1) TIM_OSSRState:运行模式下的关闭状态选择,它设定BDTR 寄存器OSSR 位的值。
(2) TIM_OSSIState:空闲模式下的关闭状态选择,它设定BDTR 寄存器OSSI 位的值。

(3) TIM_LOCKLevel:锁定级别配置, BDTR 寄存器LOCK[1:0]位的值。
(4) TIM_DeadTime:配置死区发生器,定义死区持续时间,可选设置范围为0x0 至0xFF。它设定BDTR 寄存器DTG[7:0]位的值。
(5) TIM_Break:断路输入功能选择,可选使能或禁止。它设定BDTR 寄存器BKE 位的值。
(6) TIM_BreakPolarity:断路输入通道BRK 极性选择,可选高电平有效或低电平有效。它设定BDTR 寄存器BKP 位的值。
(7) TIM_AutomaticOutput:自动输出使能,可选使能或禁止,它设定BDTR 寄存器AOE位的值。

MOE: 主输出使能 (Main output enable) 位15。 一旦刹车输入有效,该位被硬件异步清’0’。 0:禁止OC和OCN输出或强制为空闲状态; 1:如果设置了相应的使能位(TIMx_CCER寄存器的CCxE、CCxNE位),则开启OC和OCN输出。高级定时器独有。  

 // 主输出使能,当使用的是通用定时器时,这句不需要
    TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);

AOE: 自动输出使能 (Automatic output enable) 位14。 0:MOE只能被软件置’1’; 1:MOE能被软件置’1’或在下一个更新事件被自动置’1’(如果刹车输入无效)。????

BKP: 刹车输入极性 (Break polarity) 位13 0:刹车输入低电平有效; 1:刹车输入高电平有效。

BKE: 刹车功能使能 (Break enable) 位12 0:禁止刹车输入(BRK及CCS时钟失效事件); 1:开启刹车输入(BRK及CCS时钟失效事件)。

LOOK[1:0]: 锁定设置 (Lock configuration) 位9:8 该位为防止软件错误而提供写保护。 00:锁定关闭,寄存器无写保护;

UTG[7:0]: 死区发生器设置 (Dead-time generator setup) 位7:0 这些位定义了死区持续时间

 

 

SMS[2:0]:从模式选择。 000:关闭从模式 – 如果CEN=1,则预分频器直接由内部时钟驱动。 001:编码器模式1 – 根据TI1FP1的电平,计数器在TI2FP2的边沿向上/下计数。 010:编码器模式2 – 根据TI2FP2的电平,计数器在TI1FP1的边沿向上/下计数。 011:编码器模式3 – 根据另一个信号的输入电平,计数器在TI1FP1和TI2FP2的边沿向上/下计数。

 

32.6PWM互补输出实验程序

32.7  脉宽测量输入捕获实验程序

32.8  PWM输入捕获实验程序

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值