STM32F103ZET6通用定时器
- 格式:pdf
- 大小:192.43 KB
- 文档页数:12
STM32F103ZET6通⽤定时器
1、通⽤定时器简介
通⽤定时器是由⼀个可编程预分频器驱动的16位⾃动装载计数器构成。通⽤定时器可以应⽤于多种场合,如测量输⼊信号的脉冲长度
(输⼊捕获)或者产⽣输出波形(输出⽐较和PWM)。使⽤通⽤定时器的预分频器和RCC时钟控制器的预分频器,脉冲长度和输出波形周
期可以在⼏个微秒到⼏个毫秒间调整。
STM32内有多个通⽤定时器,每个通⽤定时器都是完全独⽴的,没有互相共享任何资源。
通⽤定时器的主要功能包括:
16位向上、向下、向上/向下⾃动装载计数器。
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值。
4个独⽴通道可以实现4路:输⼊捕获、输出⽐较、PWM输出、单脉冲模式输出。
使⽤外部信号控制定时器和定时器互连的同步电路。
⽀持针对定位的增量(正交)编码器和霍尔传感器电路。
通⽤定时器框图如下:
2、通⽤定时器的时基单元
通⽤定时器的时基单元主要由⼀个16位计数器和与其相关的⾃动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计
数。通⽤定时器的计数器的时钟由预分频器分频得到,⾄于预分频器之前的时钟在时钟选择的时候回说到。
通⽤定时器的计数器、⾃动装载寄存器和预分频器寄存器可以由软件读写,在计数器运⾏时仍可以读写。
如下图红⾊框部分就是通⽤定时器的时基部分:
时基单元包含:
CNT计数器(TIMx_CNT)。
PSC预分频器(TIMx_PSC)。
⾃动重装载寄存器(TIMx_ARR)。
CNT 计数器和⾃动重装载寄存器:
TIMx_ARR寄存器是预先装载的,写或读TIMX_ARR寄存器将访问预装载寄存器。通⽤定时器根据TIMx_CR1寄存器中的ARPE
位,来决定写⼊TIMx_ARR寄存器的值是⽴即⽣效还是要等到更新事件(溢出)后才⽣效。在计数器运⾏的过程中,ARPE位的作⽤如
下:
当ARPE = 0时,写⼊TIMx_ARR寄存器的值⽴即⽣效,即TIMx_CNT计数器的计数范围⽴马更新。其时序图如下:
当ARPE = 1时,写⼊TIMx_ARR寄存器的值不会⽴马⽣效,TIMx_CNT计数器的计数范围还是跟原来⼀样,等到TIMx_CNT计数溢出的
时候,写⼊TIMx_ARR寄存器的值才⽣效,即溢出之后TIMx_CNT计数器的计数范围才会更新。其时序图如下:
从图中可以到,计数器TIMx_CNT由预分频器输出的CK_CNT时钟驱动,只有当设置了TIMx_CR1寄存器中的计数器使能位CEN
时,CK_CNT才有效,⽽且真正的计数器使能信号是在CEN位被置位后的⼀个是时钟周期。
PSC预分频器:
在通⽤定时器框图中,PSC预分频器的时钟来源是CK_PSC,预分频器可以将CK_PSC的时钟频率按1到65536之间的任意值分
频,然后将分频后的时钟CK_CNT输出到CNT计数器,来⽤驱动CNT计数器计数。
预分频由16位的TIMx_PSC寄存器控制,TIMx_PSC寄存器是⾃带缓冲器,TIMx_PSC寄存器能在计数器计数的过程中被改变,但
是新的预分频器参数只有到下⼀次溢出之后才被更新。
要注意,由于TIMx_PSC寄存器带有缓冲功能,在初始化给TIMx_PSC赋值的时候,预分频器的系数是不会⽴马⽣效的,必须要等
到溢出之后才会更新预分频器的系数。⽐如说IC上电时,给TIMx_PSC赋值4(即5分频),但是定时器刚开始运⾏时的预分频系数其实
还是0(即1分频),只有当TIMx_CNT计数溢出⼀次之后,预分频系数才会更新为4(即5分频),如果需要⽴即更新预分频器的系数,可以将TIMx_EGR的bit0位UG置位,这样将产⽣⼀个更新事件,计数器会被清0,⽽且预分频系数会被更新,但是这时候如果开启了中
断,就会进⼊⼀次中断。
如果开启了中断,在置位UG位时,不想进⼊中断,则可以置位TIMx_CR1寄存器中的UDIS位,置位UDIS位,可以禁⽌更新事件,
但是当计数器溢出时,预分频器系数还是会更新,计数器也会清0,只是不会置位UIF标志,即不会进⼊中断。
如下图是在计数器计数的过程中,改变预分频器的值的时序图:
在图中,当计数器计数到F8时,将TIMx_PSC寄存器的值从0改到3,即1分频改到4分频,当计数到F9的时候,预分频器使⽤的参
数还是0,即还是1分频没有变,只有当计数器寄存器溢出清0之后,预分频器使⽤的参数才是3,即变为4分频。
在图中,CK_PSC是预分频器的输⼊时钟,CEN是定时器的使能信号,计数器寄存器就是TIMx_CNT,更新事件(UEV)是溢出。
预分频控制寄存器是TIMx_PSC,预分频缓冲器是看不见到的。
通⽤定时器可以通过TIMx_CR1寄存器中的UDIS位禁⽌更新事件(即产⽣溢出中断),但是UDIS只是禁⽌更新事件并不会停⽌定
时器的计数器⼯作,计数器溢出时还是会更新到TIMx_ARR的数值。UDIS禁⽌更新事件后,如果更新预分频器的数值和TIMx_ARR寄存
器的数值(ARPE=1),就算计数器溢出也不会更新预分频器和TIMx_ARR寄存器(ARPE=1)的数值,只有UDIS解除禁⽌更新事件
后,产⽣更新事件是时才会更新预分频器和TIMx_ARR寄存器(ARPE=1)的数值。
当发⽣⼀个更新事件(溢出中断)时,所有的寄存器都被更新,硬件同时置位TIMx_SR寄存器中的更新标志UIF位,同时预分频器
的缓冲区的值被TIMx_PSC寄存器的值更新,⽽且如果APRE=1,则⾃动装载影⼦寄存器被更改数值后的TIMx_ARR寄存器更新。
通⽤定时器的计数器⼯作模式:
通⽤定时器的计数器可以设定为3种⼯作⽅式。有向上计数模式、向下计数模式、中央对齐模式(向上/向下计数)。
向上计数模式:
在向上计数模式中,定时器的TIMx_CNT寄存器的值从0开始递增计数,当TIMx_CNT的值等于TIMx_ARR寄存器的值的时候会
产⽣⼀个溢出信号,计数器清0,重新开始计数。
每当计数器溢出时就是产⽣⼀个更新信号,TIMx_SR寄存器中的溢出标志位会置位,如果使能了溢出中断,就会进⼊中断。
如下图是在向上计数模式中,TIMx_PSC = 3(4分频),TIMx_ARR = 0x36时,定时器的计数时序图:
从上图可以看到,当计数器计数到TIMx_ARR寄存器的值0x36时,计数器溢出,同时产⽣更新事件(UEV),并且TIMx_SR寄
存器的更新中断标志位UIF被置位。
向下计数模式:
在向下计数模式中,定时器的TIMx_CNT从TIMx_ARR寄存器获取初值,然后从该值向递减,当减到0时⼜会从TIMx_ARR寄存
器获取初值并产⽣⼀个计数器向下溢出事件。
如下图是在向下计数模式中,TIMx_PSC = 2(3分频),TIMx_ARR = 0x36时,定时器的计数时序图:
从上图可以看到,当计数器计数到0时,计数器溢出,TIMx_ARR的值0x36重新给计数器寄存器赋值,同时产⽣更新事件
(UEV),并且TIMx_SR寄存器的更新中断标志位UIF被置位。
中央对齐模式:
中央对齐模式也称为向上/向下计数模式,在该模式中,计数器从0开始计数到TIMx_ARR寄存器值-1的数值后产⽣⼀个计数器
溢出事件,然后向下计数器到1并且产⽣⼀个计数器下溢事件,然后计数器再从0开始重新计数。
在中央对齐模式,不能写⼊TIMx_CR1中的DIR⽅向位,DIR⽅向位由硬件更新并指⽰当前的计数器计数的⽅向。
如下图是在中央对齐模式中,TIMx_PSC = 0(1分频),TIMx_ARR = 0x06时,定时器的计数时序图:
从上图可以看到,当计数器从0开始向上计数到0x05时,计数器向上溢出,同时产⽣更新事件(UEV),并且TIMx_SR寄存器
的更新中断标志位UIF被置位,然后计数器⼜会从0x06开始向下计数,当计数器的值向下计数到0x01时,计数器向上溢出,同时产
⽣更新事件(UEV),并且TIMx_SR寄存器的更新中断标志位UIF被置位。也就是说在⼀个周期内会引发两次溢出。
3、通⽤定时器的时钟选择
通⽤定时器的计数器可以选择不同的时钟来源,⽤来驱动计数器计数。计数器时钟的来源有以下⼏种:
内部时钟(CK_INT)。
外部时钟模式1:外部输⼊脚(TIx)。
外部时钟模式2:外部触发输⼊(ETR)。 内部触发输⼊(ITRx):使⽤⼀个定时器作为另⼀个定时器的预分频器,如可以配置⼀个定时器T1⽽作为另⼀个定时器T2的预分
频器。
如下图红⾊框部分就是通⽤定时器的时钟选择框图:
内部时钟源(CK_INT):
从时钟选择框图中可以看到,内部时钟源(CK_INT)来⾃RCC的TIMx_CLK,即定时器本⾝的驱动时钟。
当禁⽌从模式控制器(TIMx_SMCR寄存器的SMS=000),则预分频的时钟源CK_PSC由内部时钟源(CK_INT)驱动。定时器的
实际控制位为CEN位、DIR位和UG位,并且只能被软件修改(UG位仍被⾃动清除)。只要CEN位被置1,预分频器的时钟CK_PSC就
由内部时钟CK_INT提供。
通⽤定时器的内部时钟来源于APB1总线时钟,但是通⽤定时器的内部时钟是根据APB1总线时钟是否分频来决定的,如果APB1总
线时钟预分频系数为1,则通⽤定时器的内部时钟就是APB1总线时钟;但是如果APB1总线时钟的分频系数为2,则通⽤定时器的内部时
钟就是APB1总线时钟的2倍。
下图显⽰了控制电路和向上计数器在⼀般模式下,不带预分频器时(分频系数为0)的操作。
如图所⽰,只有当CEN位被置位⾼电平的时候,预分频器的时钟CK_PSC和计数器的时钟CK_CNT才开始⼯作。
外部时钟源模式1:
如下图是TI2FP2作为驱动定时器计数器计数的连接⽰意图:
如图,当选择外部时钟1驱动计数器时,预分频器的时钟来源于TRGI的上升沿。当TIMx_SMCR寄存器的SMS[2:0]位设为“111”时,
则选择外部时钟模式1作为预分频器时钟CK_PSC的输⼊源,即选择TRGI的上升沿驱动计数器。
从图中还可以看到,TRGI具有多种输⼊源,通过TIMx_SMCR寄存器的TS[2:0]位来选择,如下:
当TS[2:0] = 000时,选择内部触发0(ITR0,对应TIM1)作为计数器的驱动时钟。
当TS[2:0] = 001时,选择内部触发1(ITR1,对应TIM12)作为计数器的驱动时钟。
当TS[2:0] = 010时,选择内部触发2(ITR2,对应TIM3)作为计数器的驱动时钟。
当TS[2:0] = 011时,选择内部触发3(ITR3,对应TIM4)作为计数器的驱动时钟。
当TS[2:0] = 100时,选择TI1的边沿检测器TI1F_ED作为计数器的驱动时钟。
当TS[2:0] = 101时,选择滤波后的定时器输⼊TI1FP1作为计数器的驱动时钟。
当TS[2:0] = 110时,选择滤波后的定时器输⼊TI2FP2作为计数器的驱动时钟。
当TS[2:0] = 111时,选择外部触发输⼊ETRF作为计数器的驱动时钟。
需要注意的是,TS[2:0]位只能在未⽤到(如SMS=000)时被改变,以避免在改变时产⽣错误的边沿检测。
TRGI在不同模式的作⽤也不⼀样,可以通过TIMx_SMCR寄存器的SMS[2:0]位进⾏控制。SMS[2:0]位还控制着其他功能,但这⾥只