📄 power.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 + -