STM32 定時器輸入捕獲功能筆記
一、什么是輸入捕獲(Input Capture)
輸入捕獲是利用定時器的輸入通道,在檢測到信號電平變化(如上升沿或下降沿)時,立即將當前計數器的值捕獲并保存到捕獲寄存器(CCR)中。這一過程由硬件完成,不會受程序運行延遲影響,可用于精確測量信號的時間特性。
典型應用場景:測量脈沖寬度、頻率、信號周期等。
二、輸入捕獲的基本原理
-
STM32 的通用定時器和高級定時器都支持輸入捕獲功能。
-
每個輸入通道(TIx)都對應一個捕獲寄存器 CCRx。
-
捕獲過程:
TIx → 濾波器 → 邊沿檢測 → 捕獲事件 → CCRx記錄當前CNT值
當配置為上升沿捕獲時:
→ 信號從低跳高時,CCRx 記錄當前定時器 CNT 的值。
當配置為下降沿捕獲時:
→ 信號從高跳低時,CCRx 同樣記錄 CNT 值。
📌 一個通道只能設置為上升沿或下降沿捕獲,不能同時捕獲兩個。
三、直接模式與間接模式(重點)
輸入捕獲支持 直接模式 和 間接模式,用于靈活地測量信號寬度或周期。
模式 | 捕獲通道 | 檢測通道 | 用途舉例 |
---|---|---|---|
直接模式 | CCR1 記錄 TI1FP1 的邊沿 | 用于周期或頻率測量 | |
間接模式 | CCR1 記錄 TI2FP1 的邊沿 | 用于測量高/低電平寬度(PWM輸入) |
?? TI1/TI2 是一對可互相借用輸入的通道,TI3/TI4 亦同理。
例如 CCR1 可以捕獲 TI2(間接模式)輸入的邊沿,而不是 TI1。
示例說明:
-
PWM輸入測量:
-
CCR1 配置為捕獲上升沿(周期起點)
-
CCR2 配置為捕獲下降沿(占空比終點)
-
得到的兩次捕獲值之差即可算出高電平持續時間或周期
-
四、通道映射說明
TI1 --> TI1FP1 → 捕獲寄存器1(CCR1)
TI2 --> TI2FP2 → 捕獲寄存器2(CCR2)
TI1 --> TI1FP2 → 捕獲寄存器2(間接模式)
TI2 --> TI2FP1 → 捕獲寄存器1(間接模式)TI3、TI4同理,支持直接與間接映射
五、CubeMX 設置步驟(以 TIM2 CH1 CH2 為例)
1.選擇定時器 TIM2
2.選擇 Channel 1 → Input Capture Direct Mode
(上升沿)
3.選擇 Channel 2 → Input Capture Indirect Mode
(下降沿)
4.設置輸入極性(上升沿/下降沿)
5.設置采樣頻率與濾波器(一般默認即可)
6.勾選 TIM2 global interrupt
7.生成代碼并編輯中斷回調函數
六、HAL庫相關函數與代碼示例
1. 啟動捕獲:
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); // 啟動通道1輸入捕獲(中斷方式)
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2); // 啟動通道2輸入捕獲
2. 中斷回調處理:
uint32_t capture1 = 0, capture2 = 0, pulse_width = 0;void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){capture1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 上升沿時間}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){capture2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); // 下降沿時間if(capture2 > capture1)pulse_width = capture2 - capture1;elsepulse_width = (0xFFFF - capture1 + capture2); // 溢出處理}
}
1;elsepulse_width = (0xFFFF - capture1 + capture2); // 溢出處理}
}