文章目录

一、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 中断回调函数(重写实现业务逻辑)

  1. 更新溢出回调(定时中断、PWM 周期完成)
			void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
  1. 捕获 / 比较匹配回调(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输出、输入捕获、编码器模式,是裸机任务调度、电机控制、信号测量的核心外设。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