STM32定时器定时中断

TIM(Timer)定时器

定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断16 位计数器、预分频器、自动重装寄存器的时基单元,在 72MHz 计数时钟下可以实现最大 59.65s 的定时(还可以级联获得更大的时间)

不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能

根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

1. 核心功能

定时器是单片机的 "计时 / 计数工具":

  • 计时:基于内部时钟(如 72MHz),通过 "预分频器(降低时钟频率)+ 计数器(累计脉冲)+ 自动重装寄存器(设定目标值)" 的组合,实现精准定时(比如定时 1ms 触发一次中断)。

假如我对72MHz记了72个数,72MHz代表一秒钟有72 000 000个技术脉冲,那么就意味着一个技术脉冲的时间是 1/72 000 000,但是我们给的技术脉冲是72个,所以这个计时器就会1/72 000 000 *72=0.000 001 也就是1微妙的时间,就可以得到了1微妙的时间间隔。

那如果是72000 ,那就可以得到1毫秒的时间间隔

  • 计数:也可以对外部输入的脉冲信号(比如传感器的脉冲)进行计数,达到设定值时触发动作

2. 类型区别

类型 编号 总线 功能
高级定时器 TIM1、TIM8 APB2 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能
通用定时器 TIM2、TIM3、TIM4、TIM5 APB1 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能
基本定时器 TIM6、TIM7 APB1 拥有定时中断、主模式触发 DAC 的功能
  1. 总线(APB1/APB2)的区别 APB 是单片机的外设总线,APB2频率通常更高(比如 STM32 中 APB2 最大频率 72MHz,APB1 最大 36MHz),所以高级定时器(TIM1、TIM8)接 APB2,能支持更高的时钟速率,适配复杂功能;通用 / 基本定时器接 APB1,满足常规需求。

  2. 各类型核心差异(功能延伸)

    • 高级定时器:"死区生成 + 互补输出" 是电机驱动的关键(比如三相电机需要互补 PWM 并避免上下桥臂同时导通);"刹车输入" 可紧急切断输出(安全保护)
    • 通用定时器:"输入捕获" 用于测信号频率 / 占空比(比如红外遥控解码);"编码器接口" 可直接读取电机编码器的转速 / 方向
    • 基本定时器:功能最简,仅用于基础定时(比如定时触发 ADC 采样),或配合 DAC 做波形生成
  3. 实际应用场景(上一级的定时器包含了下一级的所有功能)

    • 高级定时器:直流无刷电机、伺服电机的驱动电路;
    • 通用定时器:舵机 PWM 控制、红外信号解码、编码器测速;
    • 基本定时器:系统定时中断(比如毫秒级延时)、DAC 波形触发

STM32F103C8T6 定时器资源:TIM1、TIM2、TIM3、TIM4

补充常见 STM32 芯片的定时器外设(以 F1 系列为例):

不同型号的 STM32,定时器数量 / 类型会有差异,以下是常用型号的配置:

  1. STM32F103C8T6(小容量)
    • 定时器:TIM1(高级)、TIM2~TIM4(通用) → 共 4 个
  2. STM32F103RCT6(中容量)
    • 定时器:TIM1(高级)、TIM2~TIM4(通用)、TIM5~TIM7(TIM5/T6/T7:TIM5 是 32 位通用,TIM6/T7 是基本) → 共 7 个
  3. STM32F103ZET6(大容量)
    • 定时器:TIM1(高级)、TIM8(高级)、TIM2~TIM7(TIM2/T3/T4/T5 是通用,TIM6/T7 是基本) → 共 8 个
  4. STM32F103VET6(中大容量)
    • 定时器:TIM1(高级)、TIM2~TIM4(通用)、TIM5~TIM7(TIM5 通用、TIM6/T7 基本) → 共 7 个

下面我们一个一个从简到难来进行分析

基本定时器(拥有定时中断、主模式触发 DAC 的功能)

1.定时中断

