09 定时器
高级定时器 通用定时器
up的视频讲解: https://space.bilibili.com/1455872040
1 ⏱️定时器简介

定时器(Timer)即用来定时的器件,在STM32单片机定时器是一种外设。STM32F103C8T6总共有4个定时器,分别是
-
1个
高级定时器(TIM1)- 挂载在 APB2总线上 -
3个
通用定时器(TIM2、TIM3、TIM4)- 挂载在 ABP1总线上 -
当然还有一个内核里面的
SystemTick系统滴答定时器
-
利用系SysTick(系统滴答定时器),在主循环里轮询时间差,纯软件判断是否超时
-
优点:不占用硬件外设、数量不限、配置简单
-
缺点:依赖主循环,程序阻塞时计时不准
2 ➗️高级定时器外设结构

我们来详细分析一下这个高级定时器 把它分成四部分去看
- 触发控制
- 时基单元
- 定时器输入
- 定时器输出
可以看到RCC输入到定时器的时钟 会经过触发控制部分 然后给到时基单元 每来一个时钟 时基单元就会进行计数 并将计数值应用到定时器的输入输出
这是高级定时器的结构框图 通用定时器就是 对高级定时器的部分功能进行 裁剪
2.1 触发来源

CK_INT内部时钟:由 RCC 外设提供, 所有定时 / PWM 功能默认都用它。
ETR外部触发时钟: 把外部 ETR 引脚的脉冲作为时钟源
ITR0~ITR3内部互联触发:来自其他定时器比如 TIM2、TIM3 等的内部触发信号, 实现定时器级联,
TI1FP1/TI2FP2编码器接口时钟: 直接支持正交编码器输入,把编码器的 A/B 相脉冲转换成计数时钟,实现电机位置 / 速度测量
TRGO: 同步输出把定时器的溢出 / 比较事件同步触发给外设
我们具体地 看到它的结构 它有三种触发来源
- 来自芯片外部的ETR
- 来自其他定时器的ITR
- 来自定时器本身的通道
这些信号最终传到了右边这三个模块
Encoder Interface就是专门处理正交编码信号的模块Trigger触发控制器Slave Mode从模式控制器
这些触发信号最终都会传到触发控制器 然后再给到从模式控制器 从而对时钟进行控制

这里的从模式一共有有四种模式
- Trigger Mode 触发模式:一旦触发源产生一个触发信号 就让RCC时钟通过
- Gate Mode 门控模式: 触发源为高电平的时候 时钟通过 低电平 则关闭
- ResetMode 复位模式:RCC时钟始终通过 触发源一个触发信号就会将计数值清零
- External 外部时钟模式:就是让触发源的信号 直接作为工作时钟
这四种就是定时器的从模式 如果不使用从模式 那么RCC的时钟就直接给到时基单元
2.2 时基单元

这是定时器的 “心脏”,决定了定时周期、溢出频率,是所有功能的基础
PSC预分频器: 间的任意值进行分频,可在运行时改变其设置值
CNT 计数器: 核心计数寄存器,按 CK_CNT 脉冲计数 支持向上 / 向下 / 中央对齐计数
ARR自动重装载寄存器: 设定计数上限,CNT 计数到 ARR 时触发更新事件 决定定时周期的核心参数
重复计数模块: 高级定时器特有
当来自RCC的时钟信号输入进来之后
- 通过PSC分频成为计数脉冲
- 每来一个计数脉冲CNT就加1
- 当CNT的值等于ARR的值之后
- 就会产生定时器溢出脉冲、定时器更新中断、事件

-
向上计数模式:计数器从0计数到自动重装载值
ARR,然后重新从0开始计数并且产生一个计数器溢出事件 -
向下计数模式:计数器从自动装入的值
ARR开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件 -
中心对齐模式:计数器从0开始计数到自动重装载值
ARR-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件, 然后再从0开始重新计数
2.3 定时器输入

这部分是 “输入捕获” 通道,用于测量外部信号的频率、脉宽、周期等参数, 信号处理流程:
-
外部信号从
TIMx_CH引脚进入 -
滤波与
边沿检测, 生成脉冲信号 -
经过
Prescaler分频器,降低捕获触发频率; -
硬件自动将当前CNT的值锁存到
Capture/Compare Register
2.4 定时器输出

DTG死区时间(高级定时器特有): 就是互补信号切换时,插入的一小段 “上下管都关断” 的时间
BRK刹车保护(高级定时器特有): 是一个硬件引脚,当外部故障(过流、过温)触发时,会瞬间强制关闭所有 PWM 输出
高级定时器的输出,核心是基于计数器 CNT 和捕获 / 比较寄存器 CCRx 的比较结果,来控制引脚电平
-
当计数器 CNT的值,和 CCR的值 匹配时
-
硬件会自动改变输出状态,从而生成 PWM 脉冲、定时信号等
3 ➗️定时器计算

- 定时器频率
定时器频率CK_CNT = 定时器输入时钟 / (PSC + 1)
-
定时器输入时钟:APB1 或 APB2 时钟(常用72MHz)
-
PSC:预分频器(0~65535)
- 定时周期
定时周期 = (PSC + 1) * (ARR + 1) / 定时器输入时钟
- ARR:自动重装载值
之所以需要加一 是因为 0也对应着一个时钟脉冲
✅三个计数关系
向上计数、边沿对齐时:fCNT=fTIM/(PSC+1),fUPDATE=fCNT/(ARR+1)。PWM模式1且有效高时,占空比约为CCR/(ARR+1),同时要考虑CCR的边界情况。
以72 MHz定时器为例,PSC=71得到1 MHz计数,ARR=999得到1 kHz周期。这里PSC和ARR写入的是“除数减1”,不能把72和1000直接填进去。
计数器溢出、输出比较、输入捕获是不同事件;Input Capture负责把边沿时刻的CNT锁存到CCR,PWM负责比较CNT和CCR改变输出。练习分别计算1 ms中断和20 ms舵机周期所需的参数。