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微控制器定时器的使用指南,包括初始化、中断配置及实际应用案例。通过示例代码,详细介绍了如何设置定时器的时钟、模式、中断等关键参数,以及如何添加和处理定时中断。适用于初学者快速掌握定时器编程技巧。
1112

被折叠的 条评论
为什么被折叠?



