定时中断基本结构
打开时钟-->配置 时钟源-->配置 时基单元-->配置 中断输出-->配置 NVIC-->启动 定时器
程序
void Timer_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
/*配置时钟*/
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
//CK_CNT_OV=CK_PSC/(PSC+1)/(ARR+1)
TIM_TimeBaseInitStruct.TIM_Period=7200*5-1;//2000 Hz
TIM_TimeBaseInitStruct.TIM_Prescaler=2000*3-1;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
//为更新预分频器和重复计数器的值,该函数会直接进入一次中断
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除标志位
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
//使能中断,当计数达到设定值时,触发中断处理程序。
/*配置中断*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2,ENABLE);//启动定时器,定时器开始计数。
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
{
/*中断代码*/
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}
要点/问题
- 定时频率的设置
TIM_TimeBaseInitStruct.TIM_Prescaler//预分频值PSC
TIM_TimeBaseInitStruct.TIM_Period//重装载值ARR
公式:CK_CNT_OV=CK_PSC/(PSC+1)/(ARR+1)
CK_CNT_OV
:定时器的溢出频率或计数周期的频率,单位为 Hz。CK_PSC
:输入时钟频率(例如,72 MHz(72 000 000 Hz))。PSC
:预分频器的值,分频系数为PSC + 1
。ARR
:自动重装载值,定时器计数到ARR + 1
次时触发溢出或更新事件。
- 解释 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE)
- 作用
- 当定时器
TIM2
发生更新事件(例如计数器从ARR
计数回到 0,即溢出)时,触发中断。 - 使用
ENABLE
参数,激活这个更新中断,使定时器溢出时产生中断请求。 - 在定时器中断服务函数(
TIM2_IRQHandler
)中可以处理这个中断。
TIM_IT_Update
:表示选择的中断类型是更新中断(也就是定时器溢出时的中断)。
- 定时器在初始化时会直接运行中断函数
- 原因
TIM_TimeBaseInit
定义中的一条
/* Generate an update event to reload the Prescaler and the Repetition counter values immediately */
// 生成更新事件 以立即重新加载 预分频器和重复计数器 的值
TIMx->EGR = TIM_PSCReloadMode_Immediate;
及 为更新预分频器和重复计数器的值,该函数会直接进入一次中断
- 解决
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除标志位
- TIM_ClearFlag 和 TIM_ClearITPendingBit 的区别
TIM_ClearFlag(TIM2, TIM_FLAG_Update)
:用于清除定时器的更新事件标志位,更新事件可能是由定时器溢出、更新触发等原因引起的。这个标志位可以用于查询更新事件的发生,而不依赖中断。TIM_ClearITPendingBit(TIM2, TIM_IT_Update)
:用于清除定时器的中断挂起标志位。当中断使能时,更新事件发生后定时器会触发中断,并且中断挂起标志位会被置位。调用该函数可以清除该中断挂起标志位。