STM32F407定时器基本特性汇总
通用定时器简介
STM32F407通用定时器数量较多,其特性也有一些的差异(如上表所示),但是基本原理都一样。
1、通用定时器主要特性
①16位递增、递减、中心对齐计数器(计数值:0~65535);
②16位预分频器(分频系数:1~65536);
③可用于触发DAC、ADC;
④在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求;
⑤4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式;
⑥使用外部信号控制定时器且可实现多个定时器互连的同步电路
支持编码器和霍尔传感器电路等;
2、通用定时器结构框图
①时钟源
通用定时器时钟可以选择下面四类时钟源之一:
1)内部时钟(CK_INT);
2)外部时钟模式 1:外部输入引脚(TIx),x=1,2(即只能来自于通道 1 或者通道 2);
3)外部时钟模式 2:外部触发输入(ETR);
4)内部触发输入(ITRx):使用一个定时器作为另一定时器的预分频器;
四类时钟源如下图所示,
通用定时器时钟源的设置方法如下表所示:
下面将详细介绍这四种时钟源,
1)内部时钟(CK_INT)
STM32F4 系列的定时器 TIM2/TIM3/TIM4/TIM5/ TIM6/TIM7/ TIM12/ TIM13/ TIM14 都是挂载在 APB1 总线上的,这些定时器的内部时钟(CK_INT)实际上来自于 APB1 总线提供的时钟。但是这些定时器时钟不是由 APB1 总线直接提供,而是要先经过一个倍频器。系统时钟初始化函数 sys_stm32_clock_init()可以设置APB1总线时钟频率和预分频器的预分频系数。当 APB1 预分频器的预分频系数≥2分频时,挂载在 APB1 总线上的定时器时钟频率是该总线时钟频率的两倍(这一点和基本定时器是一样的,可回顾基本定时器文章)。例如,设置 APB1 总线时钟频率为 42MHz,APB1 预分频器的预分频系数为 2,则这些定时器时钟源频率为 84MHz。
APB2 总线上挂载的定时器有通用定时器 TIM9/TIM10/TIM11和高级定时器 TIM1/TIM8,它们的情况和上文的叙述一样,不同点是,定时器挂载的总线变成了 APB2,但是总线时钟频率仍然使用sys_stm32_clock_init()函数配置。例如,设置 APB2 总线时钟频率为 84MHz,预分频器的预分频系数 为 2,则上述的定时器时钟源频率为 168MHz。
2)外部时钟模式 1(TI1、TI2)
外部时钟模式 1 这类时钟源,顾名思义,时钟信号来自芯片外部。时钟源进入定时器的流程如下:外部时钟源信号→IO→TIMx_CH1(或者 TIMx_CH2),这里需要注意的是:外部时钟模式 1 下,时钟源信号只能从 CH1 或者 CH2 输入到定时器(CH3 和 CH4 都是不可以的)。从 IO 到 TIMx_CH1(或者 TIMx_CH2),就需要我们配置 IO 的复用功能,才能使 IO 和定时器通道相通。
下面通过外部时钟模式 1 的框图介绍时钟源信号来到定时器 CH1 或 CH2 后再到达计数器作为计数的时钟频率的经过。
上图以 CH2(通道 2)为例,把时钟源到达 CH2 后的信号用 TI2 表示。
TI2 首先经过一个滤波器,由 ICF[3:0]位来设置滤波方式,也可以设置不使用滤波器。
接着经过边沿检测器,由 CC2P 位来设置检测的边沿,可以上升沿或者下降沿检测。
然后经过触发输入选择器,由 TS[4:0]位来选择 TRGI(触发输入信号)的来源。
可以看到上图中框出了 TI1F_ED、TI1FP1 和 TI2FP2 三个触发输入信号(TRGI),TI1F_ED 表示来 自于 CH1,并且没有经过边沿检测器过滤的信号,所以它是 CH1 的双边沿信号,即上升沿或者 下降沿都是有效的。TI1FP1 表示来自 CH1 并经过边沿检测器后的信号,可以是上升沿或者下 降沿。TI2FP2 表示来自 CH2 并经过边沿检测器后的信号,可以是上升沿或者下降沿。这里以 CH2 为例,那只能选择 TI2FP2。如果是 CH1 为例,那就可以选择 TI1F_ED 或者 TI1FP1。
最后经过从模式选择器,由 ECE 位和 SMS[2:0]位来选择定时器的时钟源。这里我们介绍的是外部时钟模式 1,所以 ECE 位置 0,SMS[2:0] = 111 即可。CK_PSC 需要经过定时器的预分频器分频后,最终就能到达计数器进行计数了。
3)外部时钟模式 2(ETR)
外部时钟模式 2,顾名思义,时钟信号来自芯片外部。时钟源进入定时器的流程如下:外部时钟源信号→IO→TIMx_ETR。从 IO 到 TIMx_ETR,就需要我们配置 IO 的复用功能,才能使 IO 和定时器相通。
下面通过外部时钟模式 2 的框图介绍时钟源信号来到 TIMx_ETR 后再到达计数器作为计数的时钟频率的经过。
上图中,可以看到在外部时钟模式 2 下,定时器时钟信号首先从 ETR 引脚进来。
接着经过外部触发极性选择器,由 ETP 位来设置上升沿有效还是下降沿有效,选择下降沿有效的话,信号会经过反相器。
然后经过外部触发预分频器,由 ETPS[1:0]位来设置预分频系数,系数可选:1、2、4、8。
紧接着经过滤波器器,由 ETF[3:0]位来设置滤波方式,也可以设置不使用滤波器。fDTS 由 TIMx_CR1 寄存器的 CKD 位设置。
最后经过从模式选择器,由 ECE 位和 SMS[2:0]位来选择定时器的时钟源。这里我们介绍 的是外部时钟模式 2,直接把 ECE 位置 1 即可。CK_PSC 需要经过定时器的预分频器分频后, 最终就能到达计数器进行计数了。
4)内部触发输入(ITRx)
内部触发输入是使用一个定时器作为另一个定时器的预分频器,即实现定时器的级联。
下图所示为TIM1 作为 TIM2 的预分频器框图 ,
虽然定时器有四类 时钟源之多,但是我们最常用的还是内部时钟,因此,这类时钟源不再详细叙述,有实际的话,再另写文章补充。
②控制器
控制器包括:从模式控制器、编码器接口和触发控制器(TRGO)。从模式控制器可以控制计数器复位、启动、递增/递减、计数。编码器接口针对编码器计数。触发控制器用来提供触发信号给别的外设,比如为其它定时器提供时钟或者为 DAC/ADC 的触发转换提供信号。
③时基单元
时基单元包括:计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器 (TIMx_ARR)。这部分内容和基本定时器基本一样的,可以参考基本定时器的内容。
不同点是:通用定时器的计数模式有三种:递增计数模式、递减计数模式和中心对齐模式; TIM2 和 TIM5 的计数器是 32 位的。
递增计数模式在介绍基本定时器问文章中已经说过,那么,对应到递减计数模式就很好理解了。就是来了一个计数脉冲,计数器就减 1,直到计数器寄存器的值减到 0。减到 0 时,定时器溢出,由于是递减计数,故而称为定时器下溢。定时器溢出就会伴随着更新事件的发生。然后计数器又从自动重载寄存器影子寄存器的值开始继续递减计数, 如此循环。
最后是中心对齐模式,该模式下,计数器先从 0 开始递增计数, 直到计数器的值等于自动重载寄存器影子寄存器的值减 1 时,定时器上溢,同时生成更新事件, 然后从自动重载寄存器影子寄存器的值开始递减计算,直到计数值等于 1 时,定时器下溢,同时生成更新事件,然后又从 0 开始递增计数,依此循环。每次定时器上溢或下溢都会生成更新 事件。计数器的计数模式的设置需参考 TIMx_CR1 寄存器的位 CMS 和位 DIR。
下图为定时器工作在不同计数模式下,更新事件发生的情况。
上图中,纵轴表示计数器的计数值,横轴表示时间,ARR 表示自动重载寄存器的值,小红点就是更新事件发生的时间点。例如,在递增计数模式下,当计数值等于 ARR 时,计数器的值被复位为 0,定时器溢出,并伴随着更新事件的发生,后面继续递增计数。递减计数模式和中心对齐模式的工作过程如上文所述。 上图的描述属于硬件更新事件发生条件,我们还可以通过 UG 位产生软件更新事件。 关于影子寄存器和定时器溢出时间计算公式等内容可以参考基本定时器的相关内容。
④输入捕获
第④部分一般是要和第⑤部分一起完成测量功能。
TIMx_CH1~ TIMx_CH4 表示定时器的 4 个通道,这 4 个通道都是可以独立工作的。IO 端口通过复用功能与这些通道相连。配置好 IO 端口的复用功能后,将需要测量的信号输入到相应的 IO 端口,输入捕获部分可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,常见应用有:测量输入信号的脉冲宽度、测量 PWM 输入信号的频率和占空比等。
下面简述测量高电平脉冲宽度的工作原理,
测量高电平脉冲宽度时,首先要设置输入捕获的边沿检测极性,比如:我们设置上升沿检测,那么当检测到上升沿时,定时器会把计数器 CNT 的值锁存到相应的捕获/比较寄存器 TIMx_CCRy (y=1~4)。然后我们再设置边沿检测为下降 沿检测,当检测到下降沿时,定时器会把计数器 CNT 的值再次锁存到相应的捕获/比较寄存器 TIMx_CCRy 里。最后,我们将前后两次锁存的 CNT 的值相减,就可以算出高电平脉冲期间内 计数器的计数个数,再根据定时器的计数频率就可以计算出这个高电平脉冲的时间。
上文描述的是第④部分输入捕获整体上的一个应用情况,下面以通道 1 输入捕获为例介绍当需要测量的信号进入通道后的流程。下图是第④部分通道 1 的框图,
待测量信号到达 TIMx_CH1 后,这个待测量信号用 TI1 表示。
TI1 首先经过一个滤波器,由 ICF[3:0]位来设置滤波方式,也可以设置不使用滤波器。fDTS 由 TIMx_CR1 寄存器的 CKD 位设置。
接着经过边沿检测器,由 CC1P 位来设置检测的边沿,可以上升沿或者下降沿检测。CC1NP 是配置互补通道的边沿检测的,在高级定时器才有,通用定时器没有。
然后经过输入捕获映射选择器,由 CC1S[1:0]位来选择把 IC1 映射到 TI1、TI2 还是 TRC。 这里我们的待测量信号从通道 1 进来,所以选择 IC1 映射到 TI1 上即可。
紧接着经过输入捕获 1 预分频器,由 ICPS[1:0]位来设置预分频系数,可选:1、2、4、8。
最后需要把 CC1E 位置 1,使能输入捕获,IC1PS 就是分频后的捕获信号。这个信号将会到达下图的第⑤部分。
下图为第⑤部分的框图,
图中,灰色阴影部分是输出比较功能部分,在第⑥部分输出比较的时候再重点叙述。 左边没有阴影部分就是输入捕获功能部分了。
首先看到捕获/比较预装载寄存器,我们以通道 1 为例,那么它就是 CCR1 寄存器,通道 2、 通道 3、通道 4 就分别对应 CCR2、CCR3、CCR4。CCR1~4 是有影子 寄存器的,所以可以看到图中有捕获/比较影子寄存器,该寄存器不可直接访问。
图中左下角的 CC1G 位可以产生软件捕获事件。那么硬件捕获事件如何产生的?以通道 1 输入为例,CC1S[1:0] = 01,即 IC1 映射到 TI1 上;CC1E 位置 1,使能输入捕获;假如设置不滤波、不分频,则ICF[3:0] = 00,ICPS[1:0] = 00;假如设置检测上升沿,则CC1P 位置 0; 接着就是等待测量信号的上升沿到来。
当上升沿到来时,IC1PS 信号就会触发输入捕获事件发 生,计数器的值就会被锁存到捕获/比较影子寄存器里。当 CCR1 寄存器没有被进行读操作的时 候,捕获/比较影子寄存器里的值就会锁存到 CCR1 寄存器中,那么程序员就可以读取 CCR1 寄 存器,得到计数器的计数值。检测下降沿同理。
⑤输入捕获和输出比较公共部分
该部分需要结合第④部分或者第⑥部分共同完成相应功能。
⑥输出比较
第⑥部分是输出比较,一般应用是要和第⑤部分一起完成定时器输出功能。
TIMx_CH1~ TIMx_CH4 表示定时器的 4 个通道,这 4 个通道都是可以独立工作的。IO 端口通过复用功能与这些通道相连。
下面我们按照输出信号产生过程给大家介绍定时器如何实现输出功能。首先看到第⑤部分的“放大版”图,如下图所示,
上图中,灰色阴影部分是输入捕获功能部分,前面已经讲过。上图中右边没有阴影部分就是输出比较功能部分。下面以通道 1 的输出比较功能为例介绍定时器如何实现输出功能的。
首先,程序员写 CCR1 寄存器,即写入比较值。这个比较值需要转移到对应的捕获/比较影子寄存器后才会真正生效。什么条件下才能转移?上图中可以看到 compare_transfer 旁边的与门,需要满足三个条件:CCR1 不在写入操作期间、CC1S[1:0] = 0 配置为输出、OC1PE 位置 0(或者 OC1PE 位置 1,并且需要发生更新事件,这个更新事件可以软件产生或者硬件产生)。
当 CCR1 寄存器的值转移到其影子寄存器后,新的值就会和计数器的值进行比较,它们的比较结果将会通过第⑥部分影响定时器的输出。
下面来看看第⑥部分通道 1 的“放大版”,如下图所示,
上图中,可以看到输出模式控制器,由 OC1M[2:0]位配置输出比较模式,该位的描述可以参考《STM32F4xx 参考手册_V4(中文版).pdf》中相关定时器章节的 TIMx_CCMR1 寄存器。
oc1ref 是输出参考信号,高电平有效,高电平时称之为有效电平,低电平时称之为无效电平。它的高低电平受到三个方面的影响:OC1M[3:0]位配置的输出比较模式、第⑤部分比较 器的比较结果、OC1CE 位配置的 ETRF 信号。ETRF 信号可以将 oc1ref 电平强制清零,该信号来自 IO 外部。
一般来说,当计数器的值和捕获/比较寄存器的值相等时,输出参考信号 oc1ref 的极性就会根据我们选择的输出比较模式而改变。如果开启了比较中断,还会发生比较中断。
图中,CC1P 位用于选择通道输出极性,CC1E 位置 1 使能通道输出。
CC1P和CC1E配置完成后,OC1 信号就会从 TIMx_CH1 输出到 IO 端口,再到 IO 外部。
3、总结
STM32F407 共有 10 个通用定时器(TIM2~TIM5 和 TIM9~TIM14)。这些定时器彼此完全独立,不共享任何资源。这些定时器可以用于产生PWM、可以用于脉冲计数和测量等,本文重点叙述STM32F407通用定时器的结构原理,具体应用将在其他文章注重叙述。