RCC开启时钟之后进入内部时钟,因为基本定时器没有外部时钟,然后进入到下面的时基单元,首先是PSC预分频,它可以对原本的时钟的72MHz进行分频,如果给0,那就是不分频,如果给的是1,那就是72MHz/2=36MHz,如果给的是2,那就是72MHz/3=24MHz,这个预分频器是 16 位的,所以最大值可以写 65535, 也就是 65536 分频

然后就是CNT计数器,然后这个就会对预分频后的时钟进行脉冲计数,来一个上升沿就会加1,这个CNT也是16位的,也就是说它记到65535就会清零,重新开始

最后就是这个自动重装载寄存器,他可以设置一个值,如果CNT在自增的时候值达到了这个值,就会触发后面的UI,也就是更新中断,这个更新中断之后就会通往 NVIC, 我们再配置好 NVIC 的定时器通道就会给CPU响应,UI下面的通道是更新事件,他不会响应CPU,但是他会响应其他的电路的工作

2.主模式触发 DAC 的功能(后续会详细讲的)

基本定时器的 "主模式触发 DAC" 功能,是让定时器定时产生触发信号,驱动 DAC 输出连续的模拟波形

1. 作用

  • DAC 是 "数模转换器",能把数字信号转成模拟电压;但要输出连续波形(比如正弦波、三角波),需要按固定时间间隔更新 DAC 的数字值
  • 基本定时器通过 "主模式" 可以定时产生触发信号(TRGO 信号),每当定时器定时完成一次,就给 DAC 发一个 "更新指令",让 DAC 切换到下一个数字值。
  • 最终效果:定时器按固定时间触发 DAC 更新,DAC 输出连续的模拟波形(比如 1ms 触发一次,就能输出 1kHz 的波形)

2.好处(就是不用手动触发DAC转换频繁占据CPU,可以直接用主模式就可以自动完成,仅需要把更新事件通过主模式映射到 TRGO, 然后 TRGO 就会直接去触发 DAC 了)

  • 精准同步:定时器的定时精度很高(比如 us 级),能让 DAC 波形的频率、周期更稳定。
  • 节省 CPU 资源:不需要 CPU 频繁主动给 DAC 写值,由定时器硬件自动触发,降低了 CPU 的负担
  • 简化代码:只需配置好定时器的定时时间 + DAC 的波形数据,硬件就能自动输出连续波形,代码逻辑更简洁

通用定时器(拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能)

"外部时钟模式 2":TIMx_ETR引脚

是 STM32 通用定时器的一种时钟源配置方式 ,核心是TIMx_ETR引脚输入的外部信号作为定时器的计数时钟

1. 核心逻辑

定时器默认用内部时钟(比如 72MHz)计数,但 "外部时钟模式 2" 会让定时器不依赖内部时钟,而是跟着外部信号的边沿(上升沿 / 下降沿)来计数------ 外部信号每跳变一次,定时器的计数器就 + 1。

2. 适用场景

需要对外部设备的脉冲信号计数 / 测频率的场景:

  • 比如接旋转编码器:编码器每转一个角度就发一个脉冲,定时器用外部时钟模式 2 计数,就能算出转速;
  • 比如接红外传感器:传感器检测到物体时发脉冲,定时器计数就能统计物体经过的数量。

3. 与 "外部时钟模式 1" 的区别

外部时钟模式 1 是用TIMx_CHx引脚(通道引脚)输入信号,而模式 2 是用专属的TIMx_ETR引脚,ETR 引脚的滤波、分频功能更灵活,抗干扰能力更强

"外部时钟模式 1":

  1. TIMx_ETR引脚:定时器的专属外部触发引脚(比如 TIM2 的 ETR 对应 PA0);
  2. ITR0~ITR3:来自其他定时器的内部触发信号(比如 ITR1 可以接 TIM1 的触发输出)
  3. TI1F_ED:TIMx_CH1的边沿(也就是下方TIMx_CH1通过边沿到TI1F_ED,这个无论是上升沿还是下降沿都是可以的)
  4. TI1FP1,TI2FP2:TIMx_CH1,TIMx_CH2的引脚

输出比较电路:可以用于PWM波形,驱动电机

输入捕获电路:测输入方波频率

