Board logo

标题: [推荐]睡眠定时器的使用 [打印本页]

作者: fengjiangpx    时间: 2009-2-25 17:38     标题: [推荐]睡眠定时器的使用

/*****************************************************************************
在使用本文件请定义以下数据类型:
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);
}


MCS51系统扩展技术1
http://bbs.huazhoucn.com/Temp/Temp3484_1.html
MCS51系统扩展技术2
http://bbs.huazhoucn.com/Temp/Temp3485_1.html
MCS51系统扩展技术3
http://bbs.huazhoucn.com/Temp/Temp3486_1.html
MCS51单片机系统扩展技术4
http://bbs.huazhoucn.com/Temp/Temp3487_1.html
MCS51单片机系统扩展技术5
http://bbs.huazhoucn.com/Temp/Temp3488_1.html






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0