【通用定时器TIM2 TIM3 TIM4 TIM5】
通用定时器
通用定时器在基础定时器的基础上增加了一些功能,比如:输入捕获、输出比较、输出pwm和单脉冲模式等。
我们先来看框图,相对比较复杂,但是一部分一部分看,然后再串通起来,就可以懂了。所以切不要急。
① 时钟源(关于STM32定时器的时钟源的选择)
(1)内部时钟(CK_INT)
CK_INT = (APB1 预分频系数 >= 2 ) ? (APB1时钟 * 2) : (APB1时钟)
(2) 外部时钟模式1:外部输入引脚TIx(1,2)
外部输入引脚TIx(1,2)即只能来自定时器的通道1或者2。图上TI1F_ED、TI1FP1、TI2FP2
外部时钟源信号->IO->TIMx_CH1/2(不能CH3、CH4);IO口用作定时器外部时钟源信号,配置IO的复用功能。
1)TI2经过滤波器(TIMx_CCMR1的ICF[3:0]),接着经过边沿检测器,通过TIMx_CCER的CC2P位设置检测的边沿,可以是TI2F_Rising、TI2F_Falling。
2)接着通过触发输入选择器(TIMx_SMCR的TS[2:0]),选择TRGI的来源(TI1_ED即CH1的双边沿信号、TI1FP1即CH1经过CC2P边沿检测后的信号、TI2FP2即CH2经过CC2P边沿检测后的信号);如图,TS设置110,则选择TI2FP2作为TRGI的来源。
3)最后经过从模式选择器(SMS[2:0]),选择定时器的时钟源(CK_PSC),CK_PSC经过定时器的预分频器分频后,得到计数器频率CK_CNT。如图,ECE(外部时钟使能位,该位启用外部时钟模式2)设置0,SMS[2:0]设置111,则选择外部时钟模式1。
(3)外部时钟模式2:外部触发输入(ETR)
外部时钟源信号→IO→TIMx_ETR
1)ETR引脚输入经过外部触发极性选择器(ETP位),当选择下降沿有效的话,信号会经过反相器。
2)接着经过外部触发预分频器(ETPS[1:0])。
3)接着经过滤波器(ETF[3:0])。fDTS由TIMx_CR1寄存器CKD位设置。CKD位:时钟分频因子。
4)最后经过从模式选择器(SMS[2:0]),选择外部时钟模式2。如图,ECE设置1即可。
(4)内部触发输入(ITRx)
使用一个定时器作为另一个定时器的预分频器,即实现定时器的级联。
从定时器 | 从定时器的ITR0(TS=000) | 从定时器的ITR1(TS=001) | 从定时器的ITR2(TS=010) | 从定时器的ITR3(TS=011) |
TIM1 | 主定时器TIM5_TRGO | 主定时器TIM2_TRGO | 主定时器TIM3_TRGO | 主定时器TIM4_TRGO |
TIM2 | 主定时器TIM1_TRGO | 主定时器TIM8_TRGO | 主定时器TIM3_TRGO | 主定时器TIM4_TRGO |
TIM3 | 主定时器TIM1_TRGO | 主定时器TIM2_TRGO | 主定时器TIM5_TRGO | 主定时器TIM4_TRGO |
TIM4 | 主定时器TIM1_TRGO | 主定时器TIM2_TRGO | 主定时器TIM3_TRGO | 主定时器TIM8_TRGO |
TIM5 | 主定时器TIM2_TRGO | 主定时器TIM3_TRGO | 主定时器TIM4_TRGO | 主定时器TIM8_TRGO |
TIM8 | 主定时器TIM1_TRGO | 主定时器TIM2_TRGO | 主定时器TIM4_TRGO | 主定时器TIM5_TRGO |
如图如表所示,定时器1作为定时器2的预分频器。
1)定时器1主模式选择器(TIM1_CR2的MMS[2:0])设置010,即主模式选择为更新(选择更新事件作为触发输出(TRGO1))。
2)定时器2从模式控制寄存器(TIM2_SMCR)的TS[2:0]位设置000,即使用ITR1作为内部触发。再经过从模式控制器(SMS)得到CK_PSC。 SMS[2:0]设置111,即从模式控制器选择外部时钟模式1。
② 控制器
控制器包括:从模式下定时器触发控制器(管理TRGI)、编码器接口和主模式下定时器触发控制器(管理TRGO)。从模式下定时器触发控制器,通过选择TRGI通道上的输入信号源,可以控制计数器复位、启动、递增/递减、计数。编码器接口针对编码器计数。主模式下定时器触发控制器用来提供触发信号给别的外设,比如为其它定时器提供时钟、启动信号等或者为 DAC/ADC 的触发转换提供TRGO输出信号。
③时基单元
(1) 时基单元包括:计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR)。
(2) 定时器的计数模式有三种:递增计数模式、递减计数模式、中心对齐计数模式。
1) 递增和递减模式都熟悉,不解释。
2) 中心对齐计数模式:计数器先从0开始递增计数,直到计数器值等于自动重装载寄存器影子寄存器值减1时,定时器上溢,产生更新事件,然后从自动重装载寄存器影子寄存器值开始递减计数,直到计数值等于1时,定时器下溢,产生更新事件,然后又从0开始递增计数,依次循环。
3) 计数器模式设置由TIMx_CR1寄存器的CMS和DIR位控制。
- 边沿对齐模式(递增计数模式和递减计数模式)(CMS=00):递增计数模式和递减计数模式。
- 中央对齐模式1(CMS=01):输出比较中断标志位CCxIF(当TIMx_CCMRx寄存器中CCxS=00配置为输出比较的时候)只在计数器向下计数时被设置
- 中央对齐模式2(CMS=10):输出比较中断标志位CCxIF(当TIMx_CCMRx寄存器中CCxS=00配置为输出比较的时候)只在计数器向上计数时被设置
- 中央对齐模式3(CMS=11):输出比较中断标志位在计数器CCxIF(当TIMx_CCMRx寄存器中CCxS=00配置为输出比较的时候)向上和向下计数时均被设置

