嵌入式成长轨迹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) 
原文地址:https://www.cnblogs.com/zeedmood/p/2666945.html