EFM32的定时器使用例程

EFM32提供的开发套件例程里好像没有关于定时器的例程,这两天在调试过程中用到了定时器,虽然使用定时器很容易,但是在定时器的配置、中断的设置过程中还是花费了一些时间。现在我把定时器的使用过程和配置程序贴上来,方便以后有人用到时可以很快的添加到自己的项目中。

1、初始化定时器,如果只做定时应用,只需要设置定时器的时钟、定时模式、Top寄存器。

void InitTimer1(void)
{
    TIMER_Init_TypeDef init_timer; //首先定义一个用于定时器初始化的结构体
    CMU_ClockEnable(cmuClock_TIMER1, true);  //开启定时器Timer1的时钟
    CMU_ClockEnable(cmuClock_HFPER, true);   //开启高速外设时钟
    TIMER_TopSet(TIMER1,16250);  //设置Timer1的Top寄存器,用于设置定时器的定时周期
                                 //当计数器的值增加到和此值相等时,将会置位定时器的IF寄存器中的OF溢出中断标志位
                                 //Top寄存器必须在调用TIMER_Init函数前进行设置
    //设置定时器
    init_timer.enable     = true;                   /* Enable timer when init complete. */ //开启定时器                     
    init_timer.debugRun   = false;                  /* Stop counter during debug halt. */  //调试暂停时,定时器停止运行                     
    init_timer.prescale   = timerPrescale8;         /* prescaling 8 */                     //分频系数为8                    
    init_timer.clkSel     = timerClkSelHFPerClk;    /* Select HFPER clock. */              //选择高速外设时钟                     
    init_timer.count2x    = false;                  /* Not 2x count mode. */               //关闭双通道计数                     
    init_timer.ati        = false;                  /* No ATI. */                          //关闭ati                     
    init_timer.fallAction = timerInputActionNone;   /* No action on falling input edge. */ //下降沿无动作                     
    init_timer.riseAction = timerInputActionNone;   /* No action on rising input edge. */  //上升沿无动作                     
    init_timer.mode       = timerModeUp;            /* Up-counting. */                     //增加数模式                     
    init_timer.dmaClrAct  = false;                  /* Do not clear DMA requests when DMA channel is active. */ //
    init_timer.quadModeX4 = false;                  /* Select X2 quadrature decode mode (if used). */  //         
    init_timer.oneShot    = false;                  /* Disable one shot. */                 //                    
    init_timer.sync       = false;                   /* Not started/stopped/reloaded by other timers. */  //       
      
    TIMER_Init(TIMER1,&init_timer);  //初始化定时器
    
    TIMER_IntEnable(TIMER1,TIMER_IEN_OF);  //开启溢出中断
}

2、添加定时中断函数,EFM32的库函数已经将此函数和Timer1中断源进行关联,只需要添加此函数即可。

void TIMER1_IRQHandler(void)
{
    TIMER_IntClear(TIMER1,TIMER_IFC_OF);  //清除定时中断标志
    BSP_LedToggle(0);  //LED翻转,
}
3、最后,在主函数main中开启全局中断。

  INT_Disable();   //关闭全局中断

  /* Enable TIMER1 interrupt in NVIC. */
  NVIC_EnableIRQ(TIMER1_IRQn);  //开启Timer1中断
  
  InitTimer1(); //设置Timer1

  /* Initialization done, enable interrupts globally. */
  INT_Enable(); //开启全局中断
将以上代码添加到程序中,调试运行就能进入到定时中断TIMER1_IRQHandler函数中。我的电路中外部晶振为26M,定时器设置时选择8分频,所以定时器的时钟频率为26M/8=3.25MHz,16250*(1/3.25M)=5ms,即定时周期为5ms,用示波器测试,驱动LED的脉冲宽度为5ms。
以上程序用到了库中的em_int.h、em_timer.c,需要将这两个文件添加到工程中。


你可能感兴趣的:(EFM32的定时器使用例程)