在STM32的定時器中斷配置中,TIM_ITConfig()
?和?TIM_Cmd()
?是兩個關鍵函數,它們分別控制中斷使能和定時器計數器的啟停,作用層級不同。以下是詳細解釋:
1.?TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE)
作用
-
啟用定時器的特定中斷源(這里是更新中斷?
TIM_IT_Update
)。 -
該函數操作的是定時器的?中斷使能寄存器?
TIMx_DIER
(DMA/Interrupt Enable Register)。
底層操作
TIMx->DIER |= TIM_IT_Update; // 置位DIER的UIE位(Update Interrupt Enable)
-
TIM_IT_Update
?對應?TIMx_DIER.UIE
?位(Update Interrupt Enable)。 -
當?
UIE=1
?時,若?TIMx_SR.UIF=1
(更新標志位),則定時器會向?NVIC(嵌套向量中斷控制器)發送中斷請求。
中斷流程中的位置
-
配置階段:在初始化時調用,告訴定時器“允許更新事件觸發中斷”。
-
硬件行為:
當?CNT == ARR
?時,硬件置?UIF=1
?→ 若?UIE=1
,則觸發中斷;若?UIE=0
,即使?UIF=1
?也不會中斷。
?2.?TIM_Cmd(TIM2, ENABLE)
作用
-
啟動或停止定時器的計數器(
CNT
?寄存器的計數)。 -
該函數操作的是定時器的?控制寄存器?
TIMx_CR1
(Control Register 1)
底層操作
TIMx->CR1 |= TIM_CR1_CEN; // 置位CR1的CEN位(Counter Enable)
-
CEN=1
:啟動計數器,CNT
?開始根據時鐘頻率遞增/遞減。 -
CEN=0
:停止計數器,CNT
?凍結在當前值。
中斷流程中的位置
-
定時器的工作開關:
-
即使中斷已使能(
UIE=1
),若?CEN=0
(定時器未啟動),CNT
?不會變化,永遠不會觸發?UIF=1
,因此也不會中斷。 -
只有?
CEN=1
?時,定時器才開始計數,并在?CNT == ARR
?時觸發中斷
-
3. 兩者在中斷流程中的分工
完整中斷觸發條件
定時器中斷的觸發需要同時滿足以下條件:
-
定時器運行:
TIMx_CR1.CEN = 1
(由?TIM_Cmd(ENABLE)
?設置)。 -
中斷使能:
TIMx_DIER.UIE = 1
(由?TIM_ITConfig(ENABLE)
?設置)。 -
事件發生:硬件檢測到?
CNT == ARR
,置?TIMx_SR.UIF = 1
。
?
Q1:為什么需要分開兩個函數?
-
解耦控制:
-
TIM_ITConfig()
?管是否允許中斷(邏輯控制)。 -
TIM_Cmd()
?管是否啟動定時器(物理控制)。
例如:你可能需要定時器運行(CEN=1
)但不觸發中斷(UIE=0
),用于PWM生成。
?
Q2:調用順序有要求嗎?
-
推薦順序:
-
先配置中斷(
TIM_ITConfig
)。 -
再啟動定時器(
TIM_Cmd
)。
-
原因:避免定時器啟動后立即觸發中斷,但中斷尚未配置完成。
-
Q3:如果只調用其中一個函數會怎樣?
情況 | 結果 |
---|---|
僅?TIM_ITConfig(ENABLE) | 定時器不計數(CEN=0 ),無中斷觸發。 |
僅?TIM_Cmd(ENABLE) | 定時器計數,UIF ?會置位,但中斷未使能(UIE=0 ),不會進入中斷服務程序。 |
?