找回密码
 立即注册
首页 业界区 安全 定时中断基本结构

定时中断基本结构

慕疼 2025-6-9 11:24:29
1.png

打开时钟-->配置 时钟源-->配置 时基单元-->配置 中断输出-->配置 NVIC-->启动 定时器
程序
  1. void Timer_Init(void)
  2. {
  3.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  4.        
  5.         /*配置时钟*/
  6.         TIM_InternalClockConfig(TIM2);
  7.        
  8.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  9.         TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
  10.         TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
  11.        
  12.         //CK_CNT_OV=CK_PSC/(PSC+1)/(ARR+1)
  13.         TIM_TimeBaseInitStruct.TIM_Period=7200*5-1;//2000 Hz
  14.         TIM_TimeBaseInitStruct.TIM_Prescaler=2000*3-1;
  15.         TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
  16.        
  17.         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
  18.         //为更新预分频器和重复计数器的值,该函数会直接进入一次中断
  19.         TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除标志位
  20.        
  21.         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  22.         //使能中断,当计数达到设定值时,触发中断处理程序。
  23.        
  24.         /*配置中断*/
  25.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  26.         NVIC_InitTypeDef NVIC_InitStructure;
  27.         NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
  28.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  29.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
  30.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
  31.         NVIC_Init(&NVIC_InitStructure);
  32.        
  33.         TIM_Cmd(TIM2,ENABLE);//启动定时器,定时器开始计数。
  34. }
  35. void TIM2_IRQHandler(void)
  36. {
  37.         if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
  38.         {
  39.                 /*中断代码*/
  40.                 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
  41.         }
  42. }
复制代码
要点/问题

定时频率的设置
  1. TIM_TimeBaseInitStruct.TIM_Prescaler//预分频值PSC
  2. 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 定义中的一条
    1. /* Generate an update event to reload the Prescaler and the Repetition counter values immediately */
    2. // 生成更新事件 以立即重新加载 预分频器和重复计数器 的值
    3. TIMx->EGR = TIM_PSCReloadMode_Immediate;  
    复制代码
    及 为更新预分频器和重复计数器的值,该函数会直接进入一次中断
  • 解决
    1. TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
    2. TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除标志位
    复制代码
TIM_ClearFlag 和 TIM_ClearITPendingBit 的区别


  • TIM_ClearFlag(TIM2, TIM_FLAG_Update):用于清除定时器的更新事件标志位,更新事件可能是由定时器溢出、更新触发等原因引起的。这个标志位可以用于查询更新事件的发生,而不依赖中断。
  • TIM_ClearITPendingBit(TIM2, TIM_IT_Update):用于清除定时器的中断挂起标志位。当中断使能时,更新事件发生后定时器会触发中断,并且中断挂起标志位会被置位。调用该函数可以清除该中断挂起标志位。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册