高级计数器

其实高级电路也就是比通用电路多了上面几个地方的改动

1.REP寄存器:原本每达到一次周期就会进行UI,但是有了这个重复次数寄存器就可以设置几个周期进行一次UI,相当于对这个输出的更新信号又进行一次分频。原本计时器最大时间是59.65,现在乘以65536,那么时间就会变的很长了

解释一下:

无 REP 时的最大定时

之前算的 59.65s,是1 个计数周期的最大定时(预分频器、自动重装寄存器都设为 16 位最大值 65535)

高级定时器的 REP 寄存器的作用

REP 是 16 位寄存器,最大值是 65535(对应 "重复 65536 次")。它的逻辑是:定时器每完成 1 次计数周期(从 0 数到自动重装值),REP 计数器减 1;直到 REP 减到 0,才触发最终的更新事件

所以最大定时时间会 "乘以 65536"

原本 1 个周期最大是 59.65s,加上 REP 重复 65536 次后:最大定时时间 = 59.65s × 65536 ≈ 59.65×6.55 万 ≈ 3908224 秒 ≈ 45 天

本质是:REP 让定时器 "连续重复多个计数周期",相当于把定时时间 "拉长了 (REP+1) 倍",所以原最大定时会乘以 REP 的最大倍数(65536)

我圈出的区域是高级定时器的 "刹车功能 + 死区生成" 模块,这是高级定时器特有的、用于电机驱动等场景的核心安全 / 控制功能,分两部分解释:

一、下方红色圈:刹车功能(BRK)

1. 核心组成
  • 输入TIMx_BKIN:高级定时器的 "刹车引脚"(硬件安全输入口);
  • 极性选择:设置刹车信号的有效电平(高电平 / 低电平触发刹车);
  • 时钟失效事件:来自时钟安全系统(CSS)的信号(若定时器时钟故障,也会触发刹车)。
2. 功能作用

"刹车" 是紧急停止功能 :当TIMx_BKIN引脚收到有效信号(或时钟失效)时,会立即切断定时器的 PWM 输出(比如让OC1~OC4输出强制变高 / 变低),同时冻结计数器。

  • 典型场景:电机驱动中,遇到过流、急停按钮按下等危险情况时,通过刹车功能快速关闭 PWM,防止硬件损坏。

二、右侧红色圈:死区生成(DTG)

