嵌入式成长轨迹56 【Zigbee项目】【CC2430基础实验】【睡眠定时器的使用】
在小灯快速闪烁5 次后进入睡眠状态 PM2 ,在 PM2 下睡眠定时器 SLEEP TIMER(ST)仍然可以正常工作,从0x000000 到0xffffff 反复计数,当ST计数超过写入ST[2 -0] 的0x000f00 时,系统由中断唤醒,小灯闪烁 5 次后进入 PM2 ,这样周而复始的唤醒工作然后睡眠。系统睡眠的时间为8 分32 秒,这已经是最长睡眠时间。
ST2 (睡眠定时器2)
7:0 ST2[7:0] 睡眠定时器计数/ 比较值[23 -16]位。读出为ST计数值,写入为比较值。
读寄存器应先读ST0 ,写寄存器就后写ST0 。
ST1 (睡眠定时器1)
7:0 ST1[7:0] 0X00 R/W 睡眠定时器计数/ 比较值[15-8] 位。读出为 ST计
数值,写入为比较值。读寄存器应先读ST0 ,写 寄存器就后写ST0 。
ST0 (睡眠定时器0)
7:0 ST0[7:0] 0X00 R/W 睡眠定时器计数/ 比较值[7 -0] 位。读出为ST 计
数值,写入为比较值。读寄存器应先读ST0 ,写 寄存器就后写ST0 。
实验相关函数
写在程序中的子函数及功能列写如下:
void Init_SLEEP_TIMER(void);
函数原型:
1 void Init_SLEEP_TIMER(void) 2 { 3 ST2 = 0X00; 4 ST1 = 0X0f; 5 ST0 = 0X00; 6 7 EA = 1; // 开中断 8 STIE = 1; 9 STIF = 0; 10 }
函数功能:打开睡眠定时器SLEEP TIMER(ST)中断,设置ST 的中断发生时间为计数值达到0x000f00 时。
void LedGlint(void);
函数原型:
1 void LedGlint(void) 2 { 3 uchar jj=10; 4 while(jj--) 5 { 6 RLED = !RLED; 7 Delay(10000); 8 } 9 }
函数功能:让LED 闪烁5 次,无返回值。
void ST_ISR(void) ;
函数原型:
1 __interrupt void ST_ISR(void) 2 { 3 STIF = 0; 4 }
函数功能:睡眠定时器中断服务程序,清中断标志,无其他操作。
重要的宏定义
1 使模块上的可控制 2 #define LED_ENABLE(val) \ 3 do{ \ 4 if(val==1) \ 5 { \ 6 P1SEL &= ~0X03; \ 7 P1DIR |= 0X03; \ 8 RLED = 1; \ 9 GLED = 1; \ 10 } \ 11 else \ 12 { \ 13 P1DIR &= ~0X03; \ 14 } \ 15 }while(0) 16 17 #define RLED P1_0 18 #define GLED P1_1
选择系统工作时钟源并关闭不用的时钟源
1 #define SET_MAIN_CLO CK_SOURCE(source) \ 2 do { \ 3 if(source) { \ 4 CLKCON |= 0x40; /*RC*/ \ 5 while(!(SLEEP&0X20)); /* 待稳*/ \ 6 SLEEP |= 0x04; /* 关掉不用的*/ \ 7 } \ 8 else { \ 9 SLEEP &= ~0x04; /*全开*/ \ 10 while(!(SLEEP&0X40));/* 待稳*/ \ 11 asm("NOP"); \ 12 CLKCON &= ~0x47; /* 晶振*/ \ 13 SLEEP |= 0x04; /* 关掉不用的*/ \ 14 } \ 15 }while (0) 16 17 #define CRYSTAL 0 18 #define RC 1
选择系统低速时钟源
1 #define SET_LOW_CLOCK(source) \ 2 do{ \ 3 (source==RC)?(CLKCON |= 0X80):(CLKCON &= ~0X80); \ 4 }while(0)