配置
STM32定时器这里不多赘述,具体请看基本库,那边有很详细介绍
STM32 定时器分类一览表
| 类型 | 编号 | 总线 | 功能 |
|---|---|---|---|
| 高级定时器 | TIM1、TIM8 | APB2 | 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能 |
| 通用定时器 | TIM2、TIM3、TIM4、TIM5 | APB1 | 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能 |
| 基本定时器 | TIM6、TIM7 | APB1 | 拥有定时中断、主模式触发DAC的功能 |
我们先点击左边Timers

这边就是定时器
然后右边是选择模式
| 英文原文 | 中文翻译 | 功能说明 |
|---|---|---|
| Slave Mode | 从模式 | 配置定时器作为从设备时的工作模式,可被外部信号控制计数、复位或启动 |
| Trigger Source | 触发源 | 选择定时器的外部触发信号来源(如通道输入、ETR 引脚或其他定时器) |
| Clock Source | 时钟源 | 选择定时器的计数时钟来源(内部时钟、外部引脚或其他定时器) |
| Channel1 | 通道 1 | 定时器通道 1,可配置为输入捕获、输出比较或 PWM 模式 |
| Channel2 | 通道 2 | 定时器通道 2,功能与通道 1 相同 |
| Channel3 | 通道 3 | 定时器通道 3,功能与通道 1 相同 |
| Channel4 | 通道 4 | 定时器通道 4,功能与通道 1 相同 |
| Combined Channels | 组合通道 | 用于配置定时器的互补输出、死区控制或编码器模式等组合功能 |
我们先以基本定时器模式
我们只需要配置定时器时钟
选项1 :Internal Clock 内部时钟
选项2 : ETR2 外部触发输入(ETR)(仅适用TIM2,3,4)
我们选择内部时钟

然后这边多了一个表,我们来配置定时器
基本的配置
| 配置项 | 中文说明 | 可选值 / 含义 |
|---|---|---|
| Prescaler (PSC) | 预分频器 | 0~65535,定时器时钟分频系数 |
| Counter Mode | 计数模式 | Up:向上计数 Down:向下计数 Center-aligned mode1— mode3:中心对齐计数 模式1到3 |
| Counter Period (ARR) | 自动重装载值/计数周期 | 0~65535,计数器溢出上限值 |
| Internal Clock Division (CKD) | 内部时钟分频 | No Division:不分频 Divided by 2:2分频 Divided by 4:4分频 |
| Auto-reload preload | 自动重装载预装载 | Enable:使能(缓冲生效) Disable:禁止(立即生效) |
从模式配置
| 配置项 | 中文说明 | 可选值 / 含义 |
|---|---|---|
| Master/Slave Mode (MSM bit) | 主从模式同步 | Enable:使能同步 Disable:禁止同步 |
| Trigger Event Selection | 触发事件选择(TRGO) | Reset:复位事件 Enable:使能事件 Update:更新事件 Compare Pulse - OCx:通道比较脉冲 |

然后开启NVIC中断
然后我们就可以在NVIC那边找到中断线了
在这里可以设置优先级
代码函数
在main的函数下方我们可以找到和定时器有关的函数

