📄 power.c
字号:
/****************************************************************
* ARMSYS S3C44B0X POWER TEST *
****************************************************************
1.2005.4.30:: CHANGE PLL TEST
2.2005.5.5:: POWER SLOW MODE TEST
3.2005.5.5:: POWER HOLD MODE TEST
***************************************************************/
#include <math.h>
#include "..\target\44b.h"
#include "..\target\44blib.h"
#include "..\target\def.h"
#include "..\inc\power.h"
#include "..\inc\rtc.h"
#define FIN 8000000
static void __irq SLWEint45Int(void);
char slw_exit=0;
void Test_SlowMode(void)
{
int i;
unsigned int save_MCON[9];
unsigned int save_PCONE,save_PCONG;
//the value of memory control register in slow clock(1MHz)
#if (BDRAMTYPE==DRAM)
unsigned int MemCon[9]={0,0,0,0,0,0,0x10002,0x10002,0x800000+2033};
#else //BDRAMTYPE==SDRAM
unsigned int MemCon[9]={0,0,0,0,0,0,0x18000,0x18000,0x800000+2033};
#endif
save_PCONE=rPCONE;
save_PCONG=rPCONG;
rPCONE |= 0x3; //for monitoring FOUT
rPCONG =0xffff; //EXINT7~0
rPUPG=0x0; //pull up enable
rEXTINT=0x22222222; //Falling edge mode
pISR_EINT4567=(unsigned)SLWEint45Int;
//Uart_Printf("rPCONE=0x%x\n",rPCONE);
for(i=0;i<9;i++)
save_MCON[i]=((unsigned int *)0x01c80004)[i]; // *(unsigned int *)(0x01c80004+4*i);
Uart_Printf("[电源省电模式测试...]\n");
Uart_Printf("进入SLOW mode(慢速模式).\n");
Uart_Printf(" 在%dMhz频率下发光二极管以20ms周期闪烁。\n",MCLK/1000000); //LEDs are flickered by 20ms period at 64Mhz.
Uart_Printf(" 而在1Mhz频率下大约以%dms周期闪烁。\n",MCLK*20/1000000); //But, The frequency,in 1Mhz, is about 1280ms.
Uart_Printf(" 按EINT 4/5/6/7键退出SLOW mode.\n");
Uart_TxEmpty(0); //To avoid being crushed the character
rLOCKTIME=0x640;//0x190; //count=Time_lock*Fin=1600 (Time_lock=200us, Fin=8MHz)
rCLKSLOW=4|(1<<4)|(1<<5); //PLL off,SLOW mode,SLVAL=4 Fout=Fin/(2*SLVAL)=1MHz
ChangeMemCon(MemCon); //change memory control register(64MHz-->1MHz)
rINTMSK=~(BIT_GLOBAL|BIT_EINT4567); //rINTMSK=~(BIT_GLOBAL|BIT_RTC|BIT_EINT4567);
while(!slw_exit)
//now! slow mode:1Mhz, PLL off
{
Led_Display(0xf);
Delay(100);
Led_Display(0x0);
Delay(100);
}
rINTMSK=BIT_GLOBAL;
for(i=0;i<9;i++)
MemCon[i]=save_MCON[i];
ChangeMemCon(MemCon); //change memory control register(1MHz-->64MHz)
//test
// rCLKSLOW=2; //PLL on & Slow off
// Uart_Printf("BYE!!\n");
//test
rCLKSLOW=2|(1<<4)|(0<<5); //PLL on
for(i=0;i<2048;i++); //wait during PLL lock-time
rCLKSLOW=2; //exit SLOW mode(disable slow_bit)
rINTMSK=BIT_GLOBAL;
rPCONE=save_PCONE;
rPCONG=save_PCONG;
Uart_Printf("已转入正常工作模式!!\n");
slw_exit=0;
}
void __irq SLWEint45Int(void)
{
rEXTINTPND=0xf; //clear EXTINTPND reg.
rI_ISPC=BIT_EINT4567; //clear pending_bit
slw_exit=1;
}
void Test_HoldMode(void)
{
Uart_Printf("[HOLD Mode(保持模式:正常模式时关闭部分单元的工作时钟)]\n"); //HOLD Mode(Normal mode with some stopped blocks
Uart_Printf("将IIS,IIC,ADC,RTC,UART1,SIO,ZDMA,Timer,LCD一步步停止提供工作时钟.\n");
Uart_Printf("按任意键可一步步控制电流消耗.\n");
//Except GPIO,BDMA,UART0 //除了 GPIO,BDMA0/1,UART0 三个模块
Uart_Printf("IIS on -->>");
Uart_Getch();
rCLKCON=0x3ff8; //disable controls MCLK into IIS block
Uart_Printf(" IIS off.\n");
Uart_Printf("IIC on -->>");
Uart_Getch();
rCLKCON=0x1ff8; //disable controls MCLK into IIC block
Uart_Printf(" IIC off.\n");
Uart_Printf("ADC on -->>");
Uart_Getch();
rADCCON|=0x20; //System power down of ADC sleep mode
rCLKCON=0x0ff8; //disable controls MCLK into ADC block
Uart_Printf(" ADC off.\n");
Uart_Printf("RTC_CONT on -->>");
Uart_Getch();
rCLKCON=0x07f8; //disable controls MCLK into RTC control block
Uart_Printf(" RTC_CONT off.\n");
Uart_Printf("UART1 on -->>");
Uart_Getch();
rCLKCON=0x05f8; //disable controls MCLK into UART1 block
Uart_Printf(" UART1 off.\n");
Uart_Printf("SIO on -->>");
Uart_Getch();
rCLKCON=0x05d8; //disable controls MCLK into SIO block
Uart_Printf(" SIO off.\n");
Uart_Printf("ZDMA0,1 on -->>");
Uart_Getch();
rCLKCON=0x05c8; //disable controls MCLK into ZDMA block
Uart_Printf(" ZDMA0,1 off.\n");
Uart_Printf("PWMTIMER on -->>");
Uart_Getch();
rCLKCON=0x05c0; //disable controls MCLK into PWMTIMER block
Uart_Printf(" PWMTIMER off.\n");
Uart_Printf("LCDC on -->>");
Uart_Getch();
rCLKCON=0x0580; //disable controls MCLK into LCDC block
Uart_Printf(" LCD off.\n");
Uart_Printf("按任意键返回到正常模式...\n");
Uart_Getch();
rCLKCON=0x7ff8; //IIS,IIC,ADC,RTC,UART,BRDMA,SIO,ZDMA,Timer,LCDC
}
void Test_PLL(void)
{
int KeyV,P_div=0x02, M_div=0x38, S_val, S_div=0x1, mck=0;
U32 save_rPLLCON;
Uart_Printf("[运行改变PLL输出频率的测试...]\n");
Uart_Printf("如果要改变M/P/S值请按'y'键,任意键为默认值!)");
KeyV=Uart_Getch();
Uart_Printf("\n");
if((KeyV=='y')||(KeyV=='Y'))
{
save_rPLLCON=rPLLCON;
Uart_Printf("输入M值[0> 56 <255]:");
M_div=Uart_GetIntNum();
Uart_Printf("输入P值[2> 2 <31]:");
P_div=Uart_GetIntNum();
Uart_Printf("输入S值[0> 1 <3]:");
S_div=Uart_GetIntNum();
S_val=pow(2,S_div);
mck=( (M_div+8)*FIN )/( (P_div+2)*S_val );
if(mck>20000000 && mck<66000000)
{
Uart_Printf("MCLK=%dHz,M=0x%x,P=0x%x,S=0x%x\n",mck,M_div,P_div,S_div);
Uart_Printf("现在将改变PLL的值...\n");
Uart_TxEmpty(0);
ChangePllValue(M_div,P_div,S_div);
Uart_Init(mck,115200);
}
else
Uart_Printf("输入有误!!! PLL输出超限!!! 现将设置PLL为默认值...\n");
}
//Uart_Printf("MCLK=%d,M=0x%x,P=0x%x,S=0x%x\n",mck,M_div,P_div,S_div);
//Uart_Printf("现在改变PLL的值...\n");
Uart_Printf("PLLCON=0x%x\n",rPLLCON);
Uart_Printf("按任意键退出测试。\n");
//Uart_TxEmpty(0);
//ChangePllValue(M_div,P_div,S_div);
//Uart_Init(mck,115200);
//Uart_Printf("...I'm running in changed MCLK...\nPress any key to return!\n");
while(!Uart_GetKey())
{
Led_Display(0xf);
Delay(1000);
Led_Display(0x0);
Delay(1000);;
}
if(mck!=0)
{
rPLLCON=save_rPLLCON;
//ChangePllValue(0x38,0x2,0x1);//Fin=8MHz, Fout=64MHz
//ChangePllValue(0x34,0x0,0x1);//Fin=10MHz, Fout=40MHz
Uart_Init(0,115200);
Uart_Printf("时钟频率已经恢复到原来值!!\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -