HAL_TIM
文章目录
一、TIM 简介
1、什么是 TIM
TIM(Timer,定时器)是 STM32 最核心、功能最强、用途最广的片内外设,是整个嵌入式控制的基石。
定时器本质是一个递减/递增计数器,可以按照精准时钟频率计数,实现定时、延时、输出波形、捕获信号等功能。
2、F103 定时器分类
高级定时器 TIM1、TIM8:带互补PWM、死区、刹车、重复计数器,用于电机大功率驱动。
通用定时器 TIM2、TIM3、TIM4、TIM5:定时中断、PWM输出、输入捕获、编码器模式。
基本定时器 TIM6、TIM7:仅纯定时中断,无IO功能,用于基础计时、软件定时器。
3、定时器核心功能
精准定时中断(周期性任务)。
PWM波形输出(LED呼吸灯、舵机、电机调速)。
输入捕获(测频率、测脉宽、超声波、红外解码)。
编码器测速(电机闭环控制)。
触发ADC、DMA同步采样。
4、总线时钟分布
TIM1、TIM8 高级定时器:挂在 APB2(72MHz)。
TIM2~TIM7 通用/基本定时器:挂在 APB1(36MHz)。
二、TIM寄存器简介
1、时基单元相关寄存器
1)预分频器(TIMx_PSC)
预分频器 → 决定计数快慢。
2)自动重装载寄存器(TIMx_ARR)
自动重装载值 → 决定定时周期。
3)计数器(TIMx_CNT) (Counter)
计数器 → 当前计数值。
4)重复计数寄存器(TIMx_RCR)
重复计数器 → 高级 TIM 独有,溢出 N 次才触发中断。
2、控制器相关寄存器
1)从模式控制寄存器(TIMx_SMCR)(Slave Mode Control Register)
配置定时器时钟源、从模式、触发信号、外部 ETR 参数,实现定时器同步、外部时钟、编码器、门控 / 复位 / 触发等功能。
从模式选择(Reset、Gated、Trigger、Encoder)。
触发源选择(ITRx、TIxFP、ETRF)。
2)控制寄存器 1(TIMx_CR1)
定时器配置相关,如:分频因子、计数方向、使能计数器、是否允许产生事件等。
作用:定时器总启停、计数方向、计数模式、时钟分频、更新事件、影子寄存器核心控制,所有定时器必备。
3)控制寄存器 2(TIMx_CR2)
定时器配置相关,如:主模式选择、捕获/比较器相关设置。
作用:主模式配置、输出极性、触发、DMA、对齐等扩展控制。
3、捕获/比较寄存器
1)捕获比较模式寄存器1(TIMx_CCMR1)
TIMx_CCMR1 是 通道 1、通道 2 的 模式配置寄存器,配置通道是输入捕获还是输出比较。
作用:输入捕获 / 输出比较 / PWM 工作模式。
16 位寄存器,分 高 8 位(CH2) + 低 8 位(CH1)。
2)捕获比较模式寄存器2(TIMx_CCMR2)
TIMx_CCMR2 是通道 3 、通道 4 的模式配置寄存器,配置通道是输入捕获还是输出比较。
作用:输入捕获 / 输出比较 / PWM 工作模式。
16 位寄存器,分 高 8 位(CH4) + 低 8 位(CH3)。
3)捕获/比较寄存器(TIMx_CCR1/2/3/4)
捕获/比较通道的值。
输出模式:存比较值(决定 PWM 占空比)。
输入模式:存捕获值(测频率 / 脉宽)。
4)捕获/比较使能寄存器(TIMx_CCER)
CCER = Capture/Compare Enable Register
功能:
使能 / 关闭 通道输出 / 输入。
设置通道极性(高有效 / 低有效)。
4、刹车/死区、状态/中断/事件、DMA相关寄存器
1)刹车/和死区寄存器(TIMx_BDTR)
死区发生器(DTG) —— 防上下管直通短路。
断路(Break)功能 —— 硬件急停保护。
主输出控制(MOE) —— PWM 总开关。
2)状态寄存器(TIMx_SR)
通道状态信息,各类中断标记,如刹车中断,捕获/比较中断,更新中断等。
SR = Status Register(状态寄存器)
作用:硬件自动置 1:发生了某个事件。
定时器溢出/比较匹配/输入捕获/断路故障。
3)事件产生寄存器(TIMx_EGR)
TIMx_EGR = 软件强制触发事件寄存器。
产生事件的配置寄存器,包含刹车/触发/捕获/比较等事件。
UG (bit0) = 强制更新 → 让 PSC、ARR、CCR 立即生效。
4)DMA控制寄存器(TIMx_DCR)
DMA Control Register —— DMA 连续传输控制寄存器。
作用:专门给 TIM + DMA 配合使用,实现不用 CPU 干预、自动连续搬运 TIM 内部寄存器数据。
配置 DMA 连续读写 TIM 寄存器时的:DBA起始地址 + DBL连续传输长度。
5)DMA/中断使能寄存器(TIMx_DIER)
DMA/Interrupt Enable Register —— 中断 & DMA 使能寄存器。
核心作用:控制定时器的哪些事件可以触发【中断】或【DMA 请求】。
6)DMA连续传送寄存器(TIMx_DMAR)
DMA Address Register —— DMA 数据寄存器
TIM 和 DMA 之间传递数据的 “中间中转站 / 窗口”.
硬件自动操作,无需手动读写。
三、TIM 模块组成
0、TIM定时器框图

