STM32——TIM定时器、定时中断、RCC时序(八)

一、TIM简介

TIM(Timer)定时器

定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断

16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时

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

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

注:总定时 = 所有 (PSC+1) 乘一起 × 所有 (ARR+1) 乘一起 ÷ 输入时钟频率(单级 / 级联都适用)的核心简化算法,记死这个逻辑,不管几级级联、要不要开预分频,直接套公式就行,不用再分步绕弯!

二、定时器分类

TIM1~8,一头一尾是高级,25通用,6、7基本。高级含低级的功能。

不同型号的定时器的资源不同,使用定时器之前要查资料。

1、基本定时器

时钟输入与预分频

  • 来自 RCC 的 TIMxCLK:这是定时器的最顶层时钟,由芯片的时钟树(RCC)提供,比如常见的 72MHz。

  • 预分频器(PSC) :对输入时钟进行分频,分频系数为 PSC+1,输出分频后的计数时钟 CK_CNT

计数与自动重装

  • CNT 计数器 :在 CK_CNT 驱动下递增计数,当计数值达到自动重装寄存器(ARR)的值时,触发更新事件(U)。

  • 自动重装寄存器(ARR):存储计数器的最大值,当计数器溢出时,会自动从这个寄存器加载数值,开始新一轮计数。

触发控制器

  • 这是基本定时器的一个特色模块,它可以把定时器的更新事件(U)输出为触发信号 TRGO,专门用来触发 DAC 进行同步转换。

  • 除此之外,触发控制器还负责控制计数器的复位、使能等操作。

注:基本定时器的时钟源只能来自内部时钟,计数方式只能向上计数。

2、通用计时器

通用定时器(TIM2~TIM5)就是 STM32 里的 "全能选手",比基本定时器多了 4 个通道,能定时、能测信号、能发 PWM,还能跟其他定时器联动,框图看着复杂,其实就分 4 块核心逻辑,一眼就能看懂。

一、时钟从哪来?(3 个 "心跳" 选项)

