在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 ),不会进入中断服务程序。 |