1、时钟选择

1)内部时钟(CK_INT) :
来源:APB1 / APB2 总线时钟,由系统时钟分频而来。
用于:定时、PWM、输入捕获、互补 PWM。
2)外部时钟模式1(TIMx_ETR):
来源:定时器从外部引脚 ETR 输入脉冲来计数,外部信号输入经过滤波器、边沿选择、分频器成为ETR 时钟 。
用于:
外部高速脉冲计数。
外部频率采集。
外部设备同步。
3)内部触发输入(ITRx):
来源:使用一个定时器作为另一个定时器的预分频器。
用途:
多级定时。
超长定时。
多定时器同步。
级联分频。
4)外部引脚 TIx (CH1~CH4)
来源:使用 CH1/CH2/CH3/CH4 引脚 输入脉冲作为定时器时钟。
用于:
外部脉冲计数。
简单编码器。
外部信号同步。
2、从模式控制器

触发控制器:用来针对片内外设输出触发信号。比如为其它定时器提供时钟和触发DAC/ADC转换。
从模式控制器:可以控制计数器复位、启动、递增/递减、计数。
编码器接口:专门针对编码器计数而设计。
3、时基单元

1)计数器寄存器(TIMx_CNT) :
16 位(大部分 TIM)/ 32 位(TIM2/TIM5)。
功能:一直在数数,每来一个时钟脉冲 +1 或 -1。
2)预分频器寄存器 (TIMx_PSC) :
把定时器输入时钟变慢。
计数频率 = 定时器时钟 / (PSC + 1)。
3)自动装载寄存器 (TIMx_ARR) :
计数器的上限值。
CNT 数到 ARR → 自动归零,并产生更新事件(UEV)。
4)重复次数寄存器 (TIMx_RCR) :
只有 TIM1 / TIM8 才有。
功能:溢出 N 次 才产生一次更新中断。
作用:减少 CPU 中断次数(电机 FOC 必备)。
5)计数模式
向上计数模式:
CNT 从 0 → ARR。
到达 ARR → 归零 → 产生更新事件。
适合:定时中断、普通 PWM。
向下计数模式:
CNT 从 ARR → 0。
到达 0 → 重装 ARR → 产生更新事件。
中央对齐模式(高级 TIM 电机专用)
CNT 0 → ARR → 0。
上下各产生一次事件。
适合:FOC 电机控制、低谐波 PWM。
6)影子寄存器
修改 ARR、PSC 时 不会立即生效,而是等到 更新事件 UEV 才生效。
这叫影子寄存器机制,保证计数稳定不抖动。
4、输入捕获

