原创 CCxx10睡眠定时器的使用(含代码)

2009-3-20 10:49 3743 6 8 分类: MCU/ 嵌入式

2430 SleepTimer的使用在前面已经说过,而xx10的ST却与2430的不太一样,xx10的ST可以复位,但不可以赋值,有点和WDT相似。最长定时器大约是17-18小时,同样可以在PM2小使用。所以对于CCxx10来说也是一个常用的外设之一,现在来共享代码了~~,用得到的顶一下。谢谢。


/******************************************************************************
******************************************************************************
在使用本文件请定义以下数据类型:
typedef enum TimeUnit{MILLISECOND,SECOND,MINUTE,HOUR} TimeUnit_def;
声明以下函数:
extern void halInitSleepTimer(void);
extern BYTE setSleepTimerPeriod(WORD time,TimeUnit_def uint);
extern void halResetSleepTimerAndEnterPM2(void);
******************************************************************************/


/**********************************头文件**************************************/
#include "hal.h"


#ifndef SLEEPTIMER_ENABLE
#define SLEEPTIMER_ENABLE TRUE
typedef enum TimeUnit{MILLISECOND,SECOND,MINUTE,HOUR} TimeUnit_def;
#endif


//-----------------------------------------------------------------------------
//功能: 用来初始化睡眠定时器
//       启用了全局中断,并打开了ST的中断
//输入:无
//输出:无
//说明:在使用ST唤醒系统时,请先调用本函数
//-----------------------------------------------------------------------------
void halInitSleepTimer(void)
{
  //SET_MAIN_CLOCK_SOURCE(CRYSTAL);//设主时钟为晶振,可不设
  INT_GLOBAL_ENABLE(INT_OFF);      //关中断
  SLEEP_TIMER_INIT();
  INT_SETFLAG(INUM_ST,INT_CLR);


  INT_ENABLE(INUM_ST,INT_ON);
  SLEEP_TIMER_ENABLE_EVENT0_INT(INT_ON);
  INT_GLOBAL_ENABLE(INT_ON);
}



//-----------------------------------------------------------------------------
//功能:设置睡眠定时器的唤醒时间
//输入:time,时间   uint,单位
//输出:设置的状态,0代表成功,其他数代表失败
//说明:使用低速RC时,最长可以定时17.2H,最小11.08MS (Tmin = 750/Fref * 384)
//      使用低速晶振时,最长可以定时18.2小时,最小11.72MS
//      调用本函数之前必须先调用halInitSleepTimer()。
//-----------------------------------------------------------------------------
BYTE setSleepTimerPeriod(WORD time,TimeUnit_def uint)
{
  UINT32 temp = 0;
  BYTE wor_res = 0;
  float temp2;
  if( (uint == MILLISECOND) && (time < 12) )return 3;//3代表设置时间过短


  if(CLKCON & 0x80)                                  //使用RC
  {
    if( (uint == HOUR) && (time > 17) )return 2;     //2代表设置的时间过长
    temp2 = time * 104000 / 3;                       //  104,000/3 = 26,000,000/750
  }
  else
  {
    if( (uint == HOUR) && (time > 18) )return 2;     //2代表设置的时间过长
    temp2 = time * 32768;
  }
  if(uint == MILLISECOND)
  {
    temp2 /= 1000;
  }
  else
  {
    while(uint > SECOND)                             //将时,分为单位的数划为秒
    {
      temp2 *= 60;
      uint --;
    }
  }
  temp = (UINT32)temp2;
  while(temp > 0xffff)
  {
    temp >>= 5;
    wor_res ++;
  }


  WORCTL &= ~0X03;
  WOREVT1 = (BYTE)((WORD)temp>>8);
  WOREVT0 = (BYTE)((WORD)temp);
  WORCTL |= wor_res;


  return 0;                                           //设置成功 返回0
}


