日志档案

发表于 2008-5-21 16:32:27

3

标签: 2430  sleep  timer  

CC2430睡眠定时器实现唤醒


CC2430的睡眠定时器(SLEEP TIMER)是一个24位的计数器,可以用来作为唤醒中断(仅PM0-2)下面有效,ST的计数时钟是32.768K,向上计数,可以和一个24数比较以产生中断,在PM2仍然工作,可以产生中断和触发DMA。
这里只讲如何设置进入低功耗模式后的唤醒时间,ST0,ST1,ST2可读可写,但是我觉得这3个寄存器类似于串口的BUFFER,实际上是两个寄存器。因此就计数来说,ST(指ST0,ST1,ST2 下同)是不可写的,我这里把它称为STa,对于设置比较数来说,ST是不可读的,我把它称为STb。这样的话相实现定时唤醒就要利用STb和STa的数差,相差32768,就表示1秒唤醒一次,相差n*32768表示n秒唤醒一次,这里的n可以是小数。下面是实现唤醒的代码:

void Set_ST_Period(UINT16 sec)
{
   UINT32 sleepTimer = 0;

   sleepTimer |= ST0;
   sleepTimer |= (UINT32)ST1 <<  8;
   sleepTimer |= (UINT32)ST2 << 16;

   sleepTimer += ((UINT32)sec * (UINT32)32768);

   ST2 = (UINT8)(sleepTimer >> 16);
   ST1 = (UINT8)(sleepTimer >> 8);
   ST0 = (UINT8) sleepTimer;
}

void main(void)
{
 OPEN_ST_INT() ;//开中断
 while(1)
 {
   Set_ST_Period(10);//10sec 一次唤醒
   SET_POWER_MODE(PM2);//进入低功耗模式
 }

}

系统分类: 单片机   |   用户分类: 单片机   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(466)    回复(4)  

投一票您将和博主都有获奖机会!

  • hxqhit

    2008-5-27 21:49:52

    请问: 我想使节点加入网络后一直处于睡眠模式,然后定时唤醒来采集数据 因而能否可以使节点一直工作在 PM1/2模式下,然后用SLOW_TIMER 来唤醒从而切换到PM0模式下的呢? 我调试了但是,一直不好使啊 void SleepMode() { SET_POWER_MODE(POWER_MODE_1); P1_1 = ~P1_1; while(!XOSC_STABLE); asm("NOP"); }

  • emot

    2008-5-28 8:37:42

    不好使的意思是程序不能唤醒,还是唤醒的时间不对?看你的代码没有设置唤醒时间,那样的话,如果你启用ST并且打开中断,则是8分32秒唤醒一次。

  • yuexianhanshu

    2008-8-18 11:10:24

    简单点说,如果要休眠5分钟, 写入 ST0,ST1,ST2的值 = 5分钟 + ST0 ,ST1,ST2当前的值 在cc2430复位以后ST0,ST1,ST2,就立即开始计数了,并不是我们写ST0,ST1,ST2的时候开始计数

  • yuexianhanshu

    2008-8-18 11:11:00

    简单点说,如果要休眠5分钟, 写入 ST0,ST1,ST2的值 = 5分钟 + ST0 ,ST1,ST2当前的值 在cc2430复位以后ST0,ST1,ST2,就立即开始计数了,并不是我们写ST0,ST1,ST2的时候开始计数