STM32从模式的概念
从模式其实听说很复杂,其实吧也不咋简单
从模式主要可以分成两种
内部模式和外部模式
外部模式就是当定时器记满之后,触发内部定时器进行计数或者其他操作
内部模式就是当内部别的定时器记满之后,触发其他定时器进行计数或其他操作
外部模式
创建cubemx

我们主要用这两个设置来设置从模式
我们先看从模式设置

| 模式 | 作用与解释 | 典型用途 |
|---|---|---|
| Disable | 禁用从模式,定时器使用内部时钟自主运行,不受外部信号控制 | 普通定时、PWM 输出 |
| External Clock Mode 1 | 外部时钟模式 1,定时器的计数脉冲由外部触发信号提供,每来一个有效边沿,计数器 + 1 | 外部脉冲计数、编码器输入 |
| Reset Mode | 复位模式,外部触发信号的有效边沿到来时,计数器 CNT 立即清零并重新开始计数 | 周期 / 频率测量、脉冲宽度测量 |
| Gated Mode | 门控模式,外部触发信号为高电平时,定时器计数;低电平时停止计数 | 高电平持续时间测量 |
| Trigger Mode | 触发模式,外部触发信号的有效边沿到来时,定时器才开始计数 | 信号同步、单次触发定时 |
我们一般用Trigger Mode就可以了
这是关联的触发源

红色是内部模式
| 选项 | 信号来源 | 作用与说明 | 典型用途 |
|---|---|---|---|
| ITR0 | 内部触发通道 0 | 来自其他定时器的 TRGO 信号(具体对应哪个定时器,取决于芯片型号) | 定时器级联、主从同步 |
| ITR1 | 内部触发通道 1 | 来自其他定时器的 TRGO 信号(如 TIM2) | 定时器级联、主从同步 |
| ITR2 | 内部触发通道 2 | 来自其他定时器的 TRGO 信号(如 TIM3) | 定时器级联、主从同步 |
| ITR3 | 内部触发通道 3 | 来自其他定时器的 TRGO 信号(如 TIM4) | 定时器级联、主从同步 |
绿色是外部触发模式
| 选项 | 信号来源 | 作用与说明 | 典型用途 |
|---|---|---|---|
| ETR1 | 外部触发引脚 | 来自定时器专用的ETR 外部输入引脚,可带滤波和预分频 | 外部时钟计数、高频脉冲触发 |
| TI1_ED | 通道 1 双边沿 | 来自定时器通道 1 的双边沿信号(上升 / 下降沿都触发) | 编码器模式、边沿计数 |
| TI1FP1 | 通道 1 滤波后信号 | 来自定时器通道 1,经过输入滤波后的信号 | 输入捕获、噪声过滤后的边沿触发 |
| TI2FP2 | 通道 2 滤波后信号 | 来自定时器通道 2,经过输入滤波后的信号 | 输入捕获、噪声过滤后的边沿触发 |
我们先讲ETR

| 配置项 | 可选项 | 作用说明 |
|---|---|---|
| Trigger Polarity | non inverted(上升沿有效) inverted(下降沿有效) |
外部时钟信号的有效极性。non inverted 表示上升沿有效,inverted 表示下降沿有效。 |
| Trigger Prescaler | No division(1分频) Divide by 2(2分频) Divide by 4(4分频) Divide by 8(8分频) |
外部时钟的预分频(仅 ETR 模式有效)。当前配置使用内部时钟时,该分频器不启用。 |
| Trigger Filter (4 bits value) | 0(无滤波) 1~15(数字滤波强度递增) |
外部时钟信号的数字滤波。值范围 0~15,值越大滤波越强,抗干扰能力越好,但也会引入延迟。0 表示不滤波。 |
下面是关于TIX触发

| 配置项 | 可选项 | 作用与解释 |
|---|---|---|
| Trigger Polarity(极性选择) | Rising Edge(上升沿) Falling Edge(下降沿) Both Edge(双边沿) |
捕获触发边沿: ・Rising:上升沿触发 ・Falling:下降沿触发 ・Both:上升/下降沿都触发 |
| Trigger Filter (4 bits value)(输入滤波) | 0~15(4位数值) | 数字滤波强度: ・0:无滤波 ・1~15:数值越大,滤波越强,可滤除高频毛刺 |
外部触发工程代码
ETR的代码
关于主从模式的配置代码还是在main.c里面
MX_TIM2_Init这个函数里面

