一、函数功能与定位
TIM_SelectInputTrigger()
是STM32定时器外设的关键配置函数,用于设置从模式定时器的触发源(Trigger Source)。其核心作用是将定时器的内部事件或外部信号映射为触发信号(TRGI),进而控制从定时器的计数行为(如启动/停止/复位等)。该函数属于STM32标准外设库(SPL)或HAL库的底层配置接口。
二、函数原型与参数解析
1. 函数原型
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
-
TIMx
:目标定时器指针(如TIM1
、TIM3
)。 -
TIM_InputTriggerSource
:触发源类型,可选值见下表:
触发源类型 | 功能描述 |
---|---|
TIM_TS_ITR0 ~ ITR3 | 内部触发源,用于定时器级联(如TIM2触发TIM3) |
TIM_TS_TI1F_ED | TI1引脚边沿检测器(上升沿+下降沿) |
TIM_TS_TI1FP1 | 通道1滤波后输入信号(TI1FP1),可配置单边沿 |
TIM_TS_TI2FP2 | 通道2滤波后输入信号(TI2FP2) |
TIM_TS_ETRF | 外部触发输入(ETR引脚信号) |
2. 参数选择规则
- 内部触发(ITRx):用于定时器同步(如TIM1更新事件触发TIM2计数)。
连接规则:ITR0
:TIM1 → TIM2ITR1
:TIM1 → TIM3ITR2
:TIM1 → TIM4- (具体映射需查芯片参考手册)
- 外部引脚触发:需结合GPIO配置:
TI1FP1
/TI2FP2
需初始化对应通道引脚(如TIM3_CH1
对应PA6
)。ETRF
需使能ETR引脚(如TIM1_ETR对应PA12
)。
三、底层机制:触发源与从模式的协同
1. 从模式控制器(Slave Mode Controller)
触发源信号(TRGI)输入至定时器的从模式控制器,通过配置从模式(Slave Mode) 决定响应行为:
从模式 | 功能 | 典型应用 |
---|---|---|
TIM_SlaveMode_Reset | 触发时复位计数器CNT | 信号周期测量 |
TIM_SlaveMode_Gated | 触发信号高电平时计数 | 脉冲宽度测量 |
TIM_SlaveMode_Trigger | 触发信号作为计数器时钟 | 外部时钟同步 |
TIM_SlaveMode_External1 | ETR引脚上升沿计数 | 编码器接口 |
2. 协同配置流程
// 步骤1:选择触发源
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); // 使用TIM3_CH1的滤波信号// 步骤2:设置从模式行为
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // 上升沿复位CNT
四、典型应用场景与代码实现
场景1:精确频率测量(复位模式)
原理:信号上升沿触发CNT复位,CCR直接存储周期计数值,无需计算差值。
配置代码:
void TIM3_FreqMeasurement_Init(void)
{// 时基配置(1MHz计数频率)TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;TIM_TimeBaseStruct.TIM_Period = 0xFFFF;TIM_TimeBaseStruct.TIM_Prescaler = 72 - 1; // 72MHz/72 = 1MHzTIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct);// 输入捕获(通道1,上升沿)TIM_ICInitTypeDef TIM_ICStruct;TIM_ICStruct.TIM_Channel = TIM_Channel_1;TIM_ICStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;TIM_ICStruct.TIM_ICFilter = 0x0; // 无滤波TIM_ICInit(TIM3, &TIM_ICStruct);// 关键配置:触发源+从模式TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);TIM_Cmd(TIM3, ENABLE);
}// 读取频率(单位:Hz)
float Get_Signal_Frequency(void) {uint16_t capture = TIM_GetCapture1(TIM3);return 1000000.0f / capture; // 1MHz时钟 → 周期 = capture μs
}
优势:避免手动计算current_capture - last_capture
,消除计数器溢出风险。
场景2:定时器级联(内部触发)
原理:主定时器更新事件触发从定时器计数,扩展定时范围。
配置代码:
// TIM2为主,TIM3为从
void TIM2_Master_TIM3_Slave_Init(void)
{// TIM2配置(输出触发信号)TIM_TimeBaseInit(TIM2, ...);TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); // 更新事件触发TRGO// TIM3配置(从模式)TIM_TimeBaseInit(TIM3, ...);TIM_SelectInputTrigger(TIM3, TIM_TS_ITR2); // TIM2→TIM3的触发源为ITR2TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger); // TRGI作为时钟
}
效果:TIM3的计数器在TIM2每次更新时递增,实现32位定时器扩展。
场景3:PWM输入模式(双通道捕获)
原理:单信号同时触发两个通道,分别捕获周期(CCR1)和占空比(CCR2)。
配置代码:
void TIM3_PWMI_Init(void)
{// 时基配置(略)// 通道1:上升沿捕获周期(直连)TIM_ICInitTypeDef IC1 = {TIM_Channel_1, TIM_ICPolarity_Rising, TIM_ICSelection_DirectTI};TIM_ICInit(TIM3, &IC1);// 通道2:下降沿捕获占空比(交叉)TIM_ICInitTypeDef IC2 = {TIM_Channel_2, TIM_ICPolarity_Falling, TIM_ICSelection_IndirectTI};TIM_ICInit(TIM3, &IC2);// 复位模式触发源(TI1FP1)TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
}// 计算占空比
uint8_t Get_PWM_Duty(void)
{uint16_t period = TIM_GetCapture1(TIM3); // 周期值uint16_t pulse = TIM_GetCapture2(TIM3); // 高电平时间return (pulse * 100) / period; // 占空比%
}
五、高级技巧与注意事项
1. 滤波器配置优化
- 作用:抑制信号抖动(如按键抖动、噪声)。
- 配置:
TIM_ICInitTypeDef.TIM_ICFilter
(0x0~0xF),值越大滤波效果越强。TIM_ICStruct.TIM_ICFilter = 0x0F; // 最大滤波(16个时钟事件)
2. 通道与触发源限制
- 通道依赖性:
TI1FP1
仅支持通道1,TI2FP2
仅支持通道2。- 通道3/4不支持自动复位模式(需中断手动清零CNT)。
- ETR引脚复用:需开启AFIO时钟并重映射。
3. 中断协同
尽管从模式可硬件自动运行,但结合中断可提高实时性:
// 使能更新中断
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
NVIC_EnableIRQ(TIM3_IRQn);// 中断服务函数
void TIM3_IRQHandler(void)
{if (TIM_GetITStatus(TIM3, TIM_IT_Update)) {// 处理捕获完成事件(如计算频率)TIM_ClearITPendingBit(TIM3, TIM_IT_Update);}
}
六、常见问题解答(FAQ)
Q:一个定时器能否同时使用多个触发源?
A:否,一次只能选择一个触发源,但可通过分时复用或组合模式实现复杂功能。Q:触发源配置后无响应?
A:检查步骤:- GPIO是否正确初始化为复用功能
- 从模式是否使能(
TIM_SelectSlaveMode
) - 滤波器是否过度抑制信号
Q:如何测量非周期性信号?
A:改用普通输入捕获模式(手动记录两次捕获值差值)。Q:ETR触发时计数器不递增?
A:确认从模式设置为TIM_SlaveMode_External1
。
七、总结
TIM_SelectInputTrigger()
是STM32定时器主从模式的核心配置函数,通过灵活选择内部事件或外部信号作为触发源,配合复位/门控/触发等从模式,可显著优化信号测量、定时器同步等应用的效率和精度。其关键优势在于硬件自动处理计数逻辑,减轻CPU负担并提升系统可靠性。实际开发中需注意通道与触发源的匹配关系、滤波器配置及中断协同策略。