定时器简介
定时器是一种专门负责定时功能的片上外设。F1系列的单片机最多有14个定时器(TIM1~TIM14),具体如下表:
类型 | 外设名称 |
基本定时器 | TIM6和TIM7 |
通用定时器 | TIM2~TIM5和TIM9~TIM14 |
高级定时器 | TIM1和TIM8 |
基本定时器是功能最简单的一类定时器,即时基单元的功能;通用定时器在基本定时器的基础上添加了一些功能,包括:输入捕获功能、输出比较功能;高级定时器是在通用定时器的基础上又添加一些功能:从模式控制器、输出控制功能。
以具体的F103C8T6芯片来说,其包含了:1个高级定时器(TIM1)、3个通用定时器(TIM2、TIM3、TIM4),一共4个定时器模块。其中TIM1挂在APB2总线上,其他定时器挂在APB1总线上。
而STM32F103RG芯片就拥有全部的14个定时器。
时基单元
1、时基单元的基本结构
对于CNT计数器,每来一个脉冲就记一个数。当计数器计满一轮数后,会向右边的重复计数器RCR输出一个脉冲。脉冲信号经过RCR再次进行分频后,会去产生一个update事件(可通过update事件去触发中断)。
注意,对于重复计数器,只存在于高级计数器里(即:TIM1和TIM8),其他计数器是没有的。
2、定时器的时钟
由时基单元框图可知,其时钟有几种来源,并通过多路复用器选择其中的一路输入到时基单元。其中有一个主要的来源就是RCC,且绝大多数情况下使用RCC。
对于C8T6芯片,通过查阅手册(上图)可知:TIM1挂在APB2总线上,TIM2、TIM3、TIM4挂在APB1总线上。因此,对于TIM1,其时钟来源于APB2,对于其他寄存器,其时钟来源于APB1。
但在APB与TIM之间还存在倍频器,如果APBx的分频系数为1,倍频器就在原来的时钟频率上做一个一倍频(频率不变);如果APBx分频系数为2,就在原来时钟频率上做一个二倍频。
3、分频计数器
对于上述时基单元的内部结构中的预分频器、计数器、重复计数器,其本质均为16位的分频计数器。其中预分频器和重复计数器发挥了分频的作用,而中间的计数器既有分频功能又有计数功能。
对于16位的分频计数器,其自动重装寄存器和计数器都是用16位的二进制数来表示的,也就是说它们的范围都是0000~FFFF(即:0~65535)。
- 分频计数器的基本工作原理:
对于分频计数器,计数器会在输入脉冲的激励下递增,每来一个脉冲就加一,到达最大值N(由自动重装寄存器设置)后,其值归0,然后输出一个脉冲,再重新从0计数,如此重复下去。
其计数模式可分为如下的3种:
上计数 | 下计数 | 中心对齐 |
对于中间的计数器CNT,其模式是可选的(可选择上计数、下技术或中心对齐) 。
4、Update事件与预加载
由于状态寄存器里面的N值决定了计数器的周期,有时我们需要再计数器运行的过程中动态地调整N的值。为了防止出错,这个调整需要加一些保护措施(即:预加载 Preload)。
当我们修改N的值时,如果直接修改的话,当修改时计数器的计数值大于我们想要修改的值时,计数器会一直计数到65535,重新溢出后才会以新的N为顶进行计数。所以在这中间会出现一个非常长的计数周期(从0到65535)。如下图所示:
为了避免这种情况,我们在自动重装寄存器后边增加了一个影子寄存器,如果我们要修改N的值,那么新的N值首先会写入影子寄存器里边,等到下一次update事件发生时,新N值从影子寄存器进入自动重装寄存器里。
上述的保护措施称之为预加载,如下图所示:
【注意】对于预分频器PSC和重复计数器RCR来说,它们的预加载措施是强制开启的;而对于中间的自动重装寄存器来说,可以选择是否预加载,并且默认不预加载(开启需手动)。
【注意】对于update事件,是由重复计数器RCR溢出所产生的,但我们还可通过编程强制去产生一个update事件。
附update事件与中断的关系: