⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 power.c

📁 ZIGBEE 2006协议栈 BAT测试代码 RADIO PULSE MG2455
💻 C
字号:


/*******************************************************************************
	- Chip		: MG24500/55
	- Author		: RadioPulse Inc, 2007.
	- Date		: 2007-07-02
	- Version		: VER 1.0	
*******************************************************************************/

#include "INCLUDE_TOP.h"

#include "C_HAL/PHY.h"
#include "C_HAL/WDT.h"
#include "C_HAL/UART.h"

	#define	PLL_LOCK_EXPIRE_COUNTER	0x0200
	
void ZHAL_PWRMNGT_SET(UINT8 RF_PowerOff) 
{
	UINT16	ExpireCounter;

	if(RF_PowerOff) 
	{	
		xRXRFPU	= 0xFF;
		xTXRFPU	= 0xFF;
		xPLLPU	= 0xFF;
		xBIASPU	= 0xFF;
		
		xRXRFPD	= 0x00;
		xTXRFPD	= 0x00;
		xPLLPD	= 0x00;
		xBIASPD	= 0x00;		

		// Disable Unused Clock
		xCLKON0 &= ~(1<<2);		// bit[2]=0
		xCLKON1 = 0x00;			// bit[7:0]=0
		xDCCCON &= ~(0x01);  	// bit[0]=0

		xPLLADFC &= ~(1<<6);		// bit[6]=0, AFC Disable
	}
	else 
	{
		// Enable Used Clock
		xCLKON0 |= (1<<2);		// bit[2]=1
		xCLKON1 = 0x7B;			// bit[7:0]=0x7B
		xDCCCON |= (0x01);  		// bit[0]=1
		
		xBIASPD	= 0xFF;
		xBIASPU	= 0x00;
		xPLLPD	= 0xFF;	
		xRXRFPD	= 0x00;
		xTXRFPD	= 0x00;
		xPLLPU	= 0x00;	
		xPLLADFC=0xEF;		

		// Wait for PLL-Locking
		xPLLLD |= 0x80;
		ExpireCounter = PLL_LOCK_EXPIRE_COUNTER;
		while(1)
		{
			if(xPLLLD & 0x40)	break;
			ExpireCounter--;
			if(ExpireCounter == 0)
			{
				xPLLADFC = 0xEF;
				ExpireCounter = PLL_LOCK_EXPIRE_COUNTER;
			}
		}
		xRXRFPD= 0xFF;
		xTXRFPD	= 0xFF;
	}	

}




// Wakeup Source : UART0, UART1, RF, VOICE, RTC Interrupt
void ZHAL_IDLE_MODE()
{
	UINT8	_IE;
	UINT8	_EIE;

	ZSYS_WDT_SET(0);

	ZHAL_PWRMNGT_SET(1);

	_IE = IE;
	_EIE = EIE;
	
	EIE = 0xFF;
	IE = 0xFF;	

	P0OEN |= ( 1 << 2);
	P0OEN |= ( 1 << 3);

	PCON = 0x01;
	_nop_();_nop_();

	ZHAL_PWRMNGT_SET(0);
	
	EA = 0;
	EIE = _EIE;
	IE = _IE;	
}


//--	TimeoutTick30us	: 0x0 ~ 0x007FFFFF

//--	IntLevel
//	bit[0]	: EXT0_INT Wakeup Edge. 0=Rising Edge. 1=Falling Edge 
//	bit[1]	: EXT1_INT Wakeup Edge. 0=Rising Edge. 1=Falling Edge

//--	WakeIntSrc
//	bit[0]	: EXT0_INT
//	bit[1]	: EXT1_INT
//	bit[7]	: RTC Interrupt

