在 STM32 中,主从触发模式(Master/Slave Mode) 是定时器(TIM)外设的核心功能之一,本质是通过硬件联动实现多个定时器 / 外设之间的同步、级联或触发控制,无需 CPU 干预,能提升时序精度和系统效率。
一、核心应用场景
主从触发模式主要解决 "多外设同步工作" 的问题,典型场景包括:
- 多定时器同步计数(如多路 PWM 同步输出);
- 定时器触发 ADC/DAC 采样(替代软件触发,提升采样精度);
- 定时器级联(如低频定时器触发高频定时器,扩展计数范围);
- 编码器 / 霍尔传感器信号触发定时器计数。
二、关键硬件通路
1. 主设备:TRGO 信号生成
定时器(如 TIM1/TIM2/TIM3 等)可配置为 "主模式",通过内部逻辑生成触发输出信号(TRGO),TRGO 的触发源可配置为:
| 触发源 | 说明 |
|---|---|
| 定时器更新事件(Update) | 溢出 / 下溢时触发(最常用) |
| 捕获 / 比较事件(CC1/CC2) | 通道 1/2 捕获 / 比较时触发 |
| 定时器触发事件(Trigger) | 外部触发输入时触发 |
| 计数器使能(Counter Enable) | 定时器启动时触发 |
配置路径:TIMx_CR2 寄存器的 MMS[2:0] 位(主模式选择)。
2. 从设备:TRGI 信号接收与动作
定时器(或 ADC/DAC 等)作为 "从设备",接收触发输入信号(TRGI),TRGI 的来源可配置为:
- 内部:其他定时器的 TRGO(如 TIM1_TRGO → TIM2_TRGI);
- 外部:GPIO 引脚(如 TI1/TI2)、编码器信号、ETR 外部触发引脚;
- 外设联动:ADC 的转换完成信号、DAC 的触发信号等。
从设备接收到 TRGI 后,可执行的动作由 TIMx_SMCR 寄存器的 SMS[2:0](从模式选择)和 TS[2:0](触发源选择)配置,核心动作包括:
| 从模式动作 | 说明 |
|---|---|
| 复位模式(Reset) | TRGI 触发时,计数器清零 |
| 门控模式(Gated) | TRGI 为高 / 低电平时,计数器才计数 |
| 触发模式(Trigger) | TRGI 上升 / 下降沿触发计数器启动 / 停止 |
| 编码器模式(Encoder) | 外部编码器信号触发计数(特殊从模式) |
三、典型配置步骤(以定时器同步为例)
以 "TIM1 为主设备,触发 TIM2 复位计数" 为例:
步骤 1:配置主设备(TIM1)
c
运行
// 1. 使能TIM1时钟
__HAL_RCC_TIM1_CLK_ENABLE();
// 2. 配置TIM1基本参数(如计数模式、自动重装值等)
TIM_HandleTypeDef htim1;
htim1.Instance = TIM1;
htim1.Init.Prescaler = 71; // 分频后1MHz
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 999; // 1ms更新一次
HAL_TIM_Base_Init(&htim1);
// 3. 配置主模式:更新事件作为TRGO输出
TIM_MasterConfigTypeDef sMasterConfig;
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; // TRGO触发源为更新事件
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; // 使能主模式
HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
步骤 2:配置从设备(TIM2)
c
运行
// 1. 使能TIM2时钟
__HAL_RCC_TIM2_CLK_ENABLE();
// 2. 配置TIM2基本参数
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 4999; // 50ms
HAL_TIM_Base_Init(&htim2);
// 3. 配置从模式:接收TIM1的TRGO,触发复位
TIM_SlaveConfigTypeDef sSlaveConfig;
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET; // 从模式为复位(TRGI触发时计数器清零)
sSlaveConfig.InputTrigger = TIM_TS_ITR0; // 触发源为ITR0(TIM1_TRGO → TIM2_ITR0,不同定时器ITR映射不同)
HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig);
// 4. 使能TIM2计数
HAL_TIM_Base_Start(&htim2);
// 5. 启动TIM1(主设备)
HAL_TIM_Base_Start(&htim1);
四、核心注意点
- TRGO/TRGI 映射关系:不同定时器的 ITR(内部触发连接)映射不同(如 TIM1→TIM2 的 ITR0,TIM2→TIM3 的 ITR1),需参考芯片手册的 "定时器内部触发连接" 表;
- 主从模式使能 :主设备需开启
TIM_MASTERSLAVEMODE_ENABLE,否则 TRGO 无输出; - 外设联动 :ADC/DAC 也可作为 "从设备",接收定时器 TRGO 触发采样 / 转换(如 ADC 的
ADC_EXTERNALTRIGCONV_T1_TRGO); - 优先级:硬件触发无需 CPU 介入,时序精度远高于软件中断触发。
五、总结
STM32 的主从触发模式本质是硬件级的同步机制:
- 主设备通过 TRGO 输出触发信号,从设备通过 TRGI 接收并执行预设动作;
- 核心价值是脱离 CPU 实现多外设同步,提升时序精度、降低 CPU 负载;
- 广泛用于 PWM 同步、高精度采样、编码器计数、定时器级联等场景。
不同系列 STM32(F1/F4/H7)的寄存器配置细节略有差异,但核心逻辑一致,需结合对应芯片手册调整。