基本上来说配置全靠这一个函数,你不用管其他的代码
1 | HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig) |
| 配置项 | 可选项 | 作用与解释 |
|---|---|---|
| TIM_HandleTypeDef *htim | &htim-x (-x填数字1-8取决于定时器) | 结构体配置htim |
| const TIM_SlaveConfigTypeDef *sSlaveConfig | 配置从模式,看下方 | 结构体 |
TIM_SlaveConfigTypeDef sSlaveConfig
| 配置项 | 可选项 | 作用与解释 |
|---|---|---|
| sSlaveConfig.SlaveMode | TIM_SLAVEMODE_DISABLE TIM_SLAVEMODE_RESET TIM_SLAVEMODE_GATED TIM_SLAVEMODE_TRIGGER TIM_SLAVEMODE_EXTERNAL1 |
从模式类型: - 关闭:自由运行 - 复位:触发沿到来时计数器清零 - 门控:高电平计数,低电平停止 - 触发:触发沿到来时启动计数 - 外部时钟1:触发沿作为计数时钟 |
| sSlaveConfig.InputTrigger | TIM_TS_ITR0 TIM_TS_ITR1 TIM_TS_ITR2 TIM_TS_ITR3 TIM_TS_TI1F_ED TIM_TS_TI1FP1 TIM_TS_TI2FP2 TIM_TS_ETRF |
触发源选择: - ITR0~ITR3:来自其他定时器的内部触发信号 - TI1F_ED:通道1双边沿触发 - TI1FP1/TI2FP2:通道1/2滤波后信号 - ETRF:ETR外部触发引脚(滤波后) |
| sSlaveConfig.TriggerPolarity | TIM_TRIGGERPOLARITY_RISING TIM_TRIGGERPOLARITY_FALLING TIM_TRIGGERPOLARITY_BOTHEDGE |
触发信号的有效极性: - 上升沿有效 - 下降沿有效 - 双边沿都有效 |
| sSlaveConfig.TriggerPrescaler | TIM_TRIGGERPRESCALER_DIV1 TIM_TRIGGERPRESCALER_DIV2 TIM_TRIGGERPRESCALER_DIV4 TIM_TRIGGERPRESCALER_DIV8 |
触发信号预分频(仅ETR模式有效): - DIV1:不分频 - DIV2:每2个边沿触发1次 - DIV4:每4个边沿触发1次 - DIV8:每8个边沿触发1次 |
| sSlaveConfig.TriggerFilter | 0(无滤波) 1~15(滤波强度递增) |
触发信号数字滤波: - 0:不滤波,响应最快 - 1~15:滤波强度递增,抗干扰增强但延迟增大 |
TIX的代码

1 | HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig) |
| 配置项 | 可选项 | 作用与解释 |
|---|---|---|
| TIM_HandleTypeDef *htim | &htim-x (-x填数字1-8取决于定时器) | 结构体配置htim |
| const TIM_SlaveConfigTypeDef *sSlaveConfig | 配置从模式,看下方 | 结构体 |
TIM_SlaveConfigTypeDef sSlaveConfig
| 配置项 | 可选项 | 作用与解释 |
|---|---|---|
| sSlaveConfig.SlaveMode | TIM_SLAVEMODE_DISABLE TIM_SLAVEMODE_RESET TIM_SLAVEMODE_GATED TIM_SLAVEMODE_TRIGGER TIM_SLAVEMODE_EXTERNAL1 |
从模式类型: - 关闭:自由运行 - 复位:触发沿到来时计数器清零 - 门控:高电平计数,低电平停止 - 触发:触发沿到来时启动计数 - 外部时钟1:触发沿作为计数时钟 |
| sSlaveConfig.InputTrigger | TIM_TS_ITR0 TIM_TS_ITR1 TIM_TS_ITR2 TIM_TS_ITR3 TIM_TS_TI1F_ED TIM_TS_TI1FP1 TIM_TS_TI2FP2 TIM_TS_ETRF |
触发源选择: - ITR0~ITR3:来自其他定时器的内部触发信号 - TI1F_ED:通道1双边沿触发 - TI1FP1/TI2FP2:通道1/2滤波后信号 - ETRF:ETR外部触发引脚(滤波后) |
| sSlaveConfig.TriggerPolarity | TIM_TRIGGERPOLARITY_RISING TIM_TRIGGERPOLARITY_FALLING TIM_TRIGGERPOLARITY_BOTHEDGE |
触发信号的有效极性: - 上升沿有效 - 下降沿有效 - 双边沿都有效 |
| sSlaveConfig.TriggerFilter | 0(无滤波) 1~15(滤波强度递增) |
触发信号数字滤波: - 0:不滤波,响应最快 - 1~15:滤波强度递增,抗干扰增强但延迟增大 |
内部触发模式
创建cubemx
我们先用其他的定时器
按照计划是TIM1触发TIM2
那么相当TIM1是主,TIM2是从
我们先配置TIM1
我们先打开TIM1的内部定时器

