一、 基本构成
上图为通用定时器的结构框图,主要涉及TIM2、TIM3、TIM4、TIM5,可以理解为基本定时器的进阶版本,它在基本定时器的功能上加入了输入捕捉和输出比较功能。该模块主要包含了四部分,即:
① 时钟源
② 时基单元
③ 输入捕捉
④ 输出比较
二、 时钟源选择
时钟源有5种选择,分别是外部时钟模式1、外部时钟模式2、内部时钟模式、内部触发输入,关于STM32的时钟系统参看链接stm32学习总结:时钟系统-CSDN博客。其中,内部时钟模式、外部时钟模式1、外部时钟模式2主要为计数器提供时钟,编码器模式主要用于正交编码器和霍尔传感器电路(用于电机测速),主/从模式主要用于触发输入输出。
1. 内部时钟:打开定时器的内部时钟以72MHZ输入时钟信号,来自RRC的TIMxCLK,TIMxCLK是由APB1分频所得。
2. 外部时钟模式1:TI1FP1 /TI1F_ED / TI2FP2,最终来自定时器独立通道(TIMx_CH1~4)。可根据下表得知相应引脚。
3. 外部时钟模式2:外部触发输入(ETR)。
4. 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。相关功能可以使用复用引脚功能重映射进行设置。
三、 时基单元
时基单元包含计数器寄存器(TIMx_CNT)、预分频器寄存器 (TIMx_PSC)、自动装载寄存器 (TIMx_ARR),可以同时产生事件和中断。具体参看链接stm32学习总结:定时器(1)基本定时器-CSDN博客。
四、 计数模式分析
对于通用计数器来说,计数器的计数模式分为三种,向上计数、向下计数和中央对齐(向上/向下计数)三种模式。
-
向上计数模式
在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。每次计数器溢出时可以产生更新事件,在TIMx_EGR寄存器中(通过软件方式或者使用从模式控制器)设置UG位也同样可以产生一个更新事件。
下图为内部时钟分频因子为2的计数器时序图,设置计数溢出值为36,当计数器寄存器值为溢出值时,计数器溢出标志位置高,产生更新事件,更新标志变为高,计数器从0开始重新计数,注意这里需要手动将更新中断标志置低,使设备从中断中跳回主进程。
当ARPE=0时更新事件(TIMx_ARR没有预装入)相应的时序图如下,自动加载寄存器的值由FF改为36,在当前任务时序中当计数寄存器值为36时,系统判定计数器溢出,立即进行重新计数。
反之,当ARPE=1时更新事件(TIMx_ARR进行预装入)相应的时序图如下,自动加载寄存器的值由F5改为36,此时影子寄存器值还未发生更新,在当前任务时序中当计数器寄存器值为F5时,系统判定计数器溢出,而非36。重新计数的同时,影子寄存器的值更新,意味着下一轮计数的溢出界限值为36。影子寄存器的具体作用在上一篇文章中有过交代,此处不再赘述。 -
向下计数模式
在向下模式中,计数器从自动装入值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。每次计数器溢出时可以产生更新事件,在TIMx_EGR寄存器中(通过软件方式或者使用从模式控制器)设置UG位,也同样可以产生一个更新事件。设置TIMx_CR1寄存器的UDIS位可以禁止UEV事件,可以避免向预装寄存器中写入新值时更新影子寄存器。因此UDIS位被清为’0’之前不会产生更新事件。然而,计数器仍会从当前自动加载值重新开始计数,同时预分频器的计数器重新从0开始(但预分频系数不变)。 此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求) ,设置UG位将产生一个更新事件UEV但不设置UIF标志(因此不产生中断和DMA请求),这是为了避免在发生捕获事件并清除计数器时,同时产生更新和捕获中断。
下图为内部时钟分频因子为2的计数器时序图,设置计数溢出值为36,与向上计数类似,当计数器寄存器值为0时,计数器向下溢出标志位置高,产生更新事件,更新标志变为高,计数器从36开始重新计数,注意这里需要手动将更新中断标志置低,使设备从中断中跳回主进程。 -
中央对齐模式
该模式下计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)−1,产生一个计数器向上溢出事件,然后向下计数到1并且产生一个计数器向下溢出事件;然后再从0开始重新计数。在这个模式,不能写入TIMx_CR1中的DIR方向位。它由硬件更新并指示当前的计数方向。可以在每次计数上溢和每次计数下溢时产生更新事件;也可以通过(软件或者使用从模式控制器)设置TIMx_EGR寄存器中的UG位产生更新事件。然后,计数器