Skip to main content

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的值之后
  • 就会产生定时器溢出脉冲、定时器更新中断、事件
CNT一共有3种计数方式
图片
  • 向上计数模式:计数器从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 ➗️定时器计算​

图片
  1. 定时器频率

定时器频率CK_CNT = 定时器输入时钟 / (PSC + 1)

  • 定时器输入时钟:APB1 或 APB2 时钟(常用72MHz)

  • PSC:预分频器(0~65535)

  1. 定时周期

定时周期 = (PSC + 1) * (ARR + 1) / 定时器输入时钟

  • ARR:自动重装载值
PSC+1 ARR+1

之所以需要加一 是因为 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舵机周期所需的参数。