1、定时器的分类
STM32F103ZET6总共有8个定时器,它们是:TIM1~TIM8。STM32的定时器分为基本定时器、通用定时器和高等定时器。
TIM6、TIM7是基本定时器。基本定时器是只能向上计数的16位定时器,基本定时器只能有定时的功能,没有外部IO口,所以没有捕获和比较通道。
TIM2、TIM3、TIM4、TIM5是通用定时器。通用定时器是可以向上计数,也可以向下计数的16位定时器。通用定时器可以定时、输出比较、输入捕捉,每个通用定时器具有4个外部IO口。
TIM1、TIM8是高等定时器。高等定时器是是可以向上计数,也可以向下计数的16位定时器。高等定时器可以定时、输出比较、输入捕捉、还可以输出三相电机互补信号,每个高等定时器有8个外部IO口。
定时器分类图如下:
2、基本定时器
基本定时器没有外部IO口,所以它只有定时的功能。
基本定时器只能向上计数,也就是说基本定时器只能递增计数。
基本定时器功能框图如下:
从功能图的1中可以看到,基本定时器的时钟TIMxCLK来自内部时钟,该内部时钟为经过APB1预分频器分频后提供的。基本定时器跟APB1总线时钟的关系如下:
-
- 如果APB1预分频系数为1,则基本定时器的时钟等于APB1总线时钟。
- 如果APB1预分频系数不为1,则基本定时器的时钟等于APB1总线时钟经过分频后的2倍。
比如APB1总线经过2分频后的时钟为36MHZ,那么基本定时器的时钟就是72MHZ3(36*2)。
功能图中的2是一个预分频器,来自内部的时钟经过预分器分频后的时钟,用来驱动基本定时器的计数器计数。基本定时器的预分频器是一个16位的预分频器,预分频器可以对定时器时钟进行1~65536之间的任何一个数进行分频。计算方式如下:
定时器工作时钟 = 来自APB1的时钟/(预分频系数+1)
功能图中的3是一个16位的计数器,该计数器能能向上计数,最大计数值位65535。基本定时器的计数器从0开始向上计数,当计数器的值与自动重装载寄存器相等时产生更新事件,并清零从头开始计数。
功能图中的4是一个16位的自动重装载寄存器。该寄存器装着计数器能计数的最大数值。当基本定时器的计数器计数到这个值的时候,如果使能了中断。定时器就会产生溢出中断。
3、定时器的时间计算
基本定时器每计数一次所经过的时间为:
Time = (PSC + 1)/ TIMxCLK(us)
PSC是定时器的分频系数,TIMxCLK是内部时钟。
基本定时器的计数次数由自动重装载寄存器决定的,基本定时器的计数器从0开始向上计数,当计数器的值与自动重装载寄存器相等时,产生溢出。所以基本定时器的溢出时间计算公式如下:
Time = (PSC+1)*(ARR)/ TIMxCLK(us)
ARR是自动重装载寄存器的值。
假设基本定时器TIMxCLK = 72MHZ,PSC = 71,ARR = 1000,那么定时器的溢出时间为:
Time = (71+1)*1000/72 = 1000(us) = 1(ms)
4、基本定时器的配置流程
使能基本定时的时钟,不然无法使用定时器。
设置基本定时器的预分频系数和自动重装载寄存器值,通用定时器和高等定时器还要设置计数方向,因为基本定时器只能向上计数,所以不用设置。
开启基本定时器。
通过NVIC配置基本定时器的中断。
编写基本定时器的中断服务函数,在中断服务函数中,可以通过基本定时器的状态寄存器的值来判断此次产生的中断属于什么类型。