1)外部输入引脚 TIx(Channel Input)
对应:CH1 / CH2 / CH3 / CH4 引脚。
作用:输入外部脉冲信号(方波、PWM、超声波、红外等)。
位置:最前端,信号入口。
2)输入滤波器 ICxF(Input Capture Filter)
位置:引脚之后。
作用:滤除高频毛刺、噪声,防止误触发。
原理:连续采样 N 次一致才认为是有效电平。
3)边沿检测器 Polarity
位置:滤波器之后。
作用:选择哪种跳变沿触发捕获。
上升沿
下降沿
4)输入预分频器 ICxPSC(Input Capture Prescaler)
位置:边沿检测器之后。
作用:每 N 个边沿才捕获一次。
不分频(1 个边沿捕获 1 次)。
2 分频
4 分频
8 分频
用途:降低高速脉冲捕获频率,减少 CPU 压力。
5)捕获锁存器(Capture Latch)
作用:检测到有效边沿瞬间 → 立刻把当前 CNT 值复制到 CCRx。
特点:瞬间锁存,不影响定时器继续计数。
这就是输入捕获能 “抓拍时间点” 的原因。
6)捕获比较寄存器 CCRx(Capture/Compare Register)
位置:最终捕获值存放处。
作用:保存边沿跳变那一刻的 CNT 计数值。
CPU 读取 CCRx 就能知道事件发生的时间。
5、输出比较

1)比较寄存器:
定时器 CNT 不断和 CCR 比较,相等时自动让引脚做动作。
输出比较寄存器 = 控制 CNT 与 CCR 匹配时的引脚动作
CCR:比较目标值。
OCxM:决定做什么动作。
CCER:开关输出。
CCMR:选择输入 / 输出模式。
2)死区发生器:
死区时间 = 上下桥臂切换时,特意插入的一小段 “空白延时”, 防止上下桥臂直通短路的硬件保护模块。

3)输出控制:
控制定时器通道引脚什么时候输出、输出什么电平、怎么输出、输出是否使能。
引脚输出:高 / 低 / 翻转 / PWM。
输出: 开启 / 关闭。
输出极性:(高有效 / 低有效)。
互补输出 死区。
故障:刹车关断。
4)输出引脚
输出比较的输出信号最终是通过定时器的外部IO来输出的,分别为CH1/2/3/4,其中前面三个通道还有互补的输出通道CH1/2/3N。
6、断路功能

