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