专栏中心

EEPW首页 > 专栏 > CCxx10睡眠定时器的使用(含代码)

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

发布人:0750long 时间:2009-07-15 来源:工程师 发布文章
CCxx10睡眠定时器的使用(含代码)

 

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;
}

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

MSP430 电表解决方案

视频 2009-10-16

三星1d DRAM良率问题或拖慢HBM5E量产计划

龙头企业集结2026武汉光博会,多项“首发首展”产品即将揭幕

2026-04-23

超低功率高性能新一代产品MSP430F5xx

视频 2009-10-16

专为客户设计的高性能器件系列

视频 2009-10-16

800V AI算力时代,GaN从“备选”变“刚需”?

智能计算 2026-04-23

低功耗射频器件- CC1111

视频 2009-10-16

MSP430 医疗产品应用

视频 2009-10-16

2026蓝牙亚洲大会暨展览在深启幕

维智捷发布中国愿景:深耕中国引领全球,开启多维增长新蓝图

汽车电子 2026-04-23

Bourns 扩展 SSA-2 系列模拟电流传感器,新增符合 AEC-Q 标准的组装选项

1864亿!SK海力士达营业利润率高达72%,碾压台积电

2026-04-23

德国电信拟全面合并T-Mobile,或成史上最大并购案

曝iPhone 18标准版屏幕降级

2026-04-23

AVR下载头PCB

资源下载 2007-02-09

BlazeRouter教程

资源下载 2007-02-09

Meta正在员工电脑上部署追踪工具

2026-04-23
更多 培训课堂
更多 焦点
更多 视频

技术专区