初始化定时器
1 | HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| TIM_HandleTypeDef *htim | 结构体 | 配置初始化 | — |
TIM_HandleTypeDef htim2;定义结构体
| 名称 | 参数 | 作用 |
|---|---|---|
| htim2.Instance | TIM1~TIM8 | 选择要启动的定时器 |
| htim2.Init.ClockDivision | #define TIM_CLOCKDIVISION_DIV1// 不分频 #define TIM_CLOCKDIVISION_DIV2// 2分频 #define TIM_CLOCKDIVISION_DIV4// 4分频 |
选择分不分频 |
| htim2.Init.CounterMode | TIM_COUNTERMODE_UP // 向上计数模式 TIM_COUNTERMODE_DOWN // 向下计数模式 TIM_COUNTERMODE_CENTERALIGNED1 // 中心对齐模式1(高级PWM专用) TIM_COUNTERMODE_CENTERALIGNED2 // 中心对齐模式2(高级PWM专用) TIM_COUNTERMODE_CENTERALIGNED3 // 中心对齐模式3(高级PWM专用) |
向上计数/向下计数 |
| htim2.Init.Period | 0-65535 | ARR(上方有解释) |
| htim2.Init.Prescaler | 0-65535 | PSC(上方有解释) |
| htim2.Init.AutoReloadPreload | TIM_AUTORELOAD_PRELOAD_DISABLE //关闭定时器自动重装载寄存器 TIM_AUTORELOAD_PRELOAD_ENABLE //启用定时器自动重装载寄存器 |
— |
选择定时器时钟
1 | HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, const TIM_ClockConfigTypeDef *sClockSourceConfig) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| TIM_HandleTypeDef *htim | 结构体 | 配置初始化 | — |
| const TIM_ClockConfigTypeDef *sClockSourceConfig | 结构体 | 选择定时器时钟 | — |
TIM_HandleTypeDef htim2;定义结构体(这里不介绍和上方一样)
TIM_ClockConfigTypeDef sClockSourceConfig定义结构体
| 字段 | 作用 | 可选值说明 |
|---|---|---|
| sClockSourceConfig.ClockSource | 时钟源选择,决定定时器用什么信号作为计数时钟 | TIM_CLOCKSOURCE_INTERNAL // 内部时钟源,使用芯片内部总线时钟(默认模式) TIM_CLOCKSOURCE_ETRMODE1 // 外部时钟模式1,使用ETR引脚信号作为时钟源 TIM_CLOCKSOURCE_ETRMODE2 // 外部时钟模式2,使用ETR引脚信号作为时钟源(可带预分频) TIM_CLOCKSOURCE_TI1ED // 使用TI1引脚的双边沿信号作为时钟源 TIM_CLOCKSOURCE_TI1-2 //使用TI1到TI2引脚信号作为时钟源 TIM_CLOCKSOURCE_ITR0-3 // 使用内部触发输入ITR0到ITR3(其他定时器信号)作为时钟源 |
| sClockSourceConfig.ClockPolarity | 外部时钟信号的有效极性 | TIM_CLOCKPOLARITY_INVERTED//外部触发信号(ETR)极性反转,低电平/下降沿有效 TIM_CLOCKPOLARITY_NONINVERTED // 外部触发信号(ETR)极性不反转,高电平/上升沿有效 TIM_CLOCKPOLARITY_RISING(上升沿) TIM_CLOCKPOLARITY_FALLING(下降沿) TIM_CLOCKPOLARITY_BOTHEDGE(双边沿) |
| sClockSourceConfig.ClockPrescaler | 外部时钟的预分频(仅 ETR 模式有效) | TIM_CLOCKPRESCALER_DIV1/DIV2/DIV4/DIV8 |
| sClockSourceConfig.ClockFilter | 外部信号的滤波设置 | 0x0 ~ 0xF,值越大滤波越强,抗干扰越好,但也会引入延迟 |
主从模式选择
1 | HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) |
TIM_HandleTypeDef htim2;定义结构体(这里不介绍和上方一样)
TIM_MasterConfigTypeDef sMasterConfig定义结构体
主从模式不是本文的重点可以忽略
| 字段 | 作用 | 可选值说明 |
|---|---|---|
| sMasterConfig.MasterOutputTrigger | 主模式触发输出(TRGO)选择 | 可配置为 TIM_TRGO_RESET TIM_TRGO_ENABLE TIM_TRGO_UPDATE TIM_TRGO_OC1 TIM_TRGO_OC1REF TIM_TRGO_OC2REF TIM_TRGO_OC3REF TIM_TRGO_OC4REF(具体取值由 @ref TIM_Master_Mode_Selection 定义) |
| sMasterConfig.MasterSlaveMode | 主/从模式选择 | TIM_MASTERSLAVEMODE_ENABLE:启用主从同步,触发输入事件会延迟,以保证与从定时器通过TRGO实现精准同步TIM_MASTERSLAVEMODE_DISABLE:禁用主从同步(普通定时常用) |
定时中断
中断初始化不是本文的重点可以忽略
在HAL_TIM_Base_Init这个函数里面包含有中断初始化函数
1 | void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) |

这里不多解释具体看关于中断那片喵
我们主要看stm32xx_it.c
里面的中断服务函数
然后我在中断函数的下方写上代码
1 | void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
我们只需要修改TIM-x里面的-x。-x为你要触发进来的定时器
原理看上一篇有关中断