電源管理代碼


#include "ioCC2530.h"
#define LED1 P1_0
#define LED2 P1_1
#define LED3 P1_3
#define LED4 P1_4
#define SW P1_2
/********************定義數(shù)據(jù)類型***************************/
#define uchar unsigned char? ? ? ? ? ? ? ? ? ??
#define uint16 unsigned short int? ? ? ? ? ? ?//占用1個(gè)字節(jié)
#define uint32 unsigned long int? ? ? ? ? ? ? //占用2個(gè)字節(jié)
/*****************參數(shù)類型定義(枚舉型)********************/
enum SYSCLK_SRC{RC_16M,XOSC_32M};? ? ? ? ? ? ?//系統(tǒng)時(shí)鐘源參數(shù)
enum POWER_MODE{PM_IDLE,PM_1,PM_2,PM_3};? ? ? //系統(tǒng)電源管理模式參數(shù)
/********************************************
函數(shù)名稱:System_Init()
函數(shù)功能:系統(tǒng)初始化(IO、LED、外部中斷)
入口參數(shù):無(wú)
出口參數(shù):無(wú)
返 回 值:無(wú)
********************************************/
void System_Init()
{
? P1SEL = 0x00;? ? // (P1SEL &= ~0x1F)
? P1DIR |= 0x1B;? ?//? 0入1出
? LED1 = 0;
? LED2 = 0;
? LED3 = 0;
? LED4 = 0;
? PICTL &= ~0x02;? ? //配置P1_2為上升沿觸發(fā)中斷
? P1IFG &= ~0x04;? ? //清除P1_2為中斷標(biāo)識(shí)
? P1IF = 0;? ? ? ? ? //清除P1中斷標(biāo)識(shí)
}
/********************************************
函數(shù)名稱:ClockSourceSelcet()
功? ? 能:系統(tǒng)時(shí)鐘選擇
入口參數(shù):時(shí)鐘選擇(Source:XOSC_32M 或 RC_16M)
出口參數(shù):無(wú)
返 回 值:無(wú)
********************************************/
void SystemClockSourceSelcet(enum SYSCLK_SRC Source)
{
? uchar CLKconcmd;? ? ? ? ? ? ? ? ? ? //用于讀取晶振配置值
? uchar CLKconsta;? ? ? ? ? ? ? ? ? ? //用于讀取晶振實(shí)時(shí)振動(dòng)值
? if(Source == XOSC_32M)? ? ? ? ? ? ? //傳遞過(guò)來(lái)的是32M
? {
? ? CLKCONCMD &= 0x80;
? }
? else if(Source == RC_16M)? ? ? ? ? ?//傳遞過(guò)來(lái)的是16M
? {
? ? CLKCONCMD &= 0x80;
? ? CLKCONCMD |= 0x49;
? }
? CLKconcmd = CLKCONCMD;? ? ? ? ? ? ? //讀取晶振配置值
? do
? {
? ? CLKconsta = CLKCONSTA;? ? ? ? ? ? //讀取實(shí)時(shí)振動(dòng)值
? }while(CLKconsta != CLKconcmd);? ? ?//判斷晶振實(shí)時(shí)振動(dòng)值是否達(dá)到配置值(等待時(shí)鐘配置)
}
/********************************************
函數(shù)名稱:delay()
功? ? 能:軟件延時(shí)
入口參數(shù):time--延時(shí)循環(huán)執(zhí)行次數(shù)
出口參數(shù):無(wú)
返 回 值:無(wú)
********************************************/
void delay(unsigned int time)
{?
? ? short int i;
? ? uchar j;
? ? for(i = 0; i < time; i++)
? ? {? for(j = 0; j < 240; j++)
? ? ? ? {? ?asm("NOP");? ? // asm是內(nèi)嵌匯編,nop是空操作,執(zhí)行一個(gè)指令周期
? ? ? ? ? ? asm("NOP");
? ? ? ? ? ? asm("NOP");
? ? ? ? ?}??
? ? ?}??
}
/********************************************
函數(shù)名稱:LED_Blink()
功? ? 能:根據(jù)需要閃爍的LEDx(LED1、LED2、LED3、LED4),進(jìn)行對(duì)應(yīng)控制
入口參數(shù):LED1、LED2、LED3、LED4
出口參數(shù):無(wú)
返 回 值:無(wú)
********************************************/
void LED_Blink(uchar LEDx)
{
? uchar i;
? switch(LEDx)
? {
? case 1:
? ? for(i=0;i<5;i++)
? ? {
? ? ? LED1 = 1;
? ? ? delay(2000);
? ? ? LED1 = 0;
? ? ? delay(2000);
? ? }
? ? break;
? case 2:
? ? for(i=0;i<5;i++)
? ? {
? ? ? LED2 = 1;
? ? ? delay(2000);
? ? ? LED2 = 0;
? ? ? delay(2000);
? ? }
? ? break;
? case 3:
? ? for(i=0;i<5;i++)
? ? {
? ? ? LED3 = 1;
? ? ? delay(2000);
? ? ? LED3 = 0;
? ? ? delay(2000);
? ? }
? ? break;
? case 4:
? ? for(i=0;i<5;i++)
? ? {
? ? ? LED4 = 1;
? ? ? delay(2000);
? ? ? LED4 = 0;
? ? ? delay(2000);
? ? }
? ? break;
? }
}
/********************************************
函數(shù)名稱:POWER_MODE_Set()
功? ? 能:配置電源管理工作模式
入口參數(shù):四種工作模式:PM_IDLE、PM_1、PM_2、PM_3
出口參數(shù):無(wú)
返 回 值:無(wú)
********************************************/
void POWER_MODE_Set(enum POWER_MODE PM)
{
? if(PM == PM_IDLE)? ? ? ? ?//空閑模式
? {
? ? SLEEPCMD &= ~0x03;
? }
? else if(PM == PM_1)? ? ? ?//模式1
? {
? ? SLEEPCMD &= ~0x20;
? }
? else if(PM == PM_2)? ? ? ?//模式2
? {
? ? SLEEPCMD &= ~0x01;
? }
? else if(PM == PM_3)? ? ? ?//模式3
? {
? ? SLEEPCMD &= ~0x00;
? }
? PCON |= 0x01;? ? ? //模式配置完畢,強(qiáng)制進(jìn)入所選電源管理模式
}
/********************************************
函數(shù)名稱:SLEEP_Timer_Set()
功? ? 能:配置睡眠定時(shí)器
入口參數(shù):定時(shí)時(shí)間值
出口參數(shù):無(wú)
返 回 值:無(wú)
********************************************/
void SLEEP_Timer_Set(uint16 sec)
{
? uint32 sleeptime = 0;
? sleeptime |= (uint32)ST0;? ? ? ? //取出ST寄存器系列中ST0的值(低8位)
? sleeptime |= (uint32)ST1 << 8;? ?//取出ST系列寄存器中ST1的值(中8位)
? sleeptime |= (uint32)ST2 << 16;? //取出ST系列寄存器中ST2的值(高8位)
? /*************以上程序,即為讀取睡眠定時(shí)器當(dāng)前實(shí)時(shí)值 ST0、ST1、ST2至sleeptime**********/
??
? /*************以下程序,即為計(jì)算下一次需要喚醒的時(shí)間值 = 上述所讀取的值 + sec值*********************/
? sleeptime = sleeptime +(uint32)sec * (uint32)32753;? //定時(shí)器比較值
? while((STLOAD & 0x01) == 0);? ? ?//等待到該為允許被導(dǎo)入
??
? /*********以下程序,即為定時(shí)器比較值被配置**********/
? ST0 = (uchar)sleeptime;? ? ? ? ? ? //將32位的sleeptime,只保留最低8位
? ST1 = (uchar)(sleeptime >> 8);? ? ?//將32位的sleeptime,只保留最中8位
? ST2 = (uchar)(sleeptime >> 16);? ? //將32位的sleeptime,只保留最高8位
}
/********************************************
函數(shù)名稱:SLEEP_ISR()
功? ? 能:睡眠定時(shí)器中斷服務(wù)函數(shù)
入口參數(shù):無(wú)
出口參數(shù):無(wú)
返 回 值:無(wú)
********************************************/
#pragma vector = ST_VECTOR
__interrupt void SLEEP_ISR()
{
? EA = 0;
? STIF = 0;? ? //清除睡眠定時(shí)器中斷標(biāo)識(shí)
? STIE = 0;? ? //禁止睡眠定時(shí)器進(jìn)入中斷
? EA = 1;
}
/********************************************
函數(shù)名稱:P1_EINT_ISR()
功? ? 能:睡眠外部中斷服務(wù)函數(shù)
入口參數(shù):無(wú)
出口參數(shù):無(wú)
返 回 值:無(wú)
********************************************/
#pragma vector = P1INT_VECTOR
__interrupt void P1_EINT_ISR()
{
? EA = 0;
? if(P1IFG & 0x04)? ? ? //判斷是否是P1.2中斷來(lái)
? {
? ? if(SW == 0)? ? ? ? ?//判斷按鈕(SW)是否按下(低電平有效)
? ? {
? ? ? delay(100);? ? ? ?//延遲消抖
? ? ? while(SW == 0);
? ? ? P1IFG &= ~0x04;? ?//清楚P1.2外部中斷標(biāo)識(shí)
? ? ? P1IF = 0;? ? ? ? ?//清楚P1端口組中斷標(biāo)識(shí)
? ? }
? }
? EA = 1;
}
/********************************************
函數(shù)名稱:IRClear()
功? ? 能:睡眠定時(shí)器中斷標(biāo)識(shí)清楚
入口參數(shù):無(wú)
出口參數(shù):無(wú)
返 回 值:無(wú)
********************************************/
void IRClear()
{
? IRCON &= ~0x80;
? IEN0 |= (0x01 << 5);
}
/********************************************
函數(shù)名稱:main()
功? ? 能:程序主函數(shù)
入口參數(shù):無(wú)
出口參數(shù):無(wú)
返 回 值:無(wú)
********************************************/
void main()
{
? SystemClockSourceSelcet(XOSC_32M);? ?//設(shè)置時(shí)鐘頻率
? System_Init();? ? ? ? ? ?//系統(tǒng)初始化(IO、LED、外部中斷)
? while(1)
? {
? ? /*************************設(shè)置空閑模式*************************/
? ? LED_Blink(1);
? ? SLEEP_Timer_Set(2);? ? ? //設(shè)置睡眠定時(shí)器時(shí)間間隔2s
? ? IRClear();
? ? POWER_MODE_Set(PM_IDLE);? ? ? //設(shè)置電源管理進(jìn)入空閑模式
? ? /*************************PM_1模式設(shè)置*************************/
? ? LED_Blink(2);
? ? SLEEP_Timer_Set(3);? ? ? //設(shè)置睡眠定時(shí)器時(shí)間間隔3s
? ? IRClear();
? ? POWER_MODE_Set(PM_1);? ? ? //設(shè)置電源管理進(jìn)入空閑模式
? ? /*************************PM_2模式設(shè)置*************************/
? ? LED_Blink(3);
? ? SLEEP_Timer_Set(4);? ? ? //設(shè)置睡眠定時(shí)器時(shí)間間隔4s
? ? IRClear();
? ? POWER_MODE_Set(PM_2);? ? ? //設(shè)置電源管理進(jìn)入空閑模式
? ? /*************************PM_3模式設(shè)置*************************/
? ? LED_Blink(4);
? ? POWER_MODE_Set(PM_2);? ? ? //設(shè)置電源管理進(jìn)入空閑模式
? ? P1IEN |= 0x04;? ? ? ? ? ? ?//使能P1.2中斷功能
? ? IEN2|= 0x10;? ? ? ? ? ? ? ?//使能P1端口組中斷
? ? POWER_MODE_Set(PM_2);? ? ? //設(shè)置電源管理進(jìn)入空閑模式
? }
}