1. 核心组成
  • DTG 寄存器:存储 "死区时间" 的配置值;
  • DTG 模块:根据寄存器值,在 PWM 信号中插入 "死区";
  • 互补输出(TIMx_CHxN :高级定时器支持 "主通道(CHx)+ 互补通道(CHxN)" 的成对输出(比如CH1CH1N)。
2. 功能作用

"死区" 是在互补 PWM 的高低电平切换之间插入的一段 "无输出" 时间

  • 比如电机的 H 桥驱动中,CH1控制上桥臂 MOS 管、CH1N控制下桥臂 MOS 管;如果两者同时导通,会导致电源短路
  • 死区生成模块会让 "上桥臂关闭后,延迟一小段时间(死区),再打开下桥臂",反之同理,避免上下桥臂同时导通

总结

你圈出的区域是高级定时器适配 ** 功率器件驱动(如电机、逆变器)** 的关键功能:

  • 刹车功能→紧急安全保护;
  • 死区生成→避免功率器件短路

溢出频率还有计数频率

CK_CNT = CK_PSC / (PSC + 1)

计数器的计数频率(CK_CNT) = 预分频器输入频率(CK_PSC) ÷ 分频系数(PSC + 1)

1 个溢出周期(完成从 0 计数到目标值的时间)的时间 = 计数次数 ÷ 计数频率 = (ARR + 1) / CK_CNT

溢出频率:CK_CNT_OV = 1 / 周期时间 = CK_CNT / (ARR + 1)

把上面的**CK_CNT = CK_PSC / (PSC + 1)带入**

得到(溢出频率)CK_CNT_OV = CK_PSC / (PSC + 1) / (ARR + 1)

溢出频率的核心作用是直接对应 "定时器的定时 / 触发节奏",是定时器实际功能落地的关键指标,具体用处可以分场景看:

1. 实现 "精准定时任务"

溢出频率对应 "定时中断的频率":比如溢出频率是 1000Hz,就意味着每 1ms 触发一次定时中断

(溢出频率对应 "定时中断的频率":当溢出频率是 1000Hz 时,意味着 "1 秒钟内定时器溢出 1000 次",那么每次溢出的时间间隔就是:1秒 ÷ 1000次 = 0.001秒 = 1ms而定时中断的触发逻辑是:定时器每溢出一次,就会触发一次定时中断。所以溢出频率(1000Hz)就对应了 "每 1ms 触发一次定时中断")

  • 典型场景:在中断里实现 "毫秒级延时""定时采集传感器数据""周期性刷新 OLED 显示" 等。

2. 控制 PWM 波的频率

对于输出 PWM 的场景,PWM 的频率等于定时器的溢出频率(因为 PWM 的一个周期对应定时器的一次溢出)。

  • 比如电机控制中,需要 50Hz 的 PWM(舵机常用频率),就可以通过配置PSCARR,让溢出频率等于 50Hz。

3. 同步外设动作

溢出时产生的TRGO触发信号(之前讲过的主模式触发),其频率就是溢出频率。

  • 比如让 ADC 按溢出频率定时采样,或者让 DAC 按这个频率更新波形数据,实现 "外设间的精准同步"。

4. 计算实际定时时间

知道溢出频率后,反过来可以算出单次定时的时间定时时间 = 1 / 溢出频率

  • 比如溢出频率是 100Hz,定时时间就是 10ms;溢出频率是 1Hz,定时时间就是 1 秒。

"计数器无预装时序" 对应的是定时器中自动重装寄存器(ARR)的 "无预装载模式" ,核心是理解ARPE位(自动重装预装载使能位)的作用,下面分细节讲:

1. 先明确核心概念:"预装载寄存器"

定时器的ARR(自动重装寄存器)实际是 **"影子寄存器 + 预装载寄存器"** 的结构:

  • 预装载寄存器:是你写配置值的 "缓冲寄存器";
  • 影子寄存器:是实际参与计数器计数比较的 "工作寄存器"

2. ARPE=0:无预装载模式(你图中对应的场景)

ARPE位配置为 0 时,预装载寄存器被关闭 ------ 你写入ARR的数值会立即同步到影子寄存器,不需要等 "更新事件"(计数器溢出)

3. 无预装的时序特点(对应图 105 的逻辑)

以 "修改ARR值" 为例,时序流程是:

  1. 你通过代码向ARR写入新值;
  2. 新值立刻直接更新到影子寄存器
  3. 计数器下一个计数周期,就会用这个新的ARR值作为计数目标

4. 无预装模式的优缺点

  • 优点 :修改ARR后生效速度快,适合需要 "立即改变定时周期" 的场景;
  • 缺点 :如果在计数器计数过程中修改ARR,可能导致 "半个周期" 的异常(比如原本要计数到 100,中途改成 50,计数器会直接从当前值开始往 50 计数,破坏原有的周期节奏)。

对比:ARPE=1(有预装载模式)

ARPE=1时,写入ARR的新值会先存在预装载寄存器,等下一次 "更新事件"(计数器溢出)发生时,才同步到影子寄存器生效------ 这种模式能保证周期的完整性,但生效有延迟

总结:"无预装时序" 是ARPE=0时的工作方式,核心是ARR配置值 "立即生效",适合对实时性要求高但可以接受周期波动的场景。

RCC时钟树

左边的时钟产生电路

一、顶部模块:内部高速时钟(HSI)电路

  • 8MHZ HSI RC:内部 8MHz 的 RC 振荡器(无需外部晶振,芯片上电就能用);
  • /2 分频:可选将 HSI 分频为 4MHz 后输出;
  • 作用:作为默认系统时钟(芯片刚上电时,还没配置外部晶振时用它),或作为 PLL 的输入源之一。

二、中间模块:锁相环(PLL)倍频电路

  • PLLSRC:选择 PLL 的输入源(可以选 HSI/2,或外部高速时钟 HSE);
  • PLLMUL:倍频器(支持 ×2、×3...×16 等倍数);
  • PLLCLK:PLL 输出时钟(比如选 HSI/2(4MHz)×16 → 输出 64MHz;选 HSE(8MHz)×9 → 输出 72MHz);
  • 作用:将低频时钟(HSI/HSE)倍频到系统最大时钟(72MHz),给 CPU、内存等核心部件提供高速时钟。

三、右侧模块:系统时钟选择(SW)电路

  • SW :选择最终的系统时钟(SYSCLK)来源,可选:
    1. HSI(内部 8MHz);
    2. PLLCLK(PLL 倍频后的时钟);
    3. HSE(外部高速时钟);
  • CSS:时钟安全系统(若当前系统时钟故障,自动切回 HSI,保证芯片不宕机);
  • 作用:决定整个芯片的核心工作频率(比如选 PLLCLK=72MHz,芯片就以 72MHz 运行)。

四、底部模块:外部 / 内部低速时钟电路

  • HSE OSC:外部高速晶振(4-16MHz,接 OSC_IN/OSC_OUT 引脚),比 HSI(内部时钟) 更稳定,但是如果要求不大就可以选择内部时钟;
  • LSE OSC:外部低速晶振(32.768kHz,给 RTC 提供精准的实时时钟);
  • LSI RC:内部 40kHz 低速 RC 振荡器(给独立看门狗 IWDG 提供时钟);
  • 作用:提供稳定的外部时钟 (HSE)或专用低速时钟(LSE/LSI),适配不同外设需求。

看完后我们可以分析一个问题就是为什么外部时钟如果出现问题,为什么时钟好像慢了10倍

要理解 "外部时钟故障后系统时钟变慢 10 倍" 的现象,核心是STM32 的时钟安全系统(CSS)的 "故障降级机制",:

通常我们会将系统时钟配置为:外部高速时钟HSE(比如 8MHz 晶振)→ 送入 PLL 倍频 ×9 → 输出PLLCLK=72MHz → 作为SYSCLK(系统时钟)

HSE出现故障(比如晶振损坏、接触不良),时钟安全系统(CSS)会立即触发 "时钟切换"

自动将系统时钟SYSCLKPLLCLK切回内部高速时钟HSI(8Hz)

因为 PLL 的输入源默认是HSE(故障后 PLL 会停止工作),CSS 的逻辑是 "快速切换到稳定的内部时钟",而不是重新配置 PLL(避免故障时的复杂操作),所以直接用 HSI 的原始频率(8MHz)作为系统时钟

右边的时钟分配电路

其实就是所有时钟都是72MHz,然后输出。这里没什么要懂的,可以条跳过了

相关推荐
Devlab3 小时前
anyui - Master designer for LVGL [New release v0.40.0]
嵌入式硬件·物联网·低代码·ui·iot
v先v关v住v获v取3 小时前
微型面包车汽车制动器设计cad7张+三维图+设计说明书
科技·单片机·51单片机
d111111111d3 小时前
STM32编码电机闭环PID调节教程。
笔记·stm32·单片机·嵌入式硬件·学习·面试
云空3 小时前
《基于RK3588+ToF的环境颜色区域位置识别方案研究》
人工智能·嵌入式硬件·机器人
The️3 小时前
STM32-FreeRTOS操作系统-事件
arm开发·stm32·单片机·嵌入式硬件·mcu·物联网
GUET_一路向前3 小时前
STM32_I2C Timing参数计算方法(I2C speed:120k/240k/400k)
stm32·单片机·嵌入式硬件·iic
加成BUFF4 小时前
树莓派5控制WS2812 RGB灯带:原理、接线与实战指南
python·嵌入式硬件·远程连接·ws2812·树莓派5
从零点4 小时前
STM32学习笔记CAN
笔记·stm32·学习
清风6666664 小时前
基于单片机的架空线路接地故障检测与报警系统
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业