断路功能(Break):
是高级定时器 TIM专属的硬件安全机制,用于纳秒级紧急关断所有 PWM 输出,防止炸管、烧机,是电机 / 电源驱动的 “保命功能”。
触发源:
外部 BKIN 引脚(最常用):接比较器(过流)、急停开关、电源故障信号。
内部系统故障:时钟失效、奇偶校验错误(部分型号支持)。
软件强制触发:置位 BDTR 的 BKE 位,模拟故障。
断路后触发:
MOE 位硬件清零(主输出总开关关闭),所有 PWM 立即关断。
所有 CHx/CHxN 输出强制为安全电平(由 OSSI/OSSR 设定:高阻 / 固定高 / 固定低)。
置位 SR 寄存器 BIF 中断标志,可触发中断通知 CPU 故障。
互补输出保持互锁:CHx 与 CHxN 永远不同时有效,防止直通。
四、TIM 模块配置
1、时钟选择
1)时钟源选择
| 时钟源 | 适用场景 | 配置要点 |
|---|---|---|
| 内部时钟 CK_INT | 定时中断、PWM、通用计数 | HAL_TIM_Base_Init 后默认开启,需先开 RCC 时钟 |
| 外部时钟模式 1(ETR 引脚) | 外部信号计数(脉冲计数) | 配置 TIM_ClockConfigTypeDef,选择 TIM_CLOCKSOURCE_ETRMODE1 |
| 外部时钟模式 2(ETR 引脚) | 外部信号计数(更稳定) | 配置 TIM_ClockConfigTypeDef,选择 TIM_CLOCKSOURCE_ETRMODE2 |
| 内部触发 ITR(主从同步) | 多定时器联动(如 TIM2 同步 TIM3) | 在从机配置 TIM_SlaveConfigTypeDef,选择 TIM_TRIGGERSOURCE_ITRx |
2)ETR 外部触发信号配置
极性选择:上升沿 / 下降沿。
预分频:1/2/4/8 分频。
滤波:设置采样周期,抗干扰。
配置函数:HAL_TIM_ETRConfigChannel(&htim, &sETRConfig)。
2、从模式控制器模块
1)从模式选择
| 模式 | 功能 | 典型应用 |
|---|---|---|
| 复位模式(Reset) | 触发信号到来时,CNT 立刻清零并重新计数 | 硬件同步周期对齐 |
| 门控模式(Gated) | 触发信号为高时,CNT 才计数;低时暂停 | 信号宽度测量、同步启停 |
| 触发模式(Trigger) | 触发信号到来时,CNT 开始计数,之后独立运行 | 外部信号触发单次定时 |
| 编码器模式(Encoder) | 正交编码器四倍频计数 | 电机位置 / 速度测量 |
配置函数:HAL_TIM_SlaveConfigSynchronization(&htim, &sSlaveConfig)。
触发信号来源:ETR、ITR、TI1、TI2 等(在 TIM_SlaveConfigTypeDef 中设置)。
2)TRGO 主模式输出
可将定时器的更新事件、比较匹配事件输出到 TRGO,触发其他外设(ADC/DAC/ 其他 TIM)。
配置:HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig)。
3、时基单元模块
1)核心参数配置
| 参数 | 作用 | **配置示例(****72MHz **系统时钟) |
|---|---|---|
| Prescaler (PSC) | 对 CK_INT 分频,得到 CK_CNT | 71 → 72MHz/72 = 1MHz |
| CounterMode | 计数方向 | 向上 / 向下 / 中心对齐 |
| Period (ARR) | 自动重装载值,决定计数周期 | 999 → 计数 1000 个 CK_CNT 周期 |
| ClockDivision | 时钟分频(用于死区 / 采样) | 一般 DIV1 即可 |
| AutoReloadPreload | ARR 影子寄存器预加载 | 开启后修改 ARR 不会立即生效,需等更新事件 |
配置函数:HAL_TIM_Base_Init(&htim)
启动方式:
定时中断:HAL_TIM_Base_Start_IT(&htim)
无中断定时:HAL_TIM_Base_Start(&htim)
2)更新中断配置
开启 NVIC 中断:HAL_NVIC_EnableIRQ(TIMx_IRQn)。
中断优先级设置:HAL_NVIC_SetPriority(TIMx_IRQn, PreemptPriority, SubPriority)。
回调函数:HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)。
4、输入捕获模块
1)通道基础配置
| 参数 | 作用 | 配置示例 |
|---|---|---|
| ICPolarity | 捕获边沿(上升 / 下降 / 双边) | TIM_ICPOLARITY_RISING |
| ICSelection | 捕获输入选择(直接 / 间接 / TRC) | TIM_ICSELECTION_DIRECTTI |
| ICPrescaler | 捕获预分频(1/2/4/8 分频) | TIM_ICPSC_DIV1 |
| ICFilter | 输入滤波(抗干扰) | 0x0F(最大滤波) |
配置函数:HAL_TIM_IC_ConfigChannel(&htim, &sConfigIC, TIM_CHANNEL_x)。
2)启动方式
带中断捕获:HAL_TIM_IC_Start_IT(&htim, TIM_CHANNEL_x)。
无中断捕获:HAL_TIM_IC_Start(&htim, TIM_CHANNEL_x)。
3)中断回调与数据读取
捕获中断回调:HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)。
读取捕获值:__HAL_TIM_GET_COMPARE(&htim, TIM_CHANNEL_x)。
溢出补偿:需要处理 CNT 溢出(比如两次捕获值差值为负,加上 ARR+1)。
5、输出比较模块
1)输出比较基础配置
| 参数 | 作用 | 配置示例 |
|---|---|---|
| OCMode | 输出模式(冻结 / 匹配翻转 / 置位 / 清零 / PWM1/PWM2) | TIM_OCMODE_PWM1 |
| Pulse | 初始比较值(CCR) | 500(占空比 50%,ARR=999 时) |
| OCPolarity | 输出极性(高 / 低有效) | TIM_OCPOLARITY_HIGH |
| OCFastMode | 快速模式(仅 PWM 有效) | TIM_OCFAST_DISABLE |
配置函数:HAL_TIM_OC_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_x)。
2)PWM 输出专用配置
启动 PWM:HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_x)。
动态修改占空比:__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_x, NewPulse)。
3)高级定时器互补输出(TIM1/TIM8 独有)
配置互补通道:HAL_TIMEx_OCN_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_x)。
启动互补 PWM:HAL_TIMEx_PWMN_Start(&htim, TIM_CHANNEL_x)。
死区时间配置:在 TIM_BreakDeadTimeConfigTypeDef 中设置 DeadTime。
6、断路功能模块
1)刹车配置(电机驱动必备)
| 参数 | 作用 | 配置示例 |
|---|---|---|
| BreakState | 刹车功能使能 | TIM_BREAK_ENABLE |
| BreakPolarity | 刹车信号极性(低 / 高有效) | TIM_BREAKPOLARITY_LOW |
| BreakFilter | 刹车信号滤波 | 0x0F |
| AutomaticOutput | 刹车解除后自动恢复输出 | TIM_AUTOMATICOUTPUT_ENABLE |
配置函数:HAL_TIMEx_ConfigBreakDeadTime(&htim, &sBreakDeadTimeConfig)。
刹车中断回调:HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim)。
五、相关计算公式
1、基础时基单元计算公式(所有TIM通用)
1)计数器计数频率