定时器要干活,得先有时钟,它有 3 种找 "心跳" 的方式:

  1. 内部时钟(最常用):直接用芯片内部的 72MHz 时钟(由 RCC 分配),是定时、PWM 的默认选择;

  2. 外部时钟( ETR 引脚):接外部硬件的脉冲信号,比如其他芯片的时钟,能用来测外部信号的快慢;

  3. 其他定时器触发( ITR :吃 "兄弟定时器" 的输出信号,比如 TIM1 溢出了,就给 TIM2 发个信号,这就是之前说的 "级联定时" 的硬件基础。

二、核心计数逻辑(定时器的 "大脑")

不管时钟从哪来,最终都要经过这 3 步,才能算出 "时间":

  1. 预分频器( PSC :把时钟 "放慢",比如 72MHz 太快,就除以 1000,让计数器走得慢一点;

  2. 计数器( CNT :按放慢后的时钟数数,能往上数、往下数,还能来回数(中心对齐);

  3. 自动重装( ARR :计数器数到这个数就 "清零重来",同时触发一个 "更新事件",相当于闹钟响了。

三、4 个通道能干啥?(核心 "技能包")

这是通用定时器最关键的部分,4 个通道(CH1~CH4)就是 4 个 "干活的手",主要干 3 件事:

  1. 输入捕获:盯着外部引脚,比如引脚电平跳变了,就立刻记下当前计数器的数,能测信号的周期、占空比(比如测超声波的回响时间);

  2. 输出比较:计数器数到预设值,就控制引脚电平翻转 / 置位 / 复位,能生成精准的方波;

  3. PWM 生成:输出比较的 "特殊模式",能持续输出高低电平交替的信号,用来控制电机转速、灯的亮度。

另外,通道信号还能接编码器接口,直接连电机的编码器,自动统计电机转了多少圈、转得快不快。

四、跟其他设备联动("互联枢纽")

定时器不是孤立的,它有两个关键 "接口",能跟其他外设联动:

  1. TRGO 输出:把定时器的 "闹钟信号" 发给其他定时器、ADC 或 DAC,比如让 ADC 定时采样,不用 CPU 插手;

  2. TRGI 输入:接收外部信号,控制自己的计数器(比如复位、开始数数),这也是级联时,从定时器 "听" 主定时器指挥的关键。

五、一句话总结

通用定时器就是 "可变速的计数器"+"4 个多功能通道"+"设备联动接口",基本定时器能做的它都能做,还能测信号、发 PWM、连电机,是 STM32 里最常用的定时器。

3、高级计时器

高级控制定时器(TIM1/TIM8)就是通用定时器的 "加强版",专为电机控制、功率变换这类需要精准控制和安全保护的场景设计。

一、核心升级点:比通用定时器多了啥?

  1. 互补输出与死区插入 它的 4 个主通道(CH1~CH4)都配有互补通道(CH1N~CH4N),能同时输出一对相位相反的驱动信号,比如控制半桥电路的上下管。死区发生器(DTG)会在两路信号之间插入一小段 "空白时间",防止上下管同时导通烧硬件,这是电机驱动里的必备安全机制。

  2. 重复计数器与刹车功能

    • 重复计数器:可以让计数器溢出多次才触发一次更新事件,方便生成多脉冲序列或延长定时周期。

    • 刹车输入(BKIN):这是一个硬件安全引脚,一旦检测到刹车信号,所有通道输出会立即被强制置为安全电平,防止电机失控,适合工业场景。

  3. **时钟安全系统(CSS)**如果定时器的输入时钟出现故障,会自动触发刹车动作,这是工业级设备的可靠性保障。

二、基础功能和通用定时器一样

  • 时钟源、预分频、计数模式、输入捕获、PWM 生成这些基础能力,和通用定时器完全一致。

  • 同样支持编码器接口和定时器级联。

三、一句话总结

高级控制定时器 = 通用定时器 + 互补 PWM 输出 + 死区控制 + 硬件刹车保护,是为工业电机、开关电源等功率控制场景量身打造的 "安全型定时器"。

三、定时中断

基本结构

先选时钟源(黄色模块)

定时器要工作,首先得挑一个 "心跳" 来源,有 4 种可选:

  1. 内部时钟:最常用,直接用芯片 RCC 提供的系统时钟。

  2. 外部时钟(ETR 引脚):从 GPIO 接外部脉冲信号,用来同步外部硬件。

  3. 其他定时器触发(ITRx):接收其他定时器的输出信号,实现级联定时。

  4. 捕获通道(TIx):从 GPIO 接编码器或其他脉冲信号,一般用在编码器模式里。

选好后,就进入对应的模式,比如内部时钟模式、编码器模式等。

时基单元(粉色模块)

这是定时器的 "计时核心",就像一个带分频的秒表:

  1. 预分频器(PSC):把输入的时钟 "放慢",比如 72MHz 的时钟可以分频成 1kHz,让计数器走得更慢,定时更长。

  2. 计数器(CNT):按放慢后的时钟数数,从 0 开始往上走。

  3. 自动重装器(ARR):计数器数到这个数就自动清零,重新开始,并触发一个 "更新事件",相当于闹钟响了。

运行控制和中断输出

  • 运行控制:负责启停计数器、复位计数器等操作,是定时器的 "开关"。

  • 中断输出控制:当计数器溢出(闹钟响)时,就向 NVIC(中断控制器)发送中断请求,让 CPU 来处理这个定时事件。

预分频器时序

初始状态(PSC=0,分频系数 = 1)

  • 预分频控制寄存器、缓冲器、计数器均为 0,分频系数 = PSC+1=1 ,因此CK_CNTCK_PSC频率相同。

  • 计数器使能(CNT_EN 变高)后,计数器从 F7 开始递增(FA→FB→FC),按CK_CNT节奏计数。

软件写入新 PSC 值(PSC=1)

  • 软件向 TIMx_PSC 寄存器写入 1(对应分频系数 = 2),此时预分频控制寄存器立即更新为 1 ,但缓冲器仍保持 0,预分频计数器也继续按 0 工作 ------ 这就是 "缓冲机制",避免运行时修改参数导致计数时钟突变。

更新事件(UEV)触发,新 PSC 值生效

  • 计数器计数到 FC 后溢出,触发更新事件(UEV)

  • 同步动作:预分频缓冲器将暂存的 1 同步到预分频计数器,预分频计数器开始按 1 工作(计数 0→1 循环)。

  • 时钟变化:CK_CNT频率变为CK_PSC / 2,即每 2 个 CK_PSC 脉冲,才输出 1 个 CK_CNT 脉冲(图中 CK_CNT 脉冲间隔变大)。

新参数下的计数逻辑

  • 计数器溢出后清零为 00,按新的CK_CNT节奏重新递增(00→01→02→03),计数速度因分频系数变大而变慢。
计数器时序

时钟分频与计数使能(准备阶段)

  • 分频逻辑 :内部时钟CK_INT分频因子为 2,意味着每 2 个 CK_INT 脉冲,才会输出 1 个 CK_CNT 脉冲(图中 CK_CNT 的周期是 CK_INT 的 2 倍)。

  • 使能触发CNT_EN由低变高,计数器立即响应使能,但需等待第一个CK_CNT脉冲到来才开始计数(硬件同步机制)。

正常计数阶段(计数到溢出前)

  • 计数器从当前值(图中 0034)开始,每来 1 个 CK_CNT 脉冲,计数值 + 1,依次递增至 0035、0036(此为该配置下的计数器最大值,由 ARR 决定)。

  • 此阶段CK_INT持续输出脉冲,但CK_CNT仅在每 2 个 CK_INT 脉冲时输出 1 个,计数器严格按CK_CNT节奏计数,体现了分频对计数速度的控制。

溢出与更新事件触发(核心节点)

  • 计数器溢出 :当计数值从 0036 递增到下一个CK_CNT脉冲时,计数器无法继续递增,瞬间清零为 0000,同时触发 "计数器溢出" 信号。

  • 更新事件(UEV):与 "计数器溢出" 同步触发,是定时器的核心同步信号,标志着一次完整的计数周期结束。

  • 中断标志置位 :更新事件触发后,更新中断标志(UIF)立即置位(高电平),若提前开启了定时器更新中断,此时会向 NVIC 发送中断请求,通知 CPU 处理。

溢出后重新计数(循环阶段)

  • 计数器清零为 0000 后,继续按CK_CNT的节奏递增(0000→0001→0002→0003),进入下一个计数周期,实现周期性定时。
计数器无预装时序

初始计数阶段(ARR=FF,未修改)

  • CNT_EN 置高,计数器按 CK_CNT 节奏从 31 开始递增(31→32→33→34→35→36)。

  • 此时 TIMx_ARR 寄存器值为 FF,理论上计数器需计数到 FF 才会溢出;但软件在计数至 36 前写入了新 ARR 值 36,触发关键变化。

ARR 新值 "立即生效"(ARPE=0 的核心表现)

  • 软件向 TIMx_ARR 写入 36 的瞬间,自动加载寄存器值从 FF 直接变为 36(无缓冲,立即覆盖)。

  • 此时计数器正计数到 36,新 ARR 值 36 与当前计数值相等,触发计数器溢出条件。

溢出与更新事件触发(同步节点)

  • 计数器计数值达到新 ARR 值 36,立即溢出并清零为 00,同时触发 "计数器溢出" 信号。

  • 与溢出同步,更新事件(UEV)触发,更新中断标志(UIF)置位(若开启中断,将向 NVIC 发请求)。

  • 此过程体现了 ARPE=0 时的特性:ARR 修改后,当前计数周期就会按新值执行,无需等待下一个周期

溢出后循环计数

  • 计数器清零为 00 后,按 CK_CNT 继续递增(00→01→02→03→04→05→06→07),进入以新 ARR=36 为阈值的下一个计数周期。
计数器有预装时序

软件写入 ARR 新值(缓冲暂存)

  • 计数器计数至 F1~F2 阶段时,软件向 TIMx_ARR 写入新值36

  • 关键表现 :预装载寄存器立即更新为 36,但影子寄存器仍保持 F5 不变(缓冲机制),计数器继续按影子寄存器的 F5 作为溢出阈值计数。

完成当前计数周期(不受新值影响)

  • 计数器按 CK_CNT 节奏继续递增,依次经过 F3、F4、F5,达到影子寄存器的 F5 值

  • 此过程中,新 ARR 值 36 仅存于预装载寄存器,未影响当前计数周期,保证了时序的连续性。

溢出触发更新事件(参数同步核心节点)

  • 计数器计数值达到 F5,立即溢出并清零为 00,同时触发 "计数器溢出" 信号;

  • 同步触发更新事件(UEV) ,此时预装载寄存器的 36 会同步写入影子寄存器,影子寄存器值从 F5 更新为 36;

  • 与 UEV 同步,更新中断标志(UIF)置位(需手动清零,否则重复触发中断)。

新周期按新 ARR 值计数

  • 计数器清零为 00 后,进入下一个计数周期,按 CK_CNT 递增(00→01→02→03→04→05→06→07);

  • 此周期的溢出阈值变为 36(影子寄存器新值),实现了 "当前周期结束后,新参数无缝生效"。

四、RCC时钟树

这张图是 STM32F103 的时钟树,核心作用是把不同时钟源,通过倍频、分频精准分配给 CPU 和所有外设,是理解定时器、串口等外设时钟来源的关键。

一、四大时钟源头(所有时钟的 "根")

时钟树的起点是四个独立时钟源,各有定位,没有表格也能清晰区分:

  1. HSI(高速内部时钟):频率 8MHz,是芯片内部的 RC 振荡器,启动速度极快,但精度一般。芯片刚上电时会默认使用它,也能作为应急备用时钟。

  2. HSE(高速外部时钟):频率范围 4~16MHz,常用 8MHz,需要外接晶振,精度高但启动稍慢。是芯片正常运行的主力时钟,尤其适合需要精准定时、串口通信的场景。

  3. LSI(低速内部时钟):频率 40kHz,内部 RC 振荡器,精度低,专门给独立看门狗(IWDG)使用,不影响主系统运行。

  4. LSE(低速外部时钟):频率 32.768kHz,外接小晶振,专门给 RTC(实时时钟)提供时钟,保证时间计时精准。

二、核心处理单元(时钟的 "加工厂")

时钟源出来后,会经过 PLL 和三级总线分频器处理,才能分配给各个部件,这是时钟树的核心逻辑:

1. PLL(锁相环):负责倍频

PLL 是 "倍频神器",能把低速时钟放大到系统需要的高速时钟。它的输入可以选择 HSI 二分频后的 4MHz,也可以选择 HSE 的原始频率(比如 8MHz)。通过 PLLMUL 配置倍频系数(2~16 倍),最经典的配置是 HSE 8MHz 乘以 9,得到 72MHz 的 PLLCLK,这是 STM32F103 能支持的最大系统时钟。最后通过 SW 开关,把 PLLCLK 选为系统核心时钟 SYSCLK。

  1. 三级总线分频(AHB、APB1、APB2):负责精准分配

72MHz 的 SYSCLK 出来后,会进入 AHB、APB1、APB2 三级总线,每级总线都有分频器,且有明确的最大频率限制:

  • AHB 总线:最大频率 72MHz,分频系数可选 1、2、4 等,通常设为 1 不分频,直接输出 72MHz。它给 CPU 内核、存储器、DMA 这些核心部件供时钟,是速度最快的总线。

  • APB1 总线:最大频率 36MHz,属于低速外设总线,分频系数可选 1、2、4 等,通常设为 2 分频,得到 36MHz。定时器 2-7、串口 2/3、I2C 等低速外设都挂载在这条总线上。

  • APB2 总线:最大频率 72MHz,属于高速外设总线,分频系数可选 1、2、4 等,通常设为 1 不分频,输出 72MHz。定时器 1/8、GPIO、串口 1、ADC 等高速外设都挂载在这条总线上。

三、定时器时钟的 "特殊规则"

最容易混淆的就是定时器时钟计算,它不直接等于所在 APB 总线的时钟,而是有 2 倍频补偿机制:

  1. 核心规则:如果 APB 总线的预分频器设置为 1(不分频),那么定时器时钟就等于该 APB 总线的时钟;如果 APB 预分频器设置为 2、4 等(分频),那么定时器时钟会是 APB 总线时钟的 2 倍。

  2. 实战计算:APB1 通常设为 2 分频,输出 36MHz,挂载的定时器 2-7 时钟就是 36MHz×2=72MHz;APB2 通常设为 1 分频,输出 72MHz,挂载的定时器 1/8 时钟就是 72MHz×1=72MHz。这也是之前计算定时时间时,始终用 72MHz 作为定时器输入时钟的原因。

四、其他关键外设时钟分配

除了定时器,几个常用外设的时钟分配也有明确规则:

  1. ADC:最大只能运行在 14MHz 以下,它的时钟由 APB2 的 72MHz 经过 ADC 预分频器处理,常用 6 分频,得到 12MHz,既满足精度要求,又留有余量。

  2. USB:必须使用 48MHz 时钟,由 72MHz 的 PLLCLK 经过 USB 预分频器(1.5 分频)得到,刚好是 48MHz,适配 USB 通信的时钟要求。

  3. RTC:由 LSE 的 32.768kHz 经过 128 分频后提供时钟,专门用于实时时间计数。

五、经典时钟配置流程
  1. 起振:先打开 HSE 高速外部晶振(8MHz);

  2. 倍频:PLL 输入选择 HSE,倍频系数设为 9,得到 72MHz 的 PLLCLK;

  3. 选主:将系统时钟 SYSCLK 切换为 PLLCLK,让 CPU 跑在 72MHz;

  4. 分频:AHB 设为 1 分频,APB1 设为 2 分频,APB2 设为 1 分频;

  5. 结果:CPU 和所有定时器都跑在 72MHz,串口、ADC 等外设按各自分频规则获得合适时钟,系统正常运行。

六、实战避坑指南
  1. 不要超频:STM32F103 的 SYSCLK 最大只能到 72MHz,超过这个频率会导致芯片死机;

  2. APB1 限速:挂载在 APB1 上的外设,时钟绝对不能超过 36MHz,否则会损坏外设;

  3. 定时器时钟:务必记住 "APB 分频非 1 则 ×2" 的规则,否则定时时间会计算错误;

  4. ADC 分频:必须保证 ADCCLK 不超过 14MHz,否则会影响模数转换的精度。

相关推荐
国科安芯17 小时前
航天器多路并联大功率电源系统设计与ASP4644均流特性分析
单片机·嵌入式硬件·fpga开发·安全性测试
茯苓gao19 小时前
嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解
网络·嵌入式硬件·学习·信息与通信
梁朝辉1 天前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
省四收割者1 天前
一文详解信号完整性(1)
python·嵌入式硬件·数学建模·信息与通信·信号处理·智能硬件
崇山峻岭之间1 天前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious1 天前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng1 天前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计1 天前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
kebidaixu1 天前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片详解
stm32
kebidaixu1 天前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片调试实录:四个关键问题与解决方案
stm32