然后我们在这里配置触发模式,当定时器触发后会给到TRGO

| 配置项 | 可选项 | 作用与解释 |
|---|---|---|
| Master/Slave Mode (MSM bit) | Disable (Trigger input effect not disabled) Enable (Trigger input effect enabled) |
主/从模式同步控制: - Disable:关闭主从模式同步,触发输入信号的影响不传播 - Enable:开启主从模式同步,触发输入信号的影响会同步到定时器的所有相关通道 |
| Trigger Event Selection | Reset (UG bit from TIMx_EGR) Enable (Counter Enable) Update (Update event) Compare Pulse (OCx or OCxREF signal rising edge) OC1Ref OC2Ref OC3Ref OC4Ref |
选择作为TRGO输出的触发事件: - Reset:更新生成事件(UG)触发 - Enable:计数器使能触发 - Update:更新事件触发 - Compare Pulse:比较匹配脉冲触发 - OC1Ref~OC4Ref:对应通道的参考信号作为触发源 |
一般都是用复位模式(Reset Mode)就是CNT复位会触发
然后我们配置TIM2

然后我们配置TIM2做为从定时器
关于ITR和定时器的关系我们要参考下面的表
- 高级定时器(从定时器)
| 从定时器 | ITR0 (TS=000) | ITR1 (TS=001) | ITR2 (TS=010) | ITR3 (TS=011) |
|---|---|---|---|---|
| TIM1 | TIM5 | TIM2 | TIM3 | TIM4 |
| TIM8 | TIM1 | TIM2 | TIM4 | TIM5 |
- 通用定时器(从定时器)
| 从定时器 | ITR0 (TS=000) | ITR1 (TS=001) | ITR2 (TS=010) | ITR3 (TS=011) |
|---|---|---|---|---|
| TIM2 | TIM1 | TIM8 | TIM3 | TIM4 |
| TIM3 | TIM1 | TIM2 | TIM5 | TIM4 |
| TIM4 | TIM1 | TIM2 | TIM3 | TIM8 |
| TIM5 | TIM2 | TIM3 | TIM4 | TIM8 |
因为是tim2作为从,tim1是主,那么就是对应ITR0
内部触发的代码
我们先看TIM1的初始化
我们主要一直看之前忽略的那个从模式配置

1 | HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) |
TIM_HandleTypeDef htim1;定义结构体(这里不介绍和上方一样)
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:禁用主从同步(普通定时常用) |
我们先看TIM2的初始化

1 | HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig) |
| 配置项 | 可选项 | 作用与解释 |
|---|---|---|
| TIM_HandleTypeDef *htim | &htim-x (-x填数字1-8取决于定时器) | 结构体配置htim |
| const TIM_SlaveConfigTypeDef *sSlaveConfig | 配置从模式,看下方 | 结构体 |
TIM_SlaveConfigTypeDef sSlaveConfig
| 配置项 | 可选项 | 作用与解释 |
|---|---|---|
| sSlaveConfig.SlaveMode | TIM_SLAVEMODE_DISABLE TIM_SLAVEMODE_RESET TIM_SLAVEMODE_GATED TIM_SLAVEMODE_TRIGGER TIM_SLAVEMODE_EXTERNAL1 |
从模式类型: - 关闭:自由运行 - 复位:触发沿到来时计数器清零 - 门控:高电平计数,低电平停止 - 触发:触发沿到来时启动计数 - 外部时钟1:触发沿作为计数时钟 |
| sSlaveConfig.InputTrigger | TIM_TS_ITR0 TIM_TS_ITR1 TIM_TS_ITR2 TIM_TS_ITR3 TIM_TS_TI1F_ED TIM_TS_TI1FP1 TIM_TS_TI2FP2 TIM_TS_ETRF |
触发源选择: - ITR0~ITR3:来自其他定时器的内部触发信号 - TI1F_ED:通道1双边沿触发 - TI1FP1/TI2FP2:通道1/2滤波后信号 - ETRF:ETR外部触发引脚(滤波后) |