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,然后输出。这里没什么要懂的,可以条跳过了

相关推荐
雨疏风骤124013 小时前
ROM与RAM,储存地址、链接地址以及运行地址
linux·stm32·嵌入式·linux嵌入式
深耕AI13 小时前
【恍然大悟】8位单片机如何处理大数与二进制乘法?
单片机·嵌入式硬件
z203483152014 小时前
智能台灯控制面板
单片机·嵌入式硬件
钿驰科技14 小时前
TC-BL3650驱动板在无刷减速电机的应用
单片机·嵌入式硬件
深耕AI14 小时前
【单片机】解密STC89C52
单片机·嵌入式硬件
三佛科技-1341638421214 小时前
FT32F072xx、FT32F072xB、FT32F072x6/x8基于ARM Cortex-M0内核32位单片机分析
arm开发·单片机·嵌入式硬件·智能家居·pcb工艺
清风66666614 小时前
基于单片机的火焰与温度联动检测及声光灭火控制系统
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
chen_mangoo14 小时前
Rockchip debian预置安装deb包
linux·驱动开发·嵌入式硬件
梁山1号14 小时前
【关于CAN】
c语言·stm32·单片机
尼喃14 小时前
汽车摩托车LED车灯驱动芯片IC,精准调光抗干扰,为车灯性能提升赋能
单片机·汽车·51单片机·芯片