2)单次计数时间

3)定时溢出周期(更新中断周期)

4)定时溢出频率

5)高级定时器专属(带RCR重复计数器)

2、PWM波形全套计算公式
PWM频率 = 定时器更新频率,和时基定时频率完全一致 。
1)PWM频率

2)PWM占空比

3、输入捕获计算公式
适用:测量方波周期、频率、高低电平脉宽。
1)信号周期

2)信号频率

3)脉宽时间

六、CubeMX配置TIM
1、基本设定(时基)

Clock Source:Internal Clock(内部时钟,最常用)。
Counter Mode:Up(向上计数)。
Prescaler(PSC):分频。
例:72MHz → PSC=71(72 分频)→ 计数时钟 1MHz。
Counter Period(ARR):自动重装载值。
例:ARR=999 → 1MHz/(999+1)=1kHz。
Auto-reload Preload:Enable(ARR 缓冲,避免毛刺)。
定时时间公式:
T = (PSC+1) × (ARR+1) / TIM_CLK
2、定时中断实例
1)使用配置好的时基单元。
2)NVIC 设置
打开:TIMx update interrupt。
优先级:如 Preemption=1,Sub=0。

3)代码
在 main () 里开启:
HAL_TIM_Base_Start_IT(&htim1); // 启动并开更新中断
重写中断回调:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM1)
{
// 1kHz 进来,做你的事
}
}
3、PWM 输出实例(电机 / LED 调光)
1)使用配置好的时基单元。
2)配置通道1为PWM输出
Channel 1 → PWM Generation CH1。
3)PWM参数配置:
Pulse:CCR 值,决定占空比。
例:ARR=999,Pulse=500 → 50%
CH Polarity:High(高有效)。
4)引脚自动复用
(如 PA0→TIM1_CH1,绿色标记)

