关于通用定时器的概念
定时器记录内部时钟的频率那么可以定时
那么定时器记录外部的频率那么就变成计数器
点击展开完整图片

通过ETR
可以通过ETR来进行和外部通信,但是一般一个定时器也就只有一个ETR引脚一般是定时器CH1
通过TIX
TIX配置可能稍微复杂一点,但是TIX有CH1-CH4
配置ETR
我们打开STM32cubemx
我们直接选择Clock Source -> ETR

这样子下方就会出现定时器配置

一、Counter Settings(计数器设置)
这部分是定时器最核心的时基配置,决定了它的计数频率和溢出周期。
| 配置项 | 作用说明 |
|---|---|
| Prescaler (PSC) | 预分频器,对定时器时钟进行分频。 分频后计数频率 = 定时器时钟 / (PSC + 1)。 PSC=0 表示不分频,计数频率等于定时器时钟本身。 |
| Counter Mode | 计数模式:向上计数。 从 0 一直数到自动重装载值(ARR),然后溢出归零,是最常用的模式。 |
| Counter Period (ARR) | 自动重装载值,计数器的最大值。 向上计数时,数到 ARR 就会触发更新事件并归零。 65535 是 16 位定时器的最大值(2¹⁶-1)。 |
| Internal Clock Division (CKD) | 时钟分频因子,用于给定时器的输入时钟再分频(影响死区、采样时钟)。 No Division 表示不分频,和系统时钟同频。 |
| auto-reload preload | 自动重装载预装载使能。 Disable:修改 ARR 值时立即生效,不需要等下一次更新事件。 Enable:修改 ARR 值时,会先存在影子寄存器里,下一次更新事件才生效。 |
二、Trigger Output (TRGO) Parameters(主模式触发输出)
这部分是定时器的主模式配置,用来产生内部触发信号(TRGO)给其他外设(比如 ADC、其他定时器)。
| 配置项 | 作用说明 |
|---|---|
| Master/Slave Mode (MSM bit) | 主从模式控制。 Disable:主定时器的 TRGO 信号不会被同步延迟,直接输出。 Enable:开启同步,让触发信号经过延迟,保证主从定时器的同步精度。 |
| Trigger Event Selection | TRGO 触发事件源选择。 Reset //软件复位事件 Enable //计数器使能 Update Event //更新事件 Compare Pulse //比较脉冲(OC1) Output Compare //输出比较(OC1REF~OC4REF) |
三、Clock(外部时钟配置)
这部分是外部时钟模式的配置,你当前的配置说明定时器用的是内部时钟,所以这几个参数不生效。
| 配置项 | 作用说明 | 可选项 |
|---|---|---|
| Clock Filter | 外部时钟信号的数字滤波。值范围 0~15,值越大滤波越强,抗干扰能力越好,但也会引入延迟。0 表示不滤波。 | 0(无滤波) 1~15(数字滤波强度递增) |
| Clock Polarity | 外部时钟信号的有效极性。non inverted 表示上升沿有效,还有 inverted(下降沿有效)等选项。 | non inverted(上升沿有效) inverted(下降沿有效) |
| Clock Prescaler | 外部时钟的预分频(仅 ETR 模式有效)。你当前配置下,定时器使用内部时钟,所以这个分频器不启用。 | No division(1分频) Divide by 2(2分频) Divide by 4(4分频) Divide by 8(8分频) |
然后就可以直接导出工程了
ETR的工程
我们查看具体的工程
定时器初始化不是本文的重点可以忽略
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:禁用主从同步(普通定时常用) |
读取CNT值
我们通过读取CNT就知道具体计数了多少了
1 | uint32_t __HAL_TIM_GET_COUNTER(&htim-x) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| &htim-x | 选择的定时器 | 这里填上面初始化的结构体 | |
| 返回值 | uint32_t | 读取CNT值 | — |
设置CNT值
1 | __HAL_TIM_SET_COUNTER(&htim-x, __COUNTER__) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| &htim-x | 选择的定时器 | 这里填上面初始化的结构体 | |
| COUNTER | uint16_t | 填要设置的CNT的值 | 0-65535 |
配置TIX

我们直接选择TIX引脚
| 模式名称 | 中文说明 |
|---|---|
| Disable | 通道禁用,不工作 |
| Input_Capture_direct_mode | 直接输入捕获模式,信号直接从通道引脚输入捕获 |
| Input_Capture_indirect_mode | 间接输入捕获模式,信号从另一通道输入(如TI2映射到CH1) |
| Input_Capture_triggered_by_TRC | 由TRC触发的输入捕获模式,从模式控制器触发捕获 |
| Output_Compare_No_Output | 输出比较模式但不输出到引脚,仅内部触发中断/DMA |
| Output_Compare_CH1 | 输出比较模式并输出到CH1引脚 |
| PWM_Generation_No_Output | PWM生成模式但不输出到引脚,仅内部触发 |
| PWM_Generation_CH1 | PWM生成模式并输出到CH1引脚 |
我们选择输入捕获模式
然后我们进行配置TIX

