四、定时器中断

四、定时器中断

STM32的定时器有很多用法,例如定时产生中断、输入捕获、输出比较、编码器接口等等,本次笔记使用的是定时器定时产生中断,然后可以在中断回调函数中写入自己的代码,起到一个定时执行的作用

1.定时器配置初始化

void TIM_Init()
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
  /*上电后默认使用的是内部时钟,所以如果使用的是内部时钟源这一行可以省略*/
  TIM_InternalClockConfig(TIM2);
    
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInitStruct.TIM_Period = 1000-1;
  TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;
  TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
    
  /*词条语句可避免此上电立即进入一次定时器中断的情况*/
  TIM_ClearFlag(TIM2, TIM_IT_Update);
    
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  NVIC_InitTypeDef NVIC_InitStruct;
  NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
  NVIC_Init(&NVIC_InitStruct);
    
  TIM_Cmd(TIM2, ENABLE);
}

2.定时器中断回调函数

需要注意的是定时器中断函数的函数名是固定的不能随意更改,函数名可在.s启动文件的中断向量表中查询

void TIM2_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM2, TIM_CounterMode_Up) == SET)
  {
    /*执行中断程序*/
        
        
    /*清楚中断标志位*/
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  }
}

本次笔记基于B站UP主江协科技STM32教程总结而来

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索