5)启动代码
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
// 改占空比:
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 300);
4、输入捕获实例(测频率/脉宽)
1)使用配置好的时基单元。
2)配置通道1为捕获输入。
Channel 1 → Input Capture direct mode
3)配置捕获参数
Polarity:Rising Edge(上升沿捕获)
IC Selection:Direct
Prescaler:No division 不分频

4)配置捕获中断
开启TIMx capture/compare interrupt。

5)启动
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
6)捕获回调
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
uint32_t val=HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);
// val 就是捕获瞬间的 CNT 值
}
}
七、TIM数据结构及HALAPI
1、TIM 数据结构
1)定时器句柄:TIM_HandleTypeDef
typedef struct {
TIM_TypeDef *Instance; // 寄存器基地址(TIM1/TIM2...)
TIM_Base_InitTypeDef Init; // 时基配置(PSC/ARR/计数模式)
HAL_TIM_ActiveChannel Channel; // 当前活跃通道(CH1~CH4)
DMA_HandleTypeDef *hdma[7]; // DMA 相关
HAL_LockTypeDef Lock; // 锁状态
__IO HAL_TIM_StateTypeDef State; // 状态:就绪/忙/忙
} TIM_HandleTypeDef;
2)时基配置:TIM_Base_InitTypeDef
typedef struct {
uint32_t Prescaler; // PSC 预分频器
uint32_t CounterMode; // 计数模式:向上/向下/中心对齐
uint32_t Period; // ARR 自动重装载值
uint32_t ClockDivision; // 死区时钟分频
uint32_t AutoReloadPreload; // ARR 预装载使能
uint32_t RepetitionCounter; // 重复计数器(仅高级TIM1/8)
} TIM_Base_InitTypeDef;
3)PWM / 输出比较:TIM_OC_InitTypeDef
typedef struct {
uint32_t OCMode; // PWM1 / PWM2 / 翻转 / 强制高
uint32_t Pulse; // CCR 值(占空比)
uint32_t OCPolarity; // 输出极性:高有效/低有效
} TIM_OC_InitTypeDef;
4) 输入捕获:TIM_IC_InitTypeDef
typedef struct {
uint32_t ICPolarity; // 上升沿/下降沿/双边沿
uint32_t ICSelection; // 直接/间接通道
uint32_t ICPrescaler; // 捕获分频
uint32_t ICFilter; // 滤波
} TIM_IC_InitTypeDef;
5)刹车与死区(高级定时器):TIM_BreakDeadTimeConfigTypeDef
typedef struct {
uint32_t DeadTime; // 死区时间
uint32_t BreakState; // 刹车使能
} TIM_BreakDeadTimeConfigTypeDef;
2、TIM 状态
- HAL_TIM_STATE_RESET:未初始化。
- HAL_TIM_STATE_READY:就绪空闲。
- HAL_TIM_STATE_BUSY:正在运行。
- HAL_TIM_STATE_ERROR:异常错误。
3、 API
1)时基通用 API(所有 TIM:基本 / 通用 / 高级)
初始化 / 反初始化
// 根据CubeMX生成的htim结构体初始化定时器时基
HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);
// 释放定时器资源
HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim);
// 配置底层硬件(CubeMX自动调用,用户极少使用)
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim);
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim);
启动 / 停止(4 种模式)
// 1. 阻塞轮询模式:单纯计数,无中断无DMA
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim);
// 2. 中断模式:溢出更新中断,最常用定时方案
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim);
// 3. DMA模式:溢出事件触发DMA搬运数据
HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim);
// 4. 查询溢出标志(轮询用法,不推荐)
HAL_StatusTypeDef HAL_TIM_Base_PeriodElapsed_Wait(TIM_HandleTypeDef *htim, uint32_t Timeout);
2)PWM 输出 API(通用 TIM + 高级 TIM)
初始化
HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim);
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim);
void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim);
普通 PWM 启停(CHx 主通道)
// 轮询输出PWM
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
// PWM输出+比较中断(CCR匹配中断)
HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
// PWM配合DMA
HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);
高级 TIM 独有:互补通道 CHxN 启停
// 开启互补通道输出
HAL_StatusTypeDef HAL_TIM_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
// 互补通道中断模式
HAL_StatusTypeDef HAL_TIM_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
// 互补通道DMA模式
HAL_StatusTypeDef HAL_TIM_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);
3)输入捕获 API(测脉冲、频率、占空比)
// 初始化捕获模式
HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim);
// 轮询捕获
HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
// 中断捕获(主流,捕获边沿触发中断)
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
// DMA捕获
HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);
// 读取捕获寄存器CCR值
uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel);
4)编码器模式 API(电机正交编码测速)
HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef *sConfig);
HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim);
void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim);
void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim);
// 启动编码器计数
HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channels);
HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channels);
// 编码器中断
HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channels);
HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channels);
// DMA编码器
HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channels, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channels);
// 读取当前CNT计数值
__IO uint32_t HAL_TIM_ReadCounter(TIM_HandleTypeDef *htim);
5)全局通用状态 / 查询函数
// 获取定时器当前运行状态
HAL_TIM_StateTypeDef HAL_TIM_GetState(TIM_HandleTypeDef *htim);
// 获取指定通道状态
HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(TIM_HandleTypeDef *htim, uint32_t Channel);
// 等待指定标志位置位(轮询)
HAL_StatusTypeDef HAL_TIM_WaitForFlag(TIM_HandleTypeDef *htim, uint32_t Flag, uint32_t Timeout);
6)全部 TIM 中断回调函数(重写实现业务逻辑)
- 更新溢出回调(定时中断、PWM 周期完成)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
- 捕获 / 比较匹配回调(PWM 匹配、输入捕获)
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);
3. 高级 TIM 专属:刹车故障回调
void HAL_TIM_BreakCallback(TIM_HandleTypeDef *htim);
4. DMA 传输完成回调
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_CaptureCpltCallback(TIM_HandleTypeDef *htim);
7)底层操作宏(高频使用,修改寄存器无需 API)
时基相关
// 设置预分频PSC
__HAL_TIM_SET_PRESCALER(htim, psc);
// 设置自动重装载ARR
__HAL_TIM_SET_AUTORELOAD(htim, arr);
// 读取CNT当前计数值
__HAL_TIM_GET_COUNTER(htim);
// 清零计数器CNT
__HAL_TIM_RESET_COUNTER(htim);
PWM 占空比设置
// 设置通道CCR值(修改占空比)
__HAL_TIM_SET_COMPARE(htim, Channel, CCR_Value);
// 读取CCR值
__HAL_TIM_GET_COMPARE(htim, Channel);
标志位清除 / 读取
// 清除中断标志
__HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_UPDATE);
// 判断标志是否置位
__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE);
// 使能/关闭定时器中断
__HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE);
__HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE);
高级 TIM 专用宏(TIM1/TIM8)
// 主输出使能,控制所有PWM通道输出开关
__HAL_TIM_MOE_ENABLE(htim);
__HAL_TIM_MOE_DISABLE(htim);
// 清除刹车故障标志
__HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_BREAK);
定时器开关宏
__HAL_TIM_ENABLE(htim);
__HAL_TIM_DISABLE(htim);
八、TIM 总结
1、核心知识点
定时器定时时间由 PSC+ARR 共同决定。
通用定时器可做定时、PWM、捕获、编码器。
高级定时器带互补PWM,用于电机驱动。
PWM频率由ARR决定,占空比由CCR决定。
2、总结
TIM定时器是STM32多功能时钟外设,通过PSC预分频和ARR自动重装载实现精准定时,支持定时中断、PWM输出、输入捕获、编码器模式,是裸机任务调度、电机控制、信号测量的核心外设。
更多推荐

所有评论(0)