//-----------------------------------------------------------------------------
//功能:复位ST后进入PM2
//输入:无
//输出:无
//说明:复位ST后,必须等待两个时钟沿
//-----------------------------------------------------------------------------
void halResetSleepTimerAndEnterPM2(void)
{
  BYTE temp;
  SLEEP_TIMER_RESET();
  WORIRQ &= ~0X01;
  temp = WORTIME0;
  while(temp == WORTIME0);
  temp = WORTIME0;
  while(temp == WORTIME0);                            //等待两上时钟沿
  INT_SETFLAG(INUM_ST,INT_CLR);
  SET_POWER_MODE(POWER_MODE_2);
}


典型用法


//----------------------------------------------------------------------
main()
{
  halInitSleepTimer();
  while(1)
  {
    setSleepTimerPeriod(5,SECOND);
    halResetSleepTimerAndEnterPM2();
    //user code 
  }
}


#pragma vector="ST"_VECTOR
__interrupt void ST_IRQ(void){
  INT_SETFLAG(INUM_ST,INT_CLR);
  WORIRQ &= ~0X01;
}


 


2009年3月20日 修改

文章评论2条评论)

登录后参与讨论

zigbee_904218839 2009-3-6 18:49

是这样的,调用的一般格式是: setSleepTimerPeriod(time,uint);//函数2 halResetSleepTimerAndEnterPM2();//函数3 两个函数通常成对出现,我把和分开写是因为ST也可作为普通TIMER来使用,所以没有将设置时间写的halResetSleepTimerAndEnterPM2()里.

用户1284481 2009-3-5 17:21

emot, 你这个ST是怎么个工作方式?以上三个函数我的理解是:先调用halInitSleepTimer(),然后调用setSleepTimerPeriod()来设置ST的时间,最后用halResetSleepTimerAndEnterPM2()来进入PM2模式,是不是这样的? 我在我以前的项目中是先InitST(),然后setSTtime(),最后PM2()。在ST的INT_VECT中重新setSTtime(),在PM2()。
相关推荐阅读
emot 2016-06-29 23:39
想在网上直播来讲讲zigbee,大家怎么看
近来发现zigbee热度不减,不才想把所了解的zigbee都跟大家分享,大致按照这个来做。请大家提些建议,是不是还有特别重要但我遗漏的。先来攒些人,人够了我们就开。 --------------...
emot 2015-09-24 07:06
BLE 空中升级谈(二)
BLE 空中升级谈   -- CC2541 的产品开发中OAD注意事项(续)   TI CC2541支持多个硬件,多个软件对它进行空中升级,可以有不同的组合,硬件有    ...
emot 2015-09-24 07:01
BLE 空中升级谈
BLE 空中升级谈   -- CC2541 的产品开发中OAD注意事项     现在的智能设备(可穿戴,智能家居,智能玩具等)是越来越多了,大公司的产品颜值高,功能强大而完备的应该说是比比皆是,这里...
emot 2015-05-19 10:27
寻找共事的朋友[深圳科技园 嵌入式软件 可穿戴]
岗位职责:嵌入式软件工程师 招聘人数:2 简历语言要求:中文 语言能力:英语 掌握程度:熟练 工作地点:深圳南山科技园 工作待遇:面谈   工作职责: 1. 与硬件工程师合作完...
emot 2014-05-06 08:41
CC2530的通信速率实测
首先要说的是这里的测试包括了zigbee与非zigbee两种情况,测试zigbee的通信速率建议使用TI协议栈ZSTACK-2.5.1A(swrc126.zip)中的TransmitApp来进行测...
emot 2014-01-17 18:08
XBee与 RBee ZigBee透明传输模块互传测试
XBee与 RBee ZigBee透明传输模块互传测试   本次测试的目标是为了初步探索ZigBee透明传输模块的传输速率峰值范围,同时也要检查不同公司模块之间的兼容性。测试的目标是 由美国Digi提...
我要评论
2
6
关闭 站长推荐上一条 /2 下一条