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

📄 power.c

📁 本代码是采用ARM7TDMI内核的S3C44BOX芯片硬件测试程序
💻 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 + -