一、TIM定時器
STM32高級定時器實戰:PWM、捕獲與死區控制詳解-CSDN博客
玩轉STM32_rivencode的博客-CSDN博客
二、相關函數
1.TIM_TimeBaseInitTypeDef結構體講解
typedef struct
{uint16_t TIM_Prescaler; // 預分頻器,用于設置定時器計數頻率uint16_t TIM_CounterMode; // 計數模式:向上、向下或中心對齊模式
// 自動重裝載寄存器值,定時周期 = (TIM_Period + 1) * (Prescaler + 1) / Timer_Clockuint16_t TIM_Period; uint16_t TIM_ClockDivision; // 時鐘分頻(用于濾波器),對輸入捕獲/死區時間等有影響uint8_t TIM_RepetitionCounter; // 重復計數器(高級定時器)
} TIM_TimeBaseInitTypeDef;
2.基本、通用、高級定時器
類型 | 舉例 | PWM | 輸入捕獲/輸出比較 | 死區控制 | 互補輸出 | 重復計數器 | 主從同步 | 中斷/定時功能 |
---|---|---|---|---|---|---|---|---|
基本定時器 | TIM6、TIM7 | ? | ? | ? | ? | ? | ? | ? 支持中斷、定時 |
通用定時器 | TIM2~TIM5 | ? | ? | ? | ? | ? | ? | ? 支持多種模式 |
高級定時器 | TIM1、TIM8 | ? | ? | ? | ? | ? | ? | ? 功能最強大 |
分類 | 功能特性 | 常見用途 |
---|---|---|
基本定時器 | 只支持定時和中斷 | 簡單定時中斷、DAC 觸發 |
通用定時器 | 支持 PWM、輸入捕獲、輸出比較等 | 電機控制、PWM、信號測量 |
高級定時器 | 通用功能 + 死區 + 互補 + 重復計數器等 | 高級電機控制、逆變器、功率控制 |
3.TIM_ClearFlag函數講解
用于 清除定時器中斷/狀態標志位。它的本質就是將 TIMx->SR
中某些標志位置 0。
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_IT);
參數 | 說明 |
---|---|
TIMx | 要操作的定時器(如 TIM2 , TIM3 等) |
TIM_IT | 要清除的中斷標志位,可以是以下值之一或它們的組合: - TIM_IT_Update (更新中斷)- TIM_IT_CC1 ~ TIM_IT_CC4 (通道中斷)- TIM_IT_Trigger (觸發中斷)- TIM_IT_COM (通訊中斷) |
-
必須清除標志位,否則定時器中斷會不斷重復進入。
-
清除標志位 應該在中斷處理函數中進行。
-
可以組合多個標志一起清除:
4.TIM_ITConfig函數講解
開啟或關閉指定的定時器中斷源(如更新中斷、捕獲比較中斷、觸發中斷等)。
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
參數名 | 含義 |
---|---|
TIMx | 要配置的定時器,例如 TIM1 ~ TIM17 (取決于芯片型號) |
TIM_IT | 中斷類型 |
NewState | ENABLE 或 DISABLE ,表示啟用或關閉該中斷 |
宏定義 | 含義 |
---|---|
TIM_IT_Update | 更新中斷(即計數器溢出) |
TIM_IT_CC1 | 捕獲/比較 1 中斷 |
TIM_IT_CC2 | 捕獲/比較 2 中斷 |
TIM_IT_CC3 | 捕獲/比較 3 中斷 |
TIM_IT_CC4 | 捕獲/比較 4 中斷 |
TIM_IT_Trigger | 觸發中斷 |
TIM_IT_COM | 通訊中斷(高級定時器) |
TIM_IT_Break | 斷路器中斷(高級定時器) |
此函數 不會 配置 NVIC,必須另外調用 NVIC_Init()
注冊中斷號;
TIM_ITConfig()
會設置 TIMx->DIER
(DMA/中斷使能寄存器) 中對應中斷的使能位;
5.TIM_GetITStatus函數講解
用于 查詢某個定時器中斷是否觸發 的函數。
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
參數 | 說明 |
---|---|
TIMx | 要查詢的定時器(如 TIM1 ~ TIM17 ,具體取決于芯片型號) |
TIM_IT | 要查詢的中斷源(如 TIM_IT_Update 、TIM_IT_CC1 等) |
🔁 返回值:
-
SET
:指定的中斷標志已經被置位,即中斷已經觸發。 -
RESET
:指定的中斷標志未被置位。
TIM_GetITStatus()
會檢查定時器的以下兩個寄存器:
-
TIMx->SR
:狀態寄存器,包含中斷標志位 -
TIMx->DIER
:中斷使能寄存器,對應中斷是否使能
?? 只有當中斷標志位被置位,并且該中斷已使能時,函數才返回 SET
。
6.TIM_ClearITPendingBit函數講解
用于 清除定時器中斷掛起標志位(Pending Bit)
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
當某個定時器中斷發生時,標志位(比如 UIF)會在 SR
寄存器中置位,表示該中斷事件已發生。如果不清除該標志位,下一次進入中斷時,標志位仍然為1,會導致反復進入中斷,造成“死循環”現象。因此,需要在中斷服務函數中調用此函數清除中斷標志位。該函數本質上就是對 TIMx->SR
寄存器中某些位寫 0
來清除掛起標志。
void TIM3_IRQHandler(void)
{// 判斷是否為更新中斷if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除中斷標志位// 執行你的中斷處理邏輯}
}
7.TIM_ClearITPendingBit與TIM_ClearFlag有何區別
其實重點在Flag和IT,前者是外設的狀態標志,而后者是外設的中斷標志。狀態標志就是一個外設它有自身的一些標志位(Flag),來表明它處于什么狀態。中斷標志就是使能外設的中斷后,每次發生一次中斷,它會表明發生了什么樣的中斷,同樣中斷也有相應的標記。兩者分別靠函數TIM_GetFlagStatus()和函數TIM_GetITStatus()來獲取。
TIM_ClearITPendingBit一般用于 中斷服務函數中,防止中斷反復進入。
TIM_ClearFlag通常用于輪詢模式下清除標志位。
可以看出兩個函數的實現基本一致。