定时器是嵌入式开发中最常用的外设之一。
它可以实现精确定时、PWM 输出、输入捕获等功能。
本篇将全面解析 STM32 的定时器。
一、定时器简介
TIM 是 Timer 的缩写,意思是定时器。
定时器可以对输入的时钟进行计数。
并在计数值达到设定值时触发中断。
STM32 的定时器功能非常强大。
不仅具备基本的定时中断功能。
还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能。
STM32F1 的定时器根据复杂度和应用场景分为三种类型。
第一种是高级定时器。
第二种是通用定时器。
第三种是基本定时器。
二、定时器类型详解
- 基本定时器
基本定时器是功能最简单的定时器。
它主要有以下特点。
第一,主模式触发 DAC,让内部硬件在程序控制之外自动运行。
第二,主模式可以把定时器更新事件映射到触发输出 TRGO,触发 DAC。
第三,基本定时器只能向上计数。
基本定时器适合简单的定时和计数应用。
- 通用定时器
通用定时器比基本定时器功能更丰富。
它具备以下功能。
第一,支持向上、向下、中央对齐三种计数模式。
第二,拥有 4 个独立通道,可用于输入捕获和输出比较。
第三,支持外部时钟输入。
第四,支持主从模式,可以级联多个定时器。
通用定时器是最常用的定时器类型。
- 高级定时器
高级定时器在通用定时器的基础上增加了以下功能。
第一,死区生成,用于电机控制等互补输出场景。
第二,互补输出,可以输出一对互补的 PWM 信号。
第三,刹车输入,用于紧急停止 PWM 输出。
高级定时器主要用于电机控制、开关电源等领域。
三、时基单元
定时器的核心是时基单元。
时基单元由预分频器、计数器和自动重装寄存器组成。
- 预分频器 PSC
预分频器用于对输入时钟进行分频。
计数器计数频率的计算公式是 CK_CNT 等于 CK_PSC 除以 PSC 加 1。
其中 CK_PSC 是定时器的预分频器输入时钟。
PSC 是预分频寄存器设置的数值。
CK_CNT 是计数器真正用来计数的时钟频率。
- 计数器 CNT
计数器是一个 16 位的计数器。
它根据计数频率递增或递减。
当计数值达到自动重装值时,产生更新事件。
- 自动重装寄存器 ARR
自动重装寄存器存储计数器的最大值。
计数器溢出频率的计算公式是 CK_CNT_OV 等于 CK_PSC 除以 PSC 加 1 再除以 ARR 加 1。
其中 ARR 是自动重载寄存器的值。
CK_CNT_OV 是定时器溢出的频率,也就是定时器中断的频率。
含义是 CNT 从 0 开始,一共要计数 ARR 加 1 个脉冲,才会溢出一次。
四、计数器模式
STM32 定时器支持三种计数模式。
第一种是向上计数。
计数器从 0 向上计数到自动重载值,然后产生更新中断。
第二种是向下计数。
计数器从自动重载值向下计数到 0,然后产生更新中断。
第三种是中央对齐。
计数器先向上计数到重载值,再向下计数到 0,上下都产生更新中断。
五、定时器中断配置
配置定时器中断需要以下步骤。
第一步,RCC 开启定时器时钟。
第二步,选择时基单元的时钟源,通常选择内部时钟源。
第三步,配置时基单元,设置预分频器和自动重装值。
第四步,配置输出中断,允许输出中断到 NVIC。
第五步,配置 NVIC,打开定时器中断通道,分配优先级。
第六步,运行控制,使能计数器。
六、PWM 输出
PWM 是 Pulse Width Modulation 的缩写,意思是脉冲宽度调制。
它通过对一系列脉冲的宽度进行调制,来等效获得所需要的模拟参量。
PWM 常用于电机控速、LED 调光、舵机控制等领域。
- PWM 参数
PWM 有三个重要参数。
第一个是频率。
频率等于 1 除以周期。
第二个是占空比。
占空比等于高电平时间除以周期。
第三个是分辨率。
分辨率等于占空比变化步距。
- PWM 频率计算
PWM 频率等于定时器原始时钟除以预分频值加 1 再除以自动重载值加 1。
也就是 PWM 频率等于 CK_PSC 除以 PSC 加 1 再除以 ARR 加 1。
- PWM 占空比计算
PWM 占空比等于捕获比较寄存器值除以自动重载值加 1。
也就是 Duty 等于 CCR 除以 ARR 加 1。
- PWM 分辨率计算
PWM 分辨率等于 1 除以自动重载值加 1。
也就是 Reso 等于 1 除以 ARR 加 1。
- 舵机控制
舵机是一种根据输入 PWM 信号占空比来控制输出角度的装置。
输入 PWM 信号要求周期为 20ms。
高电平宽度为 0.5ms 到 2.5ms。
通过改变高电平宽度,可以控制舵机转到不同角度。
- 直流电机控制
直流电机是一种将电能转换为机械能的装置。
有两个电极,当电极正接时电机正转,当电极反接时电机反转。
直流电机属于大功率器件,GPIO 口无法直接驱动。
需要配合电机驱动电路来操作。
TB6612 是一款双路 H 桥型的直流电机驱动芯片。
可以驱动两个直流电机并且控制其转速和方向。
七、输入捕获
输入捕获是定时器的另一个重要功能。
它可以用于测量 PWM 波形的频率、占空比、脉冲间隔、电平持续时间等参数。
- 输入捕获原理
输入捕获模式下,当通道输入引脚出现指定电平跳变时。
当前 CNT 的值将被锁存到 CCR 中。
通过计算两次捕获之间的 CNT 差值,就可以得到脉冲的宽度或周期。
每个高级定时器和通用定时器都拥有 4 个输入捕获通道。
- PWMI 模式
可配置为 PWMI 模式,同时测量频率和占空比。
PWMI 模式使用两个通道配合工作。
一个通道测量周期,另一个通道测量高电平宽度。
- 主从触发模式
可配合主从触发模式,实现硬件全自动测量。
主从触发模式可以让一个定时器的事件触发另一个定时器的操作。
这样可以减少 CPU 的干预,提高测量精度。
- 频率测量方法
测量频率有两种基本方法。
第一种是测频法。
在固定时间内计数脉冲个数,适合高频信号。
第二种是测周法。
测量一个脉冲的周期,然后取倒数得到频率,适合低频信号。
选择哪种方法取决于被测信号的频率范围。
八、术语汇总
以下是定时器相关的常用术语。
SYSCLK 是系统时钟。
CK_PSC 是预分频时钟。
PSC 是预分频寄存器。
CNT 是计数器。
CK_CNT 是计数器计数频率。
CK_CNT_OV 是计数器溢出频率。
ARR 是自动重装器。
CCR 是捕获比较寄存器。
ITR 是其他定时器。
TRGI 是触发输入。
TRGO 是触发输出。
ETR 是外部时钟。
小结
本篇我们全面解析了 STM32 的定时器。
包括定时器的三种类型、时基单元、PWM 输出和输入捕获。
定时器是嵌入式开发中最常用的外设之一。
掌握定时器的使用,可以实现精确定时、电机控制、频率测量等多种应用。
下一篇我们将学习嵌入式工程架构与代码规范。
敬请期待。