前两部分的内容一样的
这两部分配置和上边一样的
一、定时器初始化
这部分是定时器最核心的时基配置,决定了它的计数频率和溢出周期。
| 配置项 | 作用说明 |
|---|---|
| Prescaler (PSC) | 预分频器,对定时器时钟进行分频。 分频后计数频率 = 定时器时钟 / (PSC + 1)。 PSC=0 表示不分频,计数频率等于定时器时钟本身。 |
| Counter Mode | 计数模式:向上计数。 从 0 一直数到自动重装载值(ARR),然后溢出归零,是最常用的模式。 |
| Counter Period (ARR) | 自动重装载值,计数器的最大值。 向上计数时,数到 ARR 就会触发更新事件并归零。 65535 是 16 位定时器的最大值(2¹⁶-1)。 |
| Internal Clock Division (CKD) | 时钟分频因子,用于给定时器的输入时钟再分频(影响死区、采样时钟)。 No Division 表示不分频,和系统时钟同频。 |
| auto-reload preload | 自动重装载预装载使能。 Disable:修改 ARR 值时立即生效,不需要等下一次更新事件。 Enable:修改 ARR 值时,会先存在影子寄存器里,下一次更新事件才生效。 |
二、TRGO主模式触发输出
这部分是定时器的主模式配置,用来产生内部触发信号(TRGO)给其他外设(比如 ADC、其他定时器)。
| 配置项 | 作用说明 |
|---|---|
| Master/Slave Mode (MSM bit) | 主从模式控制。 Disable:主定时器的 TRGO 信号不会被同步延迟,直接输出。 Enable:开启同步,让触发信号经过延迟,保证主从定时器的同步精度。 |
| Trigger Event Selection | TRGO 触发事件源选择。 Reset //软件复位事件 Enable //计数器使能 Update Event //更新事件 Compare Pulse //比较脉冲(OC1) Output Compare //输出比较(OC1REF~OC4REF) |
三、设置TIX
| 配置项 | 可选项 | 作用与解释 |
|---|---|---|
| Polarity Selection(极性选择) | Rising Edge(上升沿) Falling Edge(下降沿) Both Edge(双边沿) |
捕获触发边沿: ・Rising:上升沿触发 ・Falling:下降沿触发 ・Both:上升/下降沿都触发 |
| IC Selection(捕获通道选择) | Direct(直接) Indirect(间接) TRC(内部触发) |
捕获信号来源: ・Direct:信号来自本通道引脚(TI1→IC1) ・Indirect:信号来自另一通道(TI2→IC1) ・TRC:来自内部触发信号(TRC) |
| Prescaler Division Ratio(捕获预分频) | No division(1分频) Divide by 2(2分频) Divide by 4(4分频) Divide by 8(8分频) |
每N个有效边沿触发一次捕获: ・1:每个边沿都捕获 ・2/4/8:降低高频信号的捕获频率 |
| Input Filter(输入滤波) | 0~15(4位数值) | 数字滤波强度: ・0:无滤波 ・1~15:数值越大,滤波越强,可滤除高频毛刺 |
其他模式请看标准库里面介绍更详细
TIX工程配置

其他部分和上面是一样的
所以不多介绍了
还是重点看CH他自己的函数
CH1配置
1 | HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_IC_InitTypeDef *sConfig, uint32_t Channel) |
配置TIX
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| TIM_HandleTypeDef *htim | 结构体 | 选择的定时器 | —- |
| const TIM_IC_InitTypeDef *sConfig | 结构体 | 初始化TIX | — |
| uint32_t Channel | uint32_t | 配置的CH通道 | TIM_CHANNEL_1 TIM_CHANNEL_2 TIM_CHANNEL_3 TIM_CHANNEL_4 TIM_CHANNEL_ALL |
TIM_HandleTypeDef htim2; //*htim结构体
TIM_IC_InitTypeDef sConfigIC //*sConfig的结构体
| 配置项 | 可选项 | 作用与解释 |
|---|---|---|
| sConfigIC.Polarity Selection(极性选择) | Rising Edge(上升沿) Falling Edge(下降沿) Both Edge(双边沿) |
捕获触发边沿: ・Rising:上升沿触发 ・Falling:下降沿触发 ・Both:上升/下降沿都触发 |
| sConfigIC.IC Selection(捕获通道选择) | Direct(直接) Indirect(间接) TRC(内部触发) |
捕获信号来源: ・Direct:信号来自本通道引脚(TI1→IC1) ・Indirect:信号来自另一通道(TI2→IC1) ・TRC:来自内部触发信号(TRC) |
| sConfigIC.Prescaler Division Ratio(捕获预分频) | No division(1分频) Divide by 2(2分频) Divide by 4(4分频) Divide by 8(8分频) |
每N个有效边沿触发一次捕获: ・1:每个边沿都捕获 ・2/4/8:降低高频信号的捕获频率 |
| sConfigIC.Input Filter(输入滤波) | 0~15(4位数值) | 数字滤波强度: ・0:无滤波 ・1~15:数值越大,滤波越强,可滤除高频毛刺 |
读取寄存器函数
1 | uint32_t __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| HANDLE | 结构体 | 选择定时器 | &htim-x (-x为定时器) |
| CHANNEL | — | 选择通道 | TIM_CHANNEL_-x(-x填1-4 选择通道1到4) |
| 返回值 | uint32_t | 读取CCR | — |
设置CCR值
1 | __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| HANDLE | 结构体 | 选择定时器 | &htim-x (-x为定时器) |
| CHANNEL | — | 选择通道 | TIM_CHANNEL_-x(-x填1-4 选择通道1到4) |
| COMPARE | uint32_t | 要设置的CCR | 0-65535 |
我们可以通过CCR来读取他触发了几次