④输入捕获
(1)TI1经过一个滤波器,由TIMx_CCMR1的ICF[3:0]位设置滤波方式。再经过边沿检测器,由捕获/比较使能寄存器(TIMx_CCER) 的 CC1P 位来设置检测的边沿,可以上升沿或者下降沿检测。CC1NP是配置互补通道的边沿检测的,在高级定时器才有,通用定时器没有。
fDTS由TIMx_CR1 寄存器的 CKD 位设置。
(2)然后经过捕获/比较1选择器(CC1S[1:0]),选择将IC1映射在TI1、TI2或者TRC。如图,设置CC1S[1:0]为01,即CC1通道被配置为输入,IC1映射在TI1上;
(3)接着经过输入捕获1预分频器,由ICPS[1:0]位设置预分频系数。然后把CCIE位置1,使能输入捕获,IC1PS就是分频后的捕获信号。
⑤ 输入捕获和输出比较公共部分
(1)输入捕获功能部分
结合④输入捕获,我们从图中(非阴影部分)可以看到:
- CC1S配置为01,即CC1通道被配置为输入,IC1映射在TI1上;
- IC1PS是分频后的捕获信号;
- CC1E位置1捕获使能。
软件产生捕获事件:CC1G位可以产生软件捕获事件;
硬件产生捕获事件:比如检测上升沿信号,当上升沿到来时,IC1PS信号就会触发输入捕获事件发生,计数器的值就会被锁存在捕获/比较影子寄存器中。当没有CCR1读操作时,捕获/比较影子寄存器里的值就会锁存到 CCR1 寄存器中,程序员就可读取CCR1寄存器值,获得计数器得计数值。
(2)输出比较功能部分
- 程序员写CCR1寄存器,即写入比较值;
- CC1S设置为00,即CC1通道被配置为输出;
- OC1PE预装载使能,如果设置1,则或门输出就是UEV的值。
图中(非阴影区域)可以看到:捕获/比较预装载寄存值要转移到捕获/比较影子寄存器通过一个与门控制,与门输入分别是CCR1写入操作、CC1S是否配置为00,OC1PE、UEV通过或门得输出,所以捕获/比较预装载寄存值要转移到捕获/比较影子寄存器要满足三个条件:CCR1 不在写入操作期间、CC1S[1:0] = 00 配置为输出、OC1PE 位置0(或者 OC1PE 位置 1,并且需要发生更新事件,这个更新事件可以软件产生或者硬件产生)。
当 CCR1 寄存器的值转移到其影子寄存器后,新的值就会和计数器的值进行比较。
⑥输出比较
图中可知:
(1)oc1ref是输出参考信号,高电平有效,低电平无效。它的高低电平受三个方面影响:
1)由⑤中的输出比较功能部分得的比较结果;
- 当计数器的值和捕获/比较寄存器的值相等时,输出参考信号 oc1ref 的极性就会设定为我们预先配置好的值;
- 如果开启了比较中断,还会发生比较中断。
2)输出比较1模式OC1M[2:0]设置为输出比较模式;
输出参考信号 oc1ref 的极性就会根据我们选择的输出比较模式而改变。
OCxM[2:0]模式 | 功能 | 备注 |
000 | 冻结模式(TIM_OCMode_Timing): OC1REF和TIMx_CCRx及TIMx_CNT无关 | 引脚和定时器比较结果无关 定时器仅为时基类应用 |
001 | 相等则有效模式(TIM_OCMode_Active): TIMx_CNT = TIMx_CCRx,OCxREF= 1 | 从匹配时刻起,引脚一直输出有效电平 |
010 | 相等则无效模式(TIM_OCMode_Inactive): TIMx_CNT = TIMx_CCRx,OCxREF= 0 | 从匹配时刻起,引脚一直输出无效电平 |
011 | 相等则翻转模式(TIM_OCMode_Toggle): TIMx_CNT = TIMx_CCRx,OCxREF翻转 | 引脚输出方波频率 |
100 | 软件强制无效模式(TIM_ForcedAction_InActive): 与TIMx_CCRx及TIMx_CNT无关,OCxREF= 0 | 软件设置引脚为无效状态 |
101 | 软件强制有效模式(TIM_ForcedAction_Active): 与TIMx_CCRx及TIMx_CNT无关,OCxREF= 1 | 软件设置引脚为有效状态 |
OCxM[2:0]模式 | 功能 | 备注 |
110 | PWM1模式(TIM_OCMode_PWM1): 向上计数时,在TIMx_CNT<TIMx_CCRx时OCxREF= 1,否则OCxREF= 0 在向下计数时,TIMx_CNT>TIMx_CCRx时OC1REF= 0,否则OC1REF= 1 | PWM输出模式 |
111 | PWM2模式(TIM_OCMode_PWM2): 和PWM1相比,比较结果OCxREF恰好相反 | PWM输出模式 |
3)ETRF由OC1CE位配置。
- OC1CE位是输出比较通道1清零使能位。
- 0:OC1REF 不受ETRF输入的影响;
- 1:一旦检测到ETRF输入高电平,清除OC1REF=0。
(2)oc1ref信号经过通道输出极性选择(CC1P),再到输出使能电路,由通道输出使能(CC1E)控制,输出OC1信号。