一、函数功能与定位

TIM_SelectInputTrigger()是STM32定时器外设的关键配置函数,用于设置从模式定时器的触发源(Trigger Source)​。其核心作用是将定时器的内部事件或外部信号映射为触发信号(TRGI),进而控制从定时器的计数行为(如启动/停止/复位等)。该函数属于STM32标准外设库(SPL)或HAL库的底层配置接口。


二、函数原型与参数解析

1. 函数原型
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
  • TIMx:目标定时器指针(如TIM1TIM3)。
  • 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 → TIM2
    • ITR1:TIM1 → TIM3
    • ITR2: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 = 1MHz
  TIM_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的触发源为ITR2
  TIM_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)​

  1. Q:一个定时器能否同时使用多个触发源?​
    A:否,一次只能选择一个触发源,但可通过分时复用或组合模式实现复杂功能。

  2. Q:触发源配置后无响应?​
    A:检查步骤:

    • GPIO是否正确初始化为复用功能
    • 从模式是否使能(TIM_SelectSlaveMode
    • 滤波器是否过度抑制信号
  3. Q:如何测量非周期性信号?​
    A:改用普通输入捕获模式(手动记录两次捕获值差值)。

  4. Q:ETR触发时计数器不递增?​
    A:确认从模式设置为TIM_SlaveMode_External1


七、总结

TIM_SelectInputTrigger()是STM32定时器主从模式的核心配置函数,通过灵活选择内部事件外部信号作为触发源,配合复位/门控/触发等从模式,可显著优化信号测量、定时器同步等应用的效率和精度。其关键优势在于硬件自动处理计数逻辑,减轻CPU负担并提升系统可靠性。实际开发中需注意通道与触发源的匹配关系、滤波器配置及中断协同策略。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