今天学习了下M0的定时器,M0的定时器跟51的定时器相比较有几个相似的地方,但是复杂程度要高了许多.
使用51的定时器主要思路是:
(1)确定工作方式.(2)确定定时的初值.(3)对EA,ET0,ET1,IP进行操作.
(4)启动定时器.(5)定时时间到,开始中断服务.
使用M0的定时器的主要思路是:
(1)定时器初始化.(2)设置定时器的时钟源.这个要注意,有时候要根据程序确定需要的时钟源.学习51时俺经常无视这个.(3)工作模式设定,启动定时器并引入定时器通道..(4)引入定时处理事件,设置回调函数.类似于51的中断服务.callback 这个回调函数给我耳目一新的感觉,这个callback在matlab的GUI设计中经常用到,而且作用很大,这学期刚好在学习matlab这门课,matlab中的意思是当你引入触发时,执行回调函数. 所以当我回过头来看看,我们可以看到异曲同工之妙的效果.(5)中断使能,即允许中断,类似于51中的EA.(6)开始定时计数.
下面贴出我的主函数
/*------------------------------------------------------------------------- */
/* 实现目标:利用定时器的计时功能对LED1进行控制 */
/* 作者:小彬 */
/* 时间:2011年12月17日 */
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "DrvTIMER.h"
/*延时子程序----------------------------------------------------------------*/
/*延时时间:k mS(在12M的晶振频率下)--------------------------------------------*/
void delay_ms(uint32_t k)
{
uint32_t i,j;
for(i=k;i>0;i--)
for(j=2395;j>0;j--);
}
/*定时处理事件,每隔0.2S对LED1进行控制*/
void Timer0_Callback (void)
{
if (DrvGPIO_GetBit(E_GPA,2))
DrvGPIO_ClrBit(E_GPA,2);
else
DrvGPIO_SetBit(E_GPA,2);
}
/*---------------------------------------------------------------------------*/
/* 主程序 */
/*---------------------------------------------------------------------------*/
int main (void)
{
/*系统时钟设置*/
UNLOCKREG();
SYSCLK->PWRCON.XTL12M_EN = 1;
delay_ms(100);
LOCKREG();
/*对GPIO端口的设置*/
DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT); //LED1端口设置为输出
/*对定时器进行设置*/
DrvTIMER_Init(); //初始化定时器
DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,0); //设定TIMER0的时钟源为外部12MHZ
DrvTIMER_Open(E_TMR0,500,E_PERIODIC_MODE); //设定定时器timer0的tick周期,并且启动定时器:定时器通道 TMR0 每秒500次 周期模式
DrvTIMER_SetTimerEvent(E_TMR0,100,(TIMER_CALLBACK) Timer0_Callback,0); //安装一个定时处理事件到 timer0通道
DrvTIMER_EnableInt(E_TMR0); //使能定时器中断 //TIMER0->TCSR.IE = 1
DrvTIMER_Start(E_TMR0); //定时器timer0开始计数 //TIMER0->TCSR.CEN = 1;
while(1)
{
}
}
个人小结:通过这次学习,感受到了M0定时器的复杂性和强大,尤其是库函数,水很深.当然我们主要是对寄存器进行操作,于是开发上简化了操作.关于定时器的应用有好多,今天只学了一种方式的应用,仍然要努力深入学习...
最后附上压缩包
定时器的应用.rar
(885.92 KB)
|