本文将介绍通用定时器的概念、相关函数以及STM32CubeMX生成定时器的配置函数以及对生成定时器的配置函数进行分析(包括结构体配置、相关寄存器配置)。
本文以TIM2/TIM5、TIM3/TIM4为基础介绍通用定时器(包含通用定时器全部功能),其余的通用定时器都是功能阉割版,可自行查阅芯片的reference manual和HAL库手册。
最后针对于通用定时器实践:使用TIM2输出PWM控制全彩LED灯;输入捕获MCU开发学习记录8 - 基本定时器学习与实践(HAL库)的LED灯高电平持续时间;主从定时器移相控制(利用主定时器输出一路PWM同时作为触发信号,从定时器输出移相PWM波)。
0. F4系列定时器分类
- 最大接口时钟(Max interface clock (MHz))
1. 定时器与系统内核(如MCU)之间的通信接口(如APB总线)支持的最高时钟频率。
2. 它决定了定时器寄存器配置和状态读取的速度上限。例如,如果接口时钟为84 MHz,则对定时器寄存器的读写操作需基于该频率进行,不能超过此速率。 - 最大定时器时钟(Max timer clock (MHz))
1. 定时器内部计数器(Counter)实际运行时的最高时钟频率。
2. 它决定了定时器的计数速度,直接影响定时器的计时精度和输出信号的频率上限。例如,168 MHz的定时器时钟意味着计数器每秒最多递增168,000,000次。
1. 什么是通用定时器?
1.1 通用定时器概念
1.1.1 通用定时器功能说明
STM32F4系列的通用定时器为TIM2/TIM5(32位定时器,即计数值CNT有32位)、TIM3/TIM4(16位定时器)、TIM9-TIM14(16位定时器,功能阉割版)。
- TIM2/TIM5、TIM3/TIM4功能相同(只有计算器位数不同):
· 递增、递减和递增/递减(双向)的计数模式
· 4个独立通道:输入捕获;输出比较;PWM 生成(边沿和中心对齐模式)、单脉冲输出
· 多定时器主从互连以及外部信号控制定时器
· 如下事件时生成中断/DMA 请求:
1. 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
2. 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
3. 输入捕获
4. 输出比较
· 增量编码器与霍尔传感器支持
· 外部时钟模式允许定时器使用外部信号作为时钟源,而不是内部的APB时钟。这有两种模式:外部引脚输入(通过定时器的 外部触发输入引脚(TIMx_ETR) 接收外部脉冲信号。即外部脉冲直接驱动定时器的计数器递增。)和外部触发输入(来自其他外设的触发信号(如另一个定时器的 TRGO信号、ADC的转换完成信号等))。
- TIM9/TIM12:
· 只有 递增计数模式
· 2个独立通道:输入捕获;输出比较;PWM 生成(边沿和中心对齐模式)、单脉冲输出
· 多定时器主从互连以及外部信号控制定时器
· 如下事件时生成中断:
1. 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
2. 输入捕获
3. 输出比较
- TIM10、TIM11、TIM13、TIM13:
· 只有 递增计数模式
· 1个独立通道:输入捕获;输出比较;PWM 生成(边沿和中心对齐模式)、单脉冲输出
· 如下事件时生成中断:
1. 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
2. 输入捕获
3. 输出比较
1.1.2 通用定时器框图
下图为正点原子开发指南里面的通用定时器框图,如下所示。
- 时钟来源选择: · 内部时钟 (CK_INT)· 外部时钟模式 1 :外部输入引脚 (TIx)· 外部时钟模式 2 :外部触发输入 (ETR) ,仅适用于 TIM2 、 TIM3 和 TIM4 。· 内部触发输入 (ITRx)(定时器主从模式) :使用一个定时器作为另一个定时器的预分频器,例如可以将定时器配置为定时器 2 的预分频器。
- TIM控制器:
复位、使能、计数、TRGO(通用触发输出)定时器或DAC/ADC、编码器接口。 - 时基单元:
· 计数模式:递增、递减和递增/递减(双向/中心对齐模式)
· 预分频器寄存器 (TIMx_PSC) - 具有影子寄存器
· 计数器寄存器 (TIMx_CNT)
· 自动重载寄存器 (TIMx_ARR)- 具有影子寄存器 - 输入捕获通道:
配置TIMx_CCER(CCnP/CCnNP)使能TIMx_CHn输入通道,生成TInF(Timer Input n Filter)信号,通过边沿检测器生成对应边沿信号TInFPx(Timer Input n Filtered and Polarity-Processed)经过预分频器生成ICnPS(Input Capture n Prescaler)触发对应输入捕获事件。 - 输入捕获/输出比较通道共用部分:
· 输入捕获部分:
描述了输入捕获事件相关寄存器配置,以及读CCRx的计数值。
· 输出比较部分:
描述了输出捕获事件相关寄存器配置,以及写CCRx的计数值。 - 输出比较通道:
本部分主要两个功能:一是PWM输出;二是做TRGO的触发信号。
1.2 通用定时器-时钟计数模式(三种)
TIMx_CR1.CMS(Center-aligned mode selection):中心对齐模式选择
TIMx_CR1.DIR(Direction):方向(递增、递减)
TIMx_CR1.URS((Update request source):中断或 DMA 请求的请求源选择
TIMx_CR1.UDIS(Update disable):使能/禁止 UEV 事件
TIMx_CR1.CEN(Counter enable):计数器使能

1.2.1 通用定时器-递增计数模式
1.2.2 通用定时器-递减计数模式
1.2.3 通用定时器-中心对齐模式(递增/递减计数)
CMS=11
CMS=01(counter underflow)CMS=10(counter overflow)
1.3 通用定时器时钟源
1.3.1 通用定时器时钟源1-内部时钟源 (CK_INT)
SMS = 000(即禁止从模式控制器),CEN 位、DIR 位(TIMx_CR1 寄存器中)和UG位(TIMx_EGR 寄存器中)为实际控制位。
1.3.2 通用定时器时钟源2-外部时钟模式 1:外部输入引脚 (TIx)
SMS = 111,即计数器可在选定的输入信号上出现上升沿或下降沿时计数。
芯片参考手册中举例:要使递增计数器在 TI2 输入出现上升沿时计数,请执行以下步骤:
1.3.3 通用定时器时钟源3-外部时钟模式 2:外部触发输入 (ETR)
芯片参考手册中举例:要使递增计数器在 ETR 每出现 2 个上升沿时计数,请执行以下步骤:
1.3.4 通用定时器时钟源4-内部触发输入 (ITRx)
参考本文的1.6.2 定时器同步
1.3 通用定时器-输入捕获/输出比较通道
1.3.1 输入捕获通道
下图为正点原子开发指南注释的输入捕获通道图。
工作流程:
外部信号->TIx引脚->TIxF信号->TIxFPx信号(边沿极性信号)->ICx(输入捕获)->ICxPS
1.3.2 共用通道- 输入捕获部分
下图为正点原子开发指南注释的共用通道- 输入捕获部分图。
1.3.3 共用通道- 输出比较部分
下图为正点原子开发指南注释的共用通道- 输出比较部分图。
1.3.4 输出比较通道
下图为正点原子开发指南注释的输出比较通道图。
1.4 通用定时器输入模式
1.4.1 输入捕获模式
1. 输入捕获模式说明:
当检测到外部信号(如TI1引脚)的指定边沿(上升沿/下降沿)时,将当前计数器值锁存到捕获寄存器(TIMx_CCRx)中。
通过中断或DMA通知系统读取捕获值,用于计算信号频率、脉宽等参数。
2. 关键寄存器:
-
输入通道(TI1/TI2等):外部信号输入引脚。
-
输入滤波(ICxF):消除信号抖动。
-
边沿检测(CCxP/CCxNP):选择触发边沿(上升沿/下降沿)。
-
捕获寄存器(TIMx_CCRx):存储捕获时的计数器值。
-
中断/DMA标志(CCxIF/CCxOF):通知系统捕获完成。
3. 具体流程:
-
选择有效输入通道(映射TI1到CCR1)
· TIMx_CCMR1.CC1S[1:0] - 01(输入模式)
· (输入模式,即TIMx_CCMR1.CC1S[1:0]不等于0)使TIMx_CCR1变为只读模式 -
配置输入滤波(消除信号抖动)
· TIMx_CR1.CKD[1:0] - 设置 tDTS数字滤波器采样时钟
· TIMx_CCMR1.IC1F[3:0] - 设置可定义 TI1 输入的采样频率和适用于 TI1 的数字滤波器带宽。数字滤波器由事件计数器组成,每 N 个事件才视为一个有效边沿: -
选择有效触发边沿
· TIMx_CCER.CCxP - 0 上升沿、1 下降沿
· TIMx_CCER.CCxNP - 双边沿触发 -
配置输入预分频器(禁止预分频)
· TIMx_CCMR1.IC1PS[1:0] - 设置00
,禁止预分频器,即每次检测到有效边沿均触发捕获。 -
使能捕获功能
· TIMx_CCER.CC1E - 1:允许计算器的值捕获到捕获寄存器中。 -
使能中断/DMA请求
· TIMx_DIER.CC1IE - 1:使能捕获完成中断。
· TIMx_DIER.CC1DE - 1:使能DMA请求(需配合DMA控制器初始化)。
4. 捕获事件处理流程:
-
跳变沿检测
TI1输入信号经过滤波和边沿检测后,确认有效上升沿。 -
计数器值锁存
· 计数器值立即写入TIMx_CCR1寄存器。 -
标志位更新
· CC1IF标志(TIMx_SR寄存器) 置1,表示捕获完成。
· 若中断已使能(CC1IE=1),触发中断服务程序(ISR)。
· 若DMA已使能(CC1DE=1),触发DMA传输。 -
重复捕获处理
· 未及时读取TIMx_CCR1或清除CC1IF标志,下次捕获时CC1OF标志(溢出标志)置1,提示数据覆盖风险。 -
标志位清除
· TIMx_SR.CC1IF:软件写0 或 读取TIMx_CCR1寄存器。
· TIMx_SR.CC1OF:软件写0。
注:TIMx_EGR.CC1G置1,可生成IC中断和DMA请求。
1.4.2 PWM输入模式
1. PWM输入模式说明:
一个外部引脚(TI1)即可同时捕获PWM信号的周期(Period)和占空比(Duty Cycle)。
IC1通道:捕获PWM信号的上升沿,记录周期值(TIMx_CCR1)。
IC2通道:捕获PWM信号的下降沿,记录占空比(TIMx_CCR2)。
计数器复位:每次捕获上升沿时,触发从模式控制器复位计数器(TIMx_CNT),确保周期测量准确性。
2. 具体流程:
-
配置IC1通道(捕获上升沿,测量周期)
· TIMx_CCMR1.CC1S[1:0] - 01,将IC1映射到 TI1输入(即PWM信号输入引脚)。
· TIMx_CCER.CC1P/CC1NP - 00,选择上升沿触发。 -
配置IC2通道(捕获下降沿,测量占空比)
· TIMx_CCMR1.CC2S[1:0] - 10,将IC2也映射到 TI1输入(同一引脚)。
· TIMx_CCER.CC1P/CC1NP - 10,选择上升沿触发。 -
配置从模式控制器(复位模式)
· TIMx_SMCR.TS[2:0] - 101,选择触发源为 TI1FP1(即IC1的滤波后信号)。
· TIMx_SMCR.SMS[2:0] -100,使能从模式为复位模式(上升沿复位计数器)。 -
使能捕获功能
· TIMx_CCER.CC1E/CC2E都写入 1,允许捕获到TIMx_CCR1和TIMx_CCR2。
1.5 通用定时器输出模式
1.5.1 强制输出模式
1. 强制输出模式说明:
强制输出模式允许软件直接控制定时器的输出比较信号(OCxREF和OCx引脚电平),绕过计数器与比较寄存器的比较逻辑,强制设定输出状态。强制输出时,计数器与影子寄存器的比较仍正常执行,可触发中断或DMA请求。
2. 具体流程:
-
配置通道为输出模式
· TIMx_CCMRx.CCXS[1:0] - 00,选择通道为输出模式(默认模式)。 -
强制设置输出电平
· TIMx_CCMRx.OCxM[2:0] - 100:强制OCxREF为无效电平;101:强制OCxREF有效电平。 -
配置输出极性(CCxP位)
· TIMx_CCER.CCxP - 0:高电平有效;1:低电平有效 -
中断/DMA触发逻辑:
若计数器与比较寄存器匹配,CCxIF标志(TIMx_SR) 置1,触发中断或DMA请求。
1.5.2 输出比较模式
1. 输出比较模式说明:
输出比较模式(特别是 翻转模式)允许定时器在计数器(TIMx_CNT)与捕获/比较寄存器(TIMx_CCRx)匹配时,自动翻转输出引脚(OCx)的电平。
2. 关键寄存器:
- 输出模式(OCxM):定义匹配时的输出行为(如翻转、置高、置低)。
- 输出极性(CCxP):控制输出引脚是否反相。
- 预装载寄存器(OCxPE):决定是否启用影子寄存器(缓冲写入的TIMx_CCRx值)。
3. 具体流程:
-
选择计数器时钟(设置PSC):
-
写入TIMx_ARR和TIMx_CCRx:
-
使能中断/DMA请求:
· CCxIE位(中断使能):置1时,匹配事件触发中断。
· CCxDE位(DMA使能):置1时,匹配事件触发DMA请求。 -
选择输出模式(翻转模式):
· OCxM=011:选择翻转模式(匹配时翻转输出电平)。
· OCxPE=0:禁用预装载寄存器(直接写入TIMx_CCRx生效)。
· CCxP=0:输出极性为不反相(OCxREF与OCx引脚电平一致)。
· CCxE=1:使能输出引脚。 -
启动计数器:
TIMx_CR1.
CEN 置1,启动计数器。
1.5.3 PWM输出模式
1. PWM输出模式说明:
PWM模式通过定时器的 自动重载寄存器(TIMx_ARR) 和 捕获/比较寄存器(TIMx_CCRx) 生成频率和占空比可调的脉冲信号。
2. 具体流程:
-
选择PWM模式(模式1或模式2)
向 TIMx_CCMRx 寄存器的 OCxM[2:0]位 写入:
· PWM模式1:110
(有效电平在计数器 < CCRx 时保持,否则无效)。
· PWM模式2:111
(有效电平在计数器 > CCRx 时保持,否则无效)。 -
使能预装载寄存器
· 使能捕获/比较预装载(TIMx_CCRx):TIMx_CCMRx.OCxPE = 1。
· 使能自动重载预装载(TIMx_ARR):TIMx_CR1.ARPE = 1。 -
初始化寄存器(生成更新事件)
· TIMx_EGR 寄存器的 UG位 写入1
,手动生成更新事件。 -
配置输出极性
· TIMx_CCER 寄存器的 CCxP位 写入:0:高电平有效;1:低电平有效 -
使能输出引脚
· TIMx_CCER 寄存器的 CCxE位 写入1
,使能OCx引脚输出。 -
设置自动重载值(ARR)和比较值(CCRx)
· TIMx_ARR、 TIMx_CCRx -
启动计数器
· TIMx_CR1.CEN写入1
,启动计数器。 -
PWM信号生成逻辑
· PWM.CMS 中心对齐模式选择
· PWM.DIR 计算器方向(PWM.CMS[1:0] - 00)
CCIF是捕获/比较中断标志位
3. 注意:
1.6 定时器的外部触发同步
1.6.1 从模式-复位模式:SMS=100
复位模式(Reset Mode)是STM32定时器的一种从模式,通过外部信号(如TI1上升沿)复位计数器(TIMx_CNT),并可选生成更新事件(UEV)以刷新预装载寄存器。
- 外部触发复位:当检测到指定触发信号(如TI1上升沿)时,立即复位计数器(TIMx_CNT=0)。
- 更新事件(UEV)生成:若
TIMx_CR1.URS=0
,复位时会触发UEV事件,更新预装载寄存器(TIMx_ARR和TIMx_CCRx)。 - 中断/DMA触发:复位事件可触发中断或DMA请求,用于同步其他操作。
1.6.2 从模式-门控模式:SMS=101
门控模式是一种通过 外部输入信号电平(如TI1)控制计数器启停 的定时器操作模式,适用于需要根据外部设备状态动态控制计数的场景(如启动/暂停测量、外部同步控制等)。
- 电平触发启停:根据外部信号(如TI1)的电平高低,控制计数器的运行(低电平启动计数,高电平停止计数)。
- 中断触发:计数器启动或停止时,
TIF
标志(TIMx_SR
寄存器)置1,可触发中断或DMA请求。 - 同步延迟处理:输入信号(TI1)需经过同步电路,避免亚稳态影响计数精度。
1.6.3 从模式-触发模式:SMS=110
- 外部触发启动计数器:当检测到指定输入信号(例如TI2上升沿)时,启动计数器根据内部时钟开始递增。
- 中断标志置位:触发事件发生时,
TIF
标志(TIMx_SR
寄存器)置1,可用于中断或DMA通知。 - 同步延迟处理:外部输入信号(TI2)需经过同步电路,导致触发信号与实际计数器启动之间存在1-2个时钟周期的延迟。
1.6.4 从模式-外部时钟模式 2 +触发模式:SMS=110
外部时钟模式2(ETR作为时钟源) 和 触发模式(TI11上升沿启动计数器),实现由外部触发信号控制计数器在外部时钟驱动下精准计数。
- 外部时钟源:ETR引脚作为计数器的时钟源(每个上升沿触发计数)。
- 触发启动:TI11的上升沿作为触发信号,启动计数器(CEN=1)。
- 同步延迟处理:ETR信号需通过同步电路,导致计数器实际递增延迟1-2个时钟周期。
1.7 定时器同步
定时器同步 允许通过主从模式配置,将多个定时器级联或协同工作,实现复杂的时序控制、频率扩展及多外设同步。
通用定时器内部连接表和定时器同步内部结构连接图
1.7.1 一个定时器用作另一个定时器的预分频器(外部时钟模式)
TIM1配置为主定时器、TIM2配置为从定时器,从而实现 TIM1作为TIM2的预分频器。即利用 TIM1的更新事件(UEV) 作为 TIM2的外部时钟源,使TIM2的计数速率由TIM1的溢出频率控制。
- TIM1:作为预分频器,通过ARR值设定触发周期。
- TIM2:在TIM1的每次溢出时递增,扩展整体计数范围或降低时钟频率。
配置流程:
-
配置TIM1为主定时器
· 设置主模式(MMS=010):TIM1_CR2
寄存器的 MMS[2:0]位 写入010
,选择 更新事件(UEV) 作为触发输出(TRGO)。
· 设定TIM1的周期(ARR值)
· 使能TIM1计数器:TIM1_CR1
寄存器的 CEN位 写入1
,启动TIM1计数。 -
配置TIM2为从定时器
· 选择触发源(TS=000):TIM2_SMCR
寄存器的 TS[2:0]位 写入000
,选择 内部触发源0(ITR0),即TIM1的TRGO信号。
· 设置外部时钟模式(SMS=111):TIM2_SMCR
寄存器的 SMS[2:0]位 写入111
,选择 外部时钟模式1。
· 使能TIM2计数器:TIM2_CR1
寄存器的 CEN位 写入1
,启动TIM2计数。
1.7.2 使一个定时器使能另一个定时器(门控模式,OC1REF为触发源)
1. 功能介绍:
通过 定时器1的OC1REF信号 作为门控信号,控制 定时器2的计数启停。
- OC1REF高电平:定时器2根据分频后的时钟计数。
- OC1REF低电平:定时器2停止计数,保持当前值。
- 应用场景:测量外部信号高电平持续时间、节能模式下的间歇计数。
2. 配置流程:
1. 定时器1配置(主模式,生成OC1REF波形)
-
主模式设置:
TIM1_CR2.MMS[2:0]=100
。将定时器1的 OC1REF信号 作为触发输出(TRGO),用于控制定时器2。 -
输出比较配置(PWM模式):
TIM1_CCMR1.OC1M[2:0]=110
(PWM模式1)。TIM1_CCR1=0x80
:占空比50%(高电平占128个时钟)。
TIM1_ARR=0xFF
:定义PWM周期为256个时钟。 -
时钟分频:
TIM1_PSC=2
(3分频,实际时钟频率为f_CK_CNT=f_CK_INT/3
)。 -
启动定时器1:
TIM1_CR1.CEN=1
。
2. 定时器2配置(从模式,门控控制)
-
触发源选择:
TIM2_SMCR.TS[2:0]=000
(选择 ITR0,即TIM1的TRGO信号)。 -
门控模式使能:
TIM2_SMCR.SMS[2:0]=101
。定时器2的计数器仅在OC1REF高电平时递增。 -
时钟分频与启动
-
预分频器:
TIM2_PSC=2
(3分频)。 -
启动定时器2:
TIM2_CR1.CEN=1
(实际计数受OC1REF电平控制)。
-
3. 初始化注意事项
-
计数器未初始化:
-
若未复位,定时器2从当前值开始计数(示例中从0x3045开始)。
-
-
强制复位方法:
-
写入
TIMx_EGR.UG=1
,复位计数器(如启动前写入TIM2_CNT=0
)。
-
1.7.3 使一个定时器使能另一个定时器(门控模式,CNT_EN为触发源)
1. 功能介绍:
通过 定时器1的使能信号(CEN) 控制 定时器2的启停,实现主从定时器的同步。
- 主定时器1启动(CEN=1):定时器2开始计数。
- 主定时器1停止(CEN=0):定时器2停止计数。
- 应用场景:多设备同步启停、精确控制计数窗口。
2. 配置流程:
1.7.4 使用一个定时器启动另一个定时器(触发模式)
利用定时器1的更新事件(UEV)作为触发信号,自动启动 定时器2的计数器(CEN=1),并控制其计数周期。
◦ 主模式(TIM1):生成更新事件作为触发信号(TRGO)。
◦ 从模式(TIM2):配置为触发模式(Trigger Mode),收到触发信号后自动启动计数。
和1.7.3相比,需要更改的是TIM2_SMCR
寄存器的 SMS[2:0]位 写入 110
,选择触发模式。
2. 基于HAL库通用定时器实践
2.0 通用定时器寄存器与相关函数
2.0.1 通用定时器寄存器-寄存器基地址
2.0.2 通用定时器寄存器-寄存器
2.1 RGB LED灯(三路PWM波)
2.1.1 RGB LED灯工作原理
LED RGB 140C05 通过PWM 信号调节红(R)、绿(G)、蓝(B)三个通道的亮度,实现颜色混合。(使用PWM2 :CNT小于CCRx,为无效电平(设置高电平为有效电平))
2.1.2 CubeMX配置通用定时器外设
2.1.3 通用定时器外设初始化流程

2.1.4 RGB_LED实践代码
2.1.5 RGB_LED实践效果
2.2 输入捕获变化的高电平
2.2.1 CubeMX配置通用定时器外设
2.2.2 通用定时器外设初始化流程
2.2.3 输入捕获实践代码
在正点原子输入捕获实验进行修改
2.2.4 输入捕获实践效果
2.3 主从定时器移相控制
2.3.1 CubeMX配置通用定时器外设(TIM3-TRGO触发TIM9)
2.3.2 通用定时器外设初始化流程
2.3.3 输入捕获实践代码
2.3.4 输入捕获实践效果
通过调整TIM3-CH1的ARR即可实现任意移相。
3. 本文的工程文件下载链接
工程Github下载链接:https://github.com/chipdynkid/MCU-DL-STM32
(国内)工程Gitcode下载链接https://gitcode.com/chipdynkid/MCU-DL-STM32