嵌入式成长轨迹56 【Zigbee项目】【CC2430基础实验】【睡眠定时器的使用】

本文介绍了一个基于特定硬件平台的系统设计案例,该系统通过配置睡眠定时器(SLEEPTIMER, ST),实现了在PM2模式下的周期性唤醒与睡眠。系统在进入PM2模式前,会通过快速闪烁小灯五次来提示用户,之后每隔8分32秒自动唤醒一次,并重复这一过程。文章详细说明了实现这一功能的相关寄存器配置、函数定义及其作用。

 

在小灯快速闪烁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/archive/2012/09/01/2666945.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值