STM32定时器原理及应用
一、STM32定时器
1. 定时器原理
定时器本质上是一个计数器。如果输入的是一个恒定的脉冲信号源(时钟信号)就可以根据定时器的计数(脉冲个数)和时钟频率计算出时间。
2. 定时器分类
大容量的STM32F103xx增强型系列产品包含最多2个高级控制定时器,4个通用定时器,2个基本定时器,1个实时时钟,2个看门狗定时器和1个系统滴答定时器。高级定时器、通用定时器、基本定时器都是由一个可编程的16位预分频器(TIMX_PSC)驱动的16位自动装载计数器(TIMX_CNT)构成。
定时器通常按计时方式和功能特点进行分类:
(1)按功能特点分类
- 基本定时器:提供基本的计时和中断功能,适用于简单的时间控制需求;
- 通用定时器/计数器:具备更多的功能和灵活性,如多通道输出、输入捕获、编码器接口等;
(2)按计时方式分类
- 向上计数定时器:从初始值开始逐渐增加计数,直到达到目标值或计时结束;
- 基本寄存器:计数寄存器,比较寄存器(当计数寄存器和比较寄存器数值一致的时候可以用来触发中断)
- 向下计数定时器:从初始值开始逐渐减少计数,直到计数器的值为零或计时结束;
- 基本寄存器:计数寄存器,重载寄存器(当计数为0时候,计数寄存器被赋予重载寄存器重复下一次定时)
定时器种类 | 位数 | 计数器模式 | 产生DMA请求 | 捕获/比较通道 | 互补输出 | 特殊应用场景 |
---|---|---|---|---|---|---|
基本定时器TIM6,TIM7 | 16 | 向上,向下,向上/下 | 可以 | 0 | 无 | 产生DAC触发信号 |
通用定时器TIM2~TIM5 | 16 | 向上,向下,向上/下 | 可以 | 4 | 无 | 定时计数,PWM输出,输入捕获,输出比较 |
高级定时器 TIM1,TIM8 | 16 | 向上,向下,向上/下 | 可以 | 4 | 有 | 测量输入信号脉冲长度、产生需要的输出波形(PWM) |
二、基本定时器
1. 基本定时器原理
基本定时器是TIM6和TIM7,该定时器的主要功能包括:
- 16位自动装载累加计数器(CNT COUNTER);
- 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65535的任意数值分频(PSC);
- 触发DAC的同步电路(to DAC);
- 在更新实践(计数器溢出)时产生中断/DMA请求(UI,U);
(1)时钟源
定时器时钟,即内部时钟CK_INT,经APB1预分频器后分频提供。如果APB1预分频系数等于1,则频率不变,否则频率乘以2库函数中APB1预分频系数为1,即PCLK1=36MHz,所以定时器时钟TIMxCLK=36×2=72MHz。
(2)计时器时钟
定时器时钟经过PSC预分频器之后,即CK_INT用来驱动计数器计数。PSC是一个16位预分频计数器,可以通过定时器时钟TIMxCLK对1~65535的任意数进行分频。具体计算方法如下:CK_INT = TIMxCLK /(PSC+1)。
(3)计数器
计数器CNT是一个16位计数器,只能往上计数,最大数值为65535,当计数达到自动重装载寄存器时产生更新事件,然后清零开始重新计数。
(4)自动重载寄存器
自动重载寄存器ARR是一个16位寄存器,装着计数器能计数的最大数值,当计数达到这个值时,如果使能了中断的话,定时器就会产生溢出中断。
(5)定时时间的计算
定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在CK_INT的驱动下,计一个数的时间是CK_INT的倒数,即1 / [ TIMxCLK / ( PSC + 1)],产生一次中断的时间为 1/ (CK_CLK × ARR)。如果在中断服务程序里面设置一个变量cnt用来记录中断次数,那么就可以计算出需要的定时时间为 1 / TIMxCLK / ( PSC + 1) ×cnt 。
2. 基本定时器封装
基本定时器 TIM_TimeBaseInitTypeDef 定义于文件"stm32f10x_tim.h"中:
typedef struct
{
uint16_t TIM_Prescaler;
uint16_t TIM_CounterMode;
uint16_t TIM_Period;
uint16_t TIM_ClockDivision;
uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;
(1)uint16_t TIM_Prescaler:设置了用来作为TIMx时钟频率除数的预分频值,它的取值必须在0x0000和0xFFFF之间;
(2)uint16_t TIM_Period:设置在下一个更新事件装入活动的自动重装载寄存器周期的值,它的取值必须在0x0000和0xFFFF之间;
(3) uint16_t TIM_ClockDivision:设置了时钟分割,有TIM_CKD_DIV1,TIM_CKD_DIV2,TIM_CKD_DIV4;
(4)uint16_t TIM_CounterMode:选择计数模式,具体如下:
- TIM_CounterMode_Up TIM:向上计数模式
- TIM_CounterMode_Down TIM:向下计数模式
- TIM_CounterMode_CenterAligned1 TIM:中央对齐模式1计数模式
- TIM_CounterMode_CenterAligned2 TIM:中央对齐模式2计数模式
- TIM_CounterMode_CenterAligned3 TIM:中央对齐模式3计数模式
向上计数模式:
计数器从0开始计数,当计数到自动装载值(TIMx_ARR)时产生向上溢出事件;
向下计数模式:
计数器从自动装载值(TIMx_ARR)开始向下计数,当计数到0时产生向下溢出事件;
中央对齐模式(向上/向下计数):
计数器从0开始计数,到自动装载值(TIMx_ARR)-1时,产生计数器溢出事件,然后向下计数到1,产生计数器溢出事件,然后再从0开始重新计数。
3. 基本定时器配置要求
(1)开启定时器时钟,即内部时钟;
(2)自动重装载寄存器周期的值(计数值);
(3)时钟预分频系数为1;
(4)初始化定时器;
(5)清除计数器中断标志位;
(6)开启计数器中断;
(7)使能计数器;
(8)编写中断服务程序 TIM_IRQHandler 或者 TIM_IRQHandler;
基本定时器只能向上计数,且没有配置计数模式的寄存器,默认向上.
三、通用定时器
1. 通用定时器功能特点
(1)通用定时器是由一个可编程预分频器(PSC)驱动的16位自动重装载计数器(CNT)构成,可用于测量输入脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。
(2)通用 TIMx(TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括:
- 位于低速的APB1总线上(注意:高级定时器是在高速的APB2总线上);
- 16位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT);
- 16位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数;
- 4 个独立通道:输入捕获,输出比较,PWM生成(边缘或中间对齐模式),单脉冲模式输出
- 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
- 如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器): 计数器向上/向下溢出,计数器初始化(通过软件或者内部/外部触发),触发事件(计数器启动、停止、初始化或者有内部/外部触发计数),输入捕获,输出比较;
- 支持针对定位的增量(正交)编码器和霍尔传感器电路;
- 触发输入作为外部时钟或者按照周期的电流管理。
(3) 通用定时器内部构成
2. 输入/ 触发模块(信号源触发)
输入/ 触发模块是计数模块的输入源,主要分为以下四个来源:
(1)内部时钟①(CK_INT)在外部8M的晶振和库函数自带的系统初始化函数Systemlnit()中对芯片的各个时钟源进行了配置,所有的定时器的内部时钟源为72 MHz;
(2)外部引脚TIMx_ETR②经过一系列的边沿检测等处理后作为计数模块的输入源;
(3)内部触发输入⑧,左边的ITRO、ITR1等就是其他定时器的输出;
(4)外部输入通道经过滤波和边沿检测④。
其中②③④信号结合为触发输入TRGI,然后进入Slave Mode(从模式)控制器,最后才进入计数模块。
其次还涉及定时器的模式——模式和从模式:
- 从模式就是外部触发定时器,除内部时钟外的几种都是外部触发;
- 主模式就是定时器触发别的模块,在芯片内部,可以设置一个定时器为触发源,作为其他的定时器的计数模块的输入端,或者定时触发ADC/DAC。
(5)多种从模式如下:
①重置模式:TRGI信号一旦出现上升沿,计数器就重置,同时更新一些有缓冲的寄存器的值。选择这个模式时记得要选择触发源;
②门控模式:计数器在选择的TRIG触发源的触发下才进行计数,否则停止计数;
③编码模式;1,仅在TL1计数(A相);2,仅在TL2计数(B相);3,TL1利TL2都计数(A相和B相都计数);
④触发模式:计数器在选择的TRIG触发源的触发下才开始计数;
⑤外部时钟模式1:选择的触发源的上升沿作为计数源。
(6)主从模式产生如下:
①重置:定时器复位(TIMx_EGR寄存器的UG位被置1等)的时候会产生一个触发信号输出;
②使能:计数器使能的时候产生一个触发信号输出,可用于多个定时器同时启动时。计数器使能信号是通过CEN控制位和门控模式下的触发输入信号的逻辑或产生;
③更新:更新事件产生时,即在一个主定时器的时钟被用作一个从定时器的预分频器情况下产生;
④比较脉冲:一次输入捕获或者比较产生的时候可以产生一个触发信号;
⑤比较:OCxREF。
注:内部时钟作为计数器的触发源既不是主模式也不是从模式。
3. 计数模块
(1)时钟从触发源输出后,如上图所示,(TIMx_PSC)是用来分频的,降低计数器模块计数频率。比如定时器内部f=72 MHz,TIMx_PSC=2,计数器频率是36MHz,TIMx PSC是一个16位的寄存器,分频的范围为1~65536。
(2)计数模块CNT(Counter)可以进行多种模式的计数,比如向上计数,向下计数,或者先由0向上计数到某个数之后又向下计数到0,如此循环反复,这种计数模式叫做中间对齐模式。
(3)寄存器PSC、ARR(自动重载寄存器)实际上是由两个寄存器构成的,一个是程序员可以写入或读出的寄存器,称为预装载寄存器,另一个是程序员看不见的,在操作中真正起作用的寄存器,称为影子寄存器。如果使能了预装载寄存器,那么写入寄存器的值不会立马生效,而会等待更新事件到来的时候才将预装载寄存器的内容转移到影子寄存器。
(4)工作原理如下:
4. 通用定时器比较输出
输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。每个高级定时器和通用定时器都拥有4个输出比较通道,高级定时器的前3个通道额外拥有死区生成和互补输出的功能。
通用定时器2的4个通道分别以各种模式输出波形,如下图,通道1输出设置为PWM1模式,通道2输出设置为时间点模式,通道3输出设置为强制输出(高)模式,通道4输出设置为翻转模式。
每个通道有一个TIMx_CCR,当通道设置为输出的时候它就是比较,输入的时候就是捕获。
(1)输出驱动原理图如下:
(2)比较输出的几种模式
(3)多种输出模式输出原理
用于输出功能只用到定时器部分功能,输出模式设置步骤:定时器外设的时钟源作为计数源——设置分频(分频后的时钟CK_CNT的周期小于输出所需的最小周期)——配置对应通道的比较部分——比较模式为某一输出模式——控制信号的极性——输出和使能计数器。
(4)配置定时器2的各个通道的1输出引脚
下表中第一列是引脚的名称,第二~第四列是默认的管脚复用功能,定时器2的通道1就是PA0,并且外部触发引脚也是PA0,通道1/2/3/4分别映射PA0、PA1、PA2、PA3。定时器引脚设置模式如表6.6。
(4)配置定时器2的各种工作模式