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