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,否则会影响模数转换的精度。

相关推荐
CQ_YM2 小时前
ARM之I2C
arm开发·单片机·嵌入式硬件·嵌入式
让世界再也没有bug3 小时前
测试工具之一 ------示波器
单片机·嵌入式硬件·硬件测试·嵌入式软件测试
CircuitWizard3 小时前
STM32 + 淘晶驰T1串口屏波形显示
stm32·单片机·嵌入式硬件
A9better3 小时前
嵌入式开发学习日志53——互斥量
stm32·嵌入式硬件·学习
Q_21932764555 小时前
基于单片机的个性化服装尺寸红外 测量仪的设计
单片机·嵌入式硬件
Polanda。5 小时前
定时器-PWM参数测量实验
stm32·单片机·嵌入式硬件
恶魔泡泡糖6 小时前
51单片机串口通信
c语言·单片机·嵌入式硬件·51单片机
wotaifuzao6 小时前
【Keil 5安装】keil 5最新版本安装+环境配置+下载百度资源分享(安装包,注册机等)
stm32·单片机·嵌入式硬件·mcu·学习·keil5·最新keil
染予7 小时前
8.AD软件操作:绘制一个完整的原理图需要进行哪些操作?
嵌入式硬件