一、函數功能與定位?
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負擔并提升系統可靠性。實際開發中需注意通道與觸發源的匹配關系、濾波器配置及中斷協同策略。