STM32F767高级定时器TIM1/TIM8——时基模块(一)

本节介绍定时器最核心的部分——时基模块(time-base unit)。

功能简介:时基模块是定时器最核心的模块,负责最基本的计数功能。由来源于时钟模块的时钟,驱动计数器开始计数,当计数达到预设的数值时,产生一个更新事件(update event),然后计数器再重复以上过程。

 

几个名词解释:

1、更新事件(update event):简称UEV,当计数器计数到达阈值时,会产生一个脉冲,这个脉冲被称为更新事件。每当有更新事件产生,各个寄存器就会更新一次。更新事件也能根据软件产生,由软件产生的更新事件不会触发中断。

 

 

时基模块的基本结构:

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写入36,等到UEV产生,影子寄存器中的值才从TIMx_ARR中更新。  

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

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

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

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

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

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

  如果没有设置重复寄存器(意味着TIMx_RCR保持着复位值0),计数器将从0开始向上计数,一直到设定的阈值(影子寄存器中的数)为止,然后产生一个向上溢出事件(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,写完后再解除屏蔽。

  一般来说,更新事件(UEV)的产生将带来两个效果,其一是各个寄存器的更新,包括重复计数器(repetiton counter)、影子寄存器与分频器的缓冲器(buffer);其二是中断标志位(UIF位,在寄存器TIMx_SR中)的置位。但既然说是“一般来说”,那么就会有例外,我们可以通过设置,让某些更新事件(UEV)不会置位中断标志位。操作如下:首先置位TIMx_CR1中的URS位,在这种情况下置位UG位(在寄存器TIMx_EGR中),UG置位能够产生一个更新事件(UEV),该UEV不会触发中断(因为之前URS位被置位了),只能触发各个寄存器的更新。

二、向下计数模式(downcounting mode)

  向下计数模式与向上计数模式异曲同工,唯一的区别在于该模式计数方向向下,从设定的阈值(影子寄存器中的数)开始递减,直到0为止,然后产生更新事件(UEV),再重复以上过程。

三、中心对齐模式(centre-aligned mode)或(up/down counting)

  在中心对齐模式下,计数器从0开始向上计数,直到影子寄存器中的值-1,然后产生一个向上溢出事件(counter overflow event),再从影子寄存器的值(没有减一)向下计数,直到1为止,产生一个向下溢出事件。最后重复以上过程。

  进入该模式的方法:CMS位(在寄存器TIMx_CR1中)不为0即可进入该模式,当CMS为“01”、“10”、“11”时进入不同的工作模式。这些工作模式不影响计数器在中心对齐模式下的工作方式,在后面的文章中将详细介绍这三种模式的区别。

  在中心对齐模式下,与向上计数模式相同,寄存器的更新和中断标志位的产生也都是源于更新事件(UEV)。但有一个需要注意的地方,如果发生了向上溢出事件,寄存器则需要更新,如果之前改变了自动重装载寄存器中的值,并设置它与影子寄存器不同步(ARPE位设为1),那么这时影子寄存器将从自动重装载寄存器中更新数据,然后计数器需要从影子寄存器现在的值开始向下计数。顺序是先更新寄存器,然后计数器再从寄存器中读数。具体例子可以看下图。

   在上图中,自动重装载寄存器被写入36,然后计数器到达之前的阈值FC(源于FD-1),触发向上溢出事件,带动寄存器更新数据,36被写入影子寄存器(在图里显示为Auto-reload active register)。然后按照中心对齐模式的规则,计数器需要从影子寄存器中的数往下计数,直到0。注意此时影子寄存器中的值已经被改为36了,所以计数器从36向下计数,而不是从FD向下计数。

 

 

 

 

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

 

猜你喜欢

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