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]位还控制着其他功能,但这里只针对TRGI说明,其它的可以看TIMx_SMCR寄存器,如下:

  当SMS[2:0] = 100时,定时器的工作模式被选为复位模式,当被选中的TRGI输入上升沿时会重新初始化计数器,并且产生一个更新寄存器的信号。

  当SMS[2:0] = 101时,定时器的工作模式被选为门控模式,当TRGI输入高电平时,计数器的时钟开启(即计数器开始计数),当TRGI输入变为低电平时,计数器会停止工作,但是计数器不会复位,也就是说在这个模式,计数器的开关收TRGI控制。

  当SMS[2:0] = 110时,定时器的工作模式被选为触发模式,当TRGI产生一个上升沿的时候,计数器会被触发并开启计数,但是计数器只是被触发启动,并不会复位,在这个模式,TRGI产生上升沿来开启计数器,但是不能关闭计数器。

  当SMS[2:0] = 111时,定时器的工作模式被选为外部时钟模式1,在该模式,计数器是根据TRGI的上升沿来计数的。

  如果要使计数器在TI2输入端的上升沿计数,即使用TI2FP2作为驱动计数器计数的时钟源,配置如下:

  配置TIMx_CCMR1寄存器的CC2S=01,将通道2设为输入,并且映射到TI2上。

  配置TIMx_CCMR1寄存器的IC2F[3:0],选择输入滤波器的带宽,也可

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值