本帖最后由 liaoyuanhong 于 2015-9-26 02:15 编辑
大家晚上好,首选,祝大中秋节快乐。
上次我学习了LED的点亮,那么,今天我们来学什么呢。个人觉得定时器是很重要的,它可以做为一个定时的时基,也可以设定时间在低功耗中唤醒CPU,还有PWM输出等等,所以学习定时器还是很重要的。
定时器, 我就先从最基本的学起吧。我们用定时器中断做一个1S的闪LED灯程序。所以我们要用到的功能就是作为间隔定时器了。看下图:
作为间隔定时器输出。首先我们应该先选择定时器的时钟(CK00,CK01),设定好定时器的周期(TDR0N),开启中断,然后打开定时器,软件触发一个中断进行计时了。
从规格书上,我们也看到了,定时器设置的例子。
从上面,可以看出,定时器寄存器的设定了。我们写定时器的初始化函数。
TAU0EN = 1; /* Supplies input clock */ TPS0 =0x05; /* CK00, fMCLK = fCLK/(2^5) = 625kHz */ TMR00H =0; /* TPS0 setting available, only software trigger */ TMR00L =0; /*Falling edge, Interval timer mode */ TDR00H =0xf4; /*Interval time = (0xf423+1)/625kHz = 100ms */ TDR00L = 0x23; TMIF00 =0; /*Clears INTTM00 and INTTM01 interrupt flag */ TMMK00 =0; /*Enables INTTM01 interrupt */ TMPR100 =1; /*Sets INTTM01 low priority */ TMPR000 = 1; TS0 |= 0x01; /* Starts TAU00 */
然后我们在头文件上面添加中断入口地址:
#pragma interrupt INTTM00 TAU0_Channel0_Interrupt
编写中断函数:
void TAU0_Channel0_Interrupt(void) { TMIF00=0; /*Clears INTTM00 and INTTM01 interrupt flag */ dat++; }
//初始化GPIO
void PORT_Init(void) { PM0 = 0XFD; /*Set the output*/ PU0 = 0X02; /*On the pull*/ P0 = 0X00; /* output 0 */ POM0 = 0X00; /*Usually the output of the model*/ }
//MAIN数据
void main(void) { System_Init(); /* Initializes some function moudle */ while(1) { if(dat == 10 ) { //P0 ^= (1 << 1); dat = 11; P0 = 0x00; dar = 0; } if(dar ==10 ) { //P0 ^= (1 << 1); dar = 11; P0 = 0xff; dat = 0; } } } 这样,定时器就可以工作了。
|