//--	Mode
//	0	: OSCBUFF=ON	DVREG=ON	SleepTimer=ON
//	1	: OSCBUFF=OFF	DVREG=ON	SleepTimer=ON
//	2	: OSCBUFF=OFF	DVREG=OFF	SleepTimer=ON
//	3	: OSCBUFF=OFF	DVREG=OFF	SleepTimer=OFF
void ZHAL_PD_SET(UINT32 TimeoutTick30us, UINT8 IntLevel, UINT8 WakeIntSrc, UINT8 Mode)
{
	UINT8	INT_LVL;

	UINT8	_IE;
	UINT8	_EIE;
	UINT8	_TCON;
	UINT8	_EIP;

	_EIP = EIP;
	_IE = IE;
	_EIE = EIE;
	_TCON = TCON;

	EIP = 0;
	EIE = 0;
	IE = 0x80;		// EA=1

	xRTINT0 = (UINT8) TimeoutTick30us;	TimeoutTick30us >>= 8;
	xRTINT1 = (UINT8) TimeoutTick30us;	TimeoutTick30us >>= 8;
	xRTCON = (UINT8) (TimeoutTick30us & 0x7F);	
		
//	xRTDLY = 0x20;		// RTC Delay time is used for stabilizing System Clock
	xRTCON |= 0x80;		// OSCOK signal is used for stabilizing System Clock

	if(Mode == 1)		xPDCON = 0x98;		// Mode1. Analog Voltage Regulator is ON.
	else if(Mode == 2)	xPDCON = 0x18;		// Mode2. Analog Voltage Regulator is OFF.
	else if(Mode == 3)	xPDCON = 0x00;		// Mode3. Sleep Timer is OFF.
	else					return;				// Mode0

	xPDCON |= (Mode & 0x03);		// PowerDown Mode=1, 2, 3

	xPDM &= ~(0x03<<4);			// clear bit[5:4]
	INT_LVL = (IntLevel & 0x03) << 4;
	xPDM |= INT_LVL;

	RTCIP = 1;
	if(WakeIntSrc & 0x01)	ZHAL_EXT0_INT_SET(1, 1, 0);
	if(WakeIntSrc & 0x02)	ZHAL_EXT1_INT_SET(1, 1, 0);
	if(WakeIntSrc & 0x80)	RTCIE = 1;

	xPDM |= 0x01;
	PCON = 0x02;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		
	EA = 0;
	
	TCON = _TCON;
	EIE = _EIE;
	IE = _IE;	
	EIP = _EIP;

	xPDCON |= 0x04;		// by YJH. DBODEN(Brown Out Detector is enabled)

}


//--	TimeoutSecond	: 0x0000 ~ 0x00FF
//--	Mode
//	0	: OSCBUFF=ON	DVREG=ON	SleepTimer=ON
//	1	: OSCBUFF=OFF	DVREG=ON	SleepTimer=ON
//	2	: OSCBUFF=OFF	DVREG=OFF	SleepTimer=ON
//	3	: OSCBUFF=OFF	DVREG=OFF	SleepTimer=OFF
void ZSYS_PowerDown(UINT16 TimeoutSecond, UINT8 Mode)
{	
	UINT8	_P0OEN;
	UINT8	_P1OEN;
	UINT8	_P3OEN;
	UINT8	_P0REN;
	UINT8	_P1REN;
	UINT8	_P3REN;
	UINT8	_CLKON0;
	UINT8	_SADCCON;
	
	UINT32	TimeoutTick30us;

	TimeoutTick30us = TimeoutSecond * 32768;

	// RC Calibration 
	xPDCON |= 0x08;			// <== RC Oscillation Enable
	xRCOSC1 |= 0x80;		// <== RCCEN enable

	// AES BLOCK OFF
	_CLKON0 = xCLKON0;
	xCLKON0 &= ~(1<<4);		// bit[4]=0, AESCLK=0
	
	ZHAL_PWRMNGT_SET(1);

	// SDAC OFF
	_SADCCON = xSADCCON;
	xSADCCON = 0x00;		// bit[7:0] = 0

	 // GPIOs Input : Pull-Up
	_P0OEN = P0OEN;	_P1OEN = P1OEN;	_P3OEN = P3OEN;
	_P0REN = P0REN;	_P1REN = P1REN;	_P3REN = P3REN;	 
 	P0OEN = 0xFF;	P1OEN = 0xFF; 	P3OEN = 0xFF;
 	P0REN =0x00;	P1REN =0x00;	P3REN =0x00	;
	
	while(ZSYS_UART0_TX_WORKING());
	while(ZSYS_UART1_TX_WORKING());	
	while(1) if(xU0_IIR & 0x01) break;	// IF 1, PENDING INTERRUPT
	while(1) if(xU1_IIR & 0x01) break;

	ZHAL_PD_SET(TimeoutTick30us, 0x00, 0xFF, Mode);
	
	ZHAL_PWRMNGT_SET(0);

	// RESTONE : AES BLOCK
	xCLKON0 = _CLKON0;

	// RESTORE : SADC
	xSADCCON = _SADCCON;

	// RESTORE : GPIOs
	P0OEN = _P0OEN;	P1OEN = _P1OEN;	P3OEN = _P3OEN;
	P0REN = _P0REN;	P1REN = _P1REN;	P3REN = _P3REN;
	
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -