这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » Update与overflow中断标志小议(附代码)

共2条 1/1 1 跳转至

Update与overflow中断标志小议(附代码)

院士
2013-02-10 16:47:41     打赏
Updateoverflow中断标志小议(附代码)
overflow

溢出中断,在最初学习单片机时,使用AVR的芯片,其中断有比较中断,溢出中断等。因此,到现在也没有忘记这些Key words。在AVR单片机里,定时器通过分频器分频后就开始向上增长,有且只有这一种方式。因此,设置好计数器的初始值后,定时器就等着计数器溢出。然后执行中断程序,这里用户需要自行再重置计数器的值。但是同样的机制会不会存在于stm32的芯片不?

TIM_IT_Update

溢出中断在Cortex-M3单片机里貌似并没有减少,而是灰常灰常的丰富了。与之相对应的stm32固件库里的参数即为:TIM_IT_Update。使用的方式也比AVR简单,而且其处理的方式也更加完善、完美。下面也简单的介绍一下其使用方式:

首先需要打开RCC时钟,然后配置prescaler,最后设置TIM_Period值。Tim_counter会以分频后时间间隔增加counter值。计数的方式是向上生长,从0开始,当计数值到达auto-reload值后,下一个时钟周期产生中断,将对应中断标志位置位。然后再将计数清零,并再次从零生长。中断里需要用户自行清除掉相应中断标志位。

查看了一下STM32的官方示例,并没有相关的示例。自己写了一个,以供大家参考:

//示例以72MHz的主频,以1MHz计数,当counter数到999后,产生TIM_IT_Update中断,即1ms的间隔

void delay_init(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  TIM_OCInitTypeDef  TIM_OCInitStructure;

  Int16U PrescalerValue = 0; 

  /* PCLK1 = HCLK/4 */

  RCC_PCLK1Config(RCC_HCLK_Div4);

  /* TIM2 clock enable */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  /* Enable the TIM2 global Interrupt */

  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  /* Compute the prescaler value */

  PrescalerValue = (Int16U) (SystemCoreClock / 2000000) - 1;

  /* Time base configuration */

  TIM_TimeBaseStructure.TIM_Period = 999;

  TIM_TimeBaseStructure.TIM_Prescaler = 0;

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  /* Prescaler configuration */

  TIM_PrescalerConfig(TIM2, PrescalerValue, TIM_PSCReloadMode_Immediate);

  /* TIM IT enable */

  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

  /* TIM2 enable counter */

  TIM_Cmd(TIM2, ENABLE);

}

//中断函数

void TIM2_IRQHandler(void)

{

  if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

  {

    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

    if(gTimer1 != 0)

    {

      gTimer1--;

    }

  }

}







关键词: Update     overflow     中断     标志     小议         

院士
2013-02-10 16:48:33     打赏
2楼
改版后,使用firefox编辑文档已经没有文字源代码了。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]