STM32定时器分为了三种主要类型,每种类型的功能和特性不同。
· 基本定时器(Basic timers):几乎没有任何对外输入/输出,常用作时基,实现基本的计数、定时功能。
· 通用定时器(General-purpose timers):除了基本定时器的时基功能外,还可对外做输入捕获、输出比较以及连接其他传感器接口,如编码器和霍尔传感器。
· 高级控制定时器(Advanced-control timers):此类定时器的功能最为强大,除了具备通用定时器的功能外,还包含一些与电机控制和数字电源应用相关的功能,比如带死区控制的互补信号输出、紧急刹车关断控制。
STM32F103xx系列的微控制器根据其内置Flash的大小,分为大容量、中容量和小容量3类,每类的定时器的种类和数量是不同的。
大容量的 STM32F103xx系列产品,如 STM32F103VE 包含2个高级控制定时器TIM1、TIM8,4个通用定时器TIM2、TIM3、TIM4、TIM5和2个基本定时器TIM6、TIM7,以及2个看门狗定时器 和1个系统嘀答定时器。
中容量的 STM32F103xx系列产品,如 STM32F103VB 和STM32F103C8 包含1个高级控制定时器TIM1、3个通用定时器 TIM2、TIM3、TIM4,以及 2 个看门狗定时器 和1个系统嘀答定时器。
小容量的 STM32F103xx系列产品,如 STM32F103R6 包含1个高级控制定时器TIM1、2个通用定时器TIM2、TIM3,以及2个看门狗定时器和1个系统嘀答定时器。
基本定时器TIM6和TIM7各包含一个16位自动重装载计数器,由各自的可编程预分频器驱动。这两个定时器可以作为通用定时器提供时间基准,也可以为DAC提供时钟。这2个定时器是互相独立的,不共享任何资源。
TIM6和TIM7由时钟源和时基单元组成,如图4-13所示。
(1)时钟源。
基本定时器的计数器的时钟CK_INT(Internal Clock,内部时钟)来源于RCC的TIMxCLK。
(2)时基单元。
时基单元包含TIMx_PSC(Prescaler Register,预分频器)、TIMx_CNT(Counter,计数器)、TIMx_ARR(Auto-Reload Register,自动重装载寄存器)。
(3)计数模式。
基本定时器的计数器从0开始累加计数到TIMx_ARR值,产生计数器溢出事件,然后重新从0开始下一次的计数。这种计数模式称为向上计数模式。
通用定时器TIMx(TIM2、TIM3、TIM4和TIM5)是由一个可编程预分频器驱动的16位自动重装载计数器构成的。
通用定时器适用于测量输入信号的脉冲宽度(即输入捕获)、产生输出波形(即输出比较和PWM(Pulse Width Modulation,脉冲宽度调制))。
TIMx的特性如下。
(1)16位向上、向下、向上/向下自动装载计数器。
(2)16位可编程预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值(可以实时修改)。
(3)具有4个独立通道,用于输入捕获、输出比较、PWM产生和单脉冲模式输出。
(4)具有使用外部信号控制定时器和定时器互连的同步电路。
(5)如下事件发生时,产生中断和DMA。
TIMx原理框图如图4-14所示。
实验4-4 基本定时器TIM6定时1ms(HAL库)
本实验将介绍如何使用STM32CubeMX和HAL库函数配置TIM6,以实现1ms的定时,并通过LED1的闪烁来指示TIM6的工作情况。
实验4-5 Proteus仿真STM32:TIM3定时1ms(HAL库)
实验 4-6 TIM3 产生 PWM 的呼吸灯(HAL 库)
本例说明如何使用 STM32CubeMX 和 HAL 库函数配置TIM3 产生可变占空比的PWM 实现LED 亮度变化的“呼吸灯”
脉冲宽度调变(Pulse Width Modulation,PWM),也成脉冲宽度调制,简称为脉宽调制,是一项功能强大的技术,它是一种对模拟信号电平进行数字化编码的方法。在脉宽调制中使用高分辨率计数器来产生方波,并且可以通过调整方波的占空比来对模拟信号电平进行编码。PWM通常使用在开关电源和电机控制中。
1.TIM1和TIM8简介
高级控制定时器(advanced-control timers) (TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等)。
TIM1和TIM8主要特性
TIM1和TIM8定时器的功能包括:
(1)16位向上、向下、向上/下自动装载计数器 。
(2)16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值。
(3)多达4个独立通道: 输入捕获, 输出比较,PWM生成(边缘或中间对齐模式),单脉冲模式输出。
高级控制定时器框图见图4-15
(1)时基单元
可编程高级控制定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。
时基单元包含:
计数器寄存器(Counter Register,TIMx_CNT)
预分频器寄存器(Prescaler Register,TIMx_PSC)
自动装载寄存器(Auto-Reload Register,TIMx_ARR)
重复次数寄存器(Repetition counter register,TIMx_RCR)
(2)向上计数模式
在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。
(3)向下计数模式
在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。
(4)中央对齐模式(向上/向下计数)
在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)−1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。 在此模式下,不能写入TIMx_CR1中的DIR方向位。它由硬件更新并指示当前的计数方向。
(5)重复计数器
“时基单元”解释了计数器上溢/下溢时更新事件(update event,UEV)是如何产生的,然而事实上它只能在重复计数达到0的时候产生。这个特性对产生PWM信号非常有用。
(6)时钟选择
计数器时钟可由下列时钟源提供: 内部时钟(internal clock,CK_INT),等等。
实验4-7 Proteus或MDK仿真TIM1输出7个PWM
TIM1定时时钟72 MHz时,
TIM1频率=TIM1CLK/(TIM1_周期+1)=72 MHz /(4095+1)=17.57kHz。
注意:虚拟示波器读出的周期是5.1x0.1ms,所以频率是1.96kHz,由于仿真的STM32的SYSCLK是8MHz,故再x9=17.65 kHz。
MDK逻辑分析器显示。
系统定时器SysTick(SysTick timer)是专用于实时操作系统,也可当成一个标准的递减计数器。它具有下述特性:
(1)24位的递减计数器
(2)自动重加载功能
(3)当计数器为0时能产生一个可屏蔽系统中断
实验4-8 SysTick生成1 ms的时基(标准库)
本实验将介绍如何配置SysTick以产生1ms的时基。
在本实验的程序设计中使用了一个延时函数,该函数是基于SysTick计数实现的。使用延时函数,LED可以进行定时亮灭,从而实现闪烁。
软件设计(编程)设计分析
设置SysTick的重装值:
如果SysTick的时钟是9MHz (HCLK/8)则是9000;
如果SysTick的时钟是72MHz (HCLK)则是72000.
计算:
9000/9000000=1/1000秒=1毫秒,
或72000/72000000=1/1000秒=1毫秒。
SysTick计数递减为0时发生中断,时间就是1毫秒