STM32F767高级定时器TIM1/TIM8(一)

功能一:计数功能

涉及四个寄存器

1、16位定时器-----counter register(TIMx_CNT)

2、16位预分频寄存器----prescaler register(TIMx_PSC)

3、16位自动重装载装载寄存器----auto-reloader register(TIMx_ARR)

4、重复寄存器----repetition counter register(TIMx_RCR)

寄存器基本介绍:

1、自动重装载寄存器(TIMx_ARR):假如该寄存器中的数为A,则计数器计数到A后,会产生一个事件(update event)。【需要UDIS位为0】

  定时器工作时,实际上生效的寄存器不是ARR,而是另一个寄存器,被称为影子寄存器(shadow register)。根据配置的不同有两种工作方式,一种是ARR与影子寄存器持续地连在一起,这样影子寄存器里的数据一直与ARR里的数据相同,可以将它们看作是同一个寄存器;另一种是仅在更新事件(UEV)发生时,才将ARR里的数据写入到影子寄存器中。这两种工作方式可以通过改变ARPE位(在TIMx_CR1寄存器中)来切换,当ARPE为0时,工作在第一种情况,如图201;当ARPE为1时,工作在第二种情况,如图202

  如上图201,ARPE位为0,写入TIMx_ARR中的值36立刻生效。

  如上图202,ARPE位为1,写入TIMx_ARR中的值等到UEV产生才生效。  

2、预分频寄存器(TIMx_PSC):计数器需要时钟来驱动,而时钟的频率由该寄存器所控制。

  该寄存器可以随时写入新的数据,但是写完新的数据并不是立即生效,需要等下一次更新事件(UEV)后才会生效。同时,只有CEN位(在TIMx_CR1寄存器中)被置1后,该寄存器才会产生分频后的时钟。

  例如下图,当CEN位被置位后,产生时钟CK_CNT,驱动计数器开始计数。当计数器还没有到阈值时,更改了预分频寄存器(TIMx_PSC)的值,时钟频率并没有变化,直到计数器到达阈值,产生了更新事件(UEV),时钟频率才变为原来的一半。

3、重复寄存器(TIMx_RCR)假如TIMx_ARR中的数为A,重复寄存器中的数为N,那么计数器需要连续N+1次计数到A,才会产生一个事件(UEV)。

下面介绍几种基本的计数模式

一、向上计数模式(upcounting mode)

  如果没有设置重复寄存器(意味着TIMx_RCR保持着复位值0),计数器将从0开始向上计数,一直到设定的阈值(影子寄存器中的数)为止,然后产生一个更新事件(UEV)与一个向上溢出事件(counter overflow event),再从0开始重复上面的过程。

  如果设置了重复寄存器中的值为N(即TIMx_RCR中的数为N),计数器从0计数到阈值,一直重复此过程(N+1)次,在第(N+1)次计数到阈值后,产生一个更新事件(UEV)。

  注:我们可以用软件产生更新事件(UEV),只需要将UG位(在寄存器TIMx_EGR中)置位即可。

  

  在前面的寄存器基本功能介绍中,有这样一句话“1、自动重装载寄存器(TIMx_ARR):假如该寄存器中的数为A,则计数器计数到A后,会产生一个事件(update event)。【需要UDIS位为0】。”说明我们可以通过将UDIS位(在寄存器TIMx_CR1)置位来屏蔽更新事件(UEV)的产生。在官方文档[1]中解释了屏蔽UEV的目的,这样做是为了避免当我们正在向自动重装载寄存器(TIMx_ARR)中写数的时候,UEV产生,导致自动重装载寄存器(TIMx_ARR)里的数被更新到影子寄存器。因此我们向TIMx_ARR写数的时候最好屏蔽掉UEV,写完后再解除屏蔽。

[1] RM0410 Reference manual STM32F76xxx and STM32F77xxx advanced Arm®-based 32-bit MCUs.

猜你喜欢

转载自www.cnblogs.com/guofeng95/p/8987986.html