一. 定时器的基本概述
在STM32微控制器中,定时器是一种功能非常强大的模块,是微控制器必备的片上外设,用于生成精确的时间基准、测量时间间隔和执行定时任务。
STM32系列微控制器通常配备多个定时器,微控制器中的定时器实际是一个计数器,可以对内部脉冲/外部输入进行计数,不仅具有基本的计数/延时功能,还具有输入捕获、输出比较、PWM输出和周期性任务触发等高级功能,可以连接颜色传感器、步进电机的多种外设。
二. 延时的实现方式
在嵌入式应用中通常使用三种延时方式。
1. 纯硬件电路
在早期仪器仪表中,经常使用模拟或数字电路来实现定时/计数功能。但是由于硬件电路的结构固定,由其产生延时时间固定不变。所以,使用纯硬件电路实现延时主要应用于无微控制器参与的简单应用系统中。
2. 纯软件电路
微控制器基于一定的时钟条件运行,因此可以根据代码执行所需要的时钟周期来完成延时的操作,较为简单方便,易于实现。
对于短时延时,可以通过执行一定数量的空指令来完成,空指令每执行一次就需要一个周期;对于长时延时而言,可以通过循环结构来实现。例如:
void delay(int num){
int x,y;
for(x=0; x<num; x++){
for(y=0; y<170; y++){}
}
}
但是它也有缺点,每条指令的执行时间不同,很难做到精确延时,并且在延时的过程中,CPU始终被占用,使得CPU利用率不高。
3. 可编程定时/计数器功能
可编程定时(简称定时器)是当代微控制器标配的片上外设和功能模块,它不仅可以实现延时,还可以完成其他功能。
- 如果时钟源来自内部系统时钟,那么可编程定时/计数器可以实现精确的定时。此时的定时器工作于普通模式、比较模式或者PWM输出模式,通常用于延时、输入指定波形、驱动电机等。
- 如果时钟源来自外部输入信号,那么可编程定时/计数器可以完成对外部信号的计数,此时的定时器工作于输入捕获模式,通常用于测量输入信号的频率和占空比、测量外部事件的发生次数和时间间隔等。
在嵌入式系统中,使用定时器可以完成以下功能:
- 在多任务的分时系统中用作中断来实现任务的切换
- 周期性的执行某个任务
- 延时一定时间执行某个任务
- 显示实时时间
- 产生不同频率的波形
- 产生不同脉冲的波形
- 测量脉冲的个数和宽度
三. STM32F103的定时器分类
系统嘀嗒定时器SysTick :这是一个集成在Cortex M3内核当中的定时器,它并不属于芯片厂商的外设,也就是说使用ARM内核的不同厂商,都拥有基本结构相同的系统定时器。主要目的是给RTOS提供时钟节拍做时间基准。
基本定时器TIM6和TIM7:只具备最基本的定时功能,累计时钟脉冲数超过预定值时,产生定时器溢出事件,还可以作为通用定时器提供时间基准。TIM6和TIM7的内部结构较为简单,由触发控制器、一个16位预分频器、一个带自动重装载寄存器的16位计数器组成。
TIM6和TIM7定时器的主要功能包括:
● 16位自动重装载累加计数器。
● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值分频。
● 触发DAC的同步电路。
● 在更新事件(计数器溢出)时产生中断/DMA请求。
通用定时器TIM2~TIM5 :主要用于测量输入脉冲的频率和脉冲宽度以及输出PWM脉冲等,还具有编码器接口。STM32F103的每一个通道定时器都是完全独立的,没有互相共享任何资源,但它们可以一起同步操作。与基本定时器TIM6和TIM7相比,通用定时器TIM2~TIM5的内部结构也复杂得多。它比基本定时器多了一种寄存器——捕获/比较寄存器TIMx_CCR,包括捕获输入部分(数字滤波,多路复用和预分频器)和比较输出部分。
TIM2~TIM5定时器的主要功能包括:
● 具有自动重装载功能的16位递增/递减计数器,其内部时钟CK_CNT的来源TIMxCLT来自APB1预分频器的输出。
● 具有4个独立的通道,每个通道都可以用于输入捕获、输出比较、PWM输入和输出和以及单脉冲模式输出等。
● 在更新、触发、输入捕获以及输出比较事件时,可产生中断/DMA请求。
更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
触发:计数器启动、停止、初始化或者由内部/外部触发计数
● 支持针对对定位的增量编码器和霍尔传感器电路。
● 使用外部信号控制定时器和定时器互连的同步电路。
● 触发输入作为外部时钟或者按周期的电流管理。
高级定时器TIM1和TIM8:一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。它适合多种用途,可以作为一个分配到6个通道的三相PWM发生器,具有带死区插入的互补PWM输出。还可以测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等)。使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。
注意:STM32F103的每一个高级定时器都是完全独立的,没有相互共享任何资源,但它们可以一起同步操作。
STM32F103的高级定时器的主要功能除了具备通用定时器的功能外,还具备有以下功能:
● 具有自动重装载功能的16位递增/递减计数器,其内部时钟CK_CNT的来源TIMxCLT来自APB2预分频器的输出。
● 死区事件可编程的互补输出。
● 刹车输入信号可以将高级定时器输出信号置于复位状态或已知状态。
四. 定时器三种计数器模式
1. 向上计数模式:在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器),然后重新从0开始计数并产生一个计数器溢出事件。每次计数器溢出时间可以产生更新事件,在TIMx_EGR寄存器中(通过软件的方式或使用从模式控制器)设置UG位,也同样可以产生一个更新事件。
2. 向下计数模式:在向下模式中,计数器从自动装入的值(TIMx_ARR计数器)开始向下计数到0,然后从自动装入的指重新开始并且产生一个计数器向下溢出事件。每次计数器溢出时间可以产生更新事件,在TIMx_EGR寄存器中(通过软件的方式或使用从模式控制器)设置UG位,也同样可以产生一个更新事件。
3. 中央对齐模式(向上/向下计数):在中央对齐模式,计数从0开始计数到自动加载的值(TIMx_ARR计数器)-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件,然后再从0开始重新计数。