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

📄 stop.c

📁 s3c44box 的远程序~!很有价值的啊!!!包括地层硬件编程!
💻 C
字号:
#include  <math.h>
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"
#include "..\inc\rtc.h"

void stopPort(void);
void ReturnPort(void);

static void __irq STEint4567Int(void);
static void __irq STEint2Int(void);
static void __irq STAlarmInt(void);

char wake_int=0;
void Test_StopMode(void)
{
    unsigned int i, j, portStatus[20];
    unsigned int *memdata,*temp;
    unsigned int save_ref;
    
    memdata = (unsigned int *)malloc(0x100000);
    temp=memdata;

    for(i=0;i<0x40000;i++)
	*(temp+i)=i;

    rLOCKTIME=0xfff;

// Save the port configurations
    for(i=0;i<20;i++)
	portStatus[i]=*( (volatile U32 *)(0x1d20000+(i<<2)) );

    Uart_Printf("[STOP Mode Test]\n");
    Uart_Printf("After 5 seconds, S3C44B0X will wake up by RTC alarm interrupt.\n");
    Uart_Printf("S3C44B0X will also wake up by EINT5 and EINT2.\n\n");
    Uart_TxEmpty(0);	//Wait until UART0 Tx buffer empty.
    
    Rtc_Init();

    rALMYEAR=TESTYEAR2 ;
    rALMMON =TESTMONTH2;
    rALMDAY =TESTDAY2  ;
    rALMHOUR=TESTHOUR2 ;
    rALMMIN =TESTMIN2  ;
    rALMSEC =TESTSEC2+4; 
	    
    rRTCALM=0x7f;   //Start RTC alarm

    pISR_RTC=(U32)STAlarmInt;
    pISR_EINT4567=(U32)STEint4567Int;
    pISR_EINT2=(U32)STEint2Int;

    rINTMSK=BIT_GLOBAL;//Before entering Stop mode interrupts must be masked!!

    stopPort();

    EnterPWDN(0x1);//Entering Power down mode.

    rCLKCON=0x7ff8; //Thaw mode -> normal mode.

    rINTMSK=~(BIT_GLOBAL|BIT_RTC|BIT_EINT2|BIT_EINT4567);

    for(i=0;i<20;i++)// Retrun original port configurations 
        *( (volatile U32 *)(0x1d20000+(i<<2)) )=portStatus[i];

    rRTCCON = 0x01; //R/W enable to write rRTCALM
    rRTCALM = 0x0;  //Stop RTC alram
    rRTCCON = 0x0;  //R/W disable :Stop RTC

    rINTMSK=BIT_GLOBAL;//diable all interrupt.

    switch(wake_int)
    {
	case 1:
	    Uart_Printf("S3C44B0X is waked by Alarm\n");
	    break;
	case 2:
	    Uart_Printf("S3C44B0X is waked by EINT5\n");
	    break;
	case 9:
	    Uart_Printf("S3C44B0X is waked by EINT2\n");
	    break;
	default :
	    Uart_Printf("Check int!!!\n");
	    break;
    }
    
    Uart_Printf("Return to Normal Mode.\n");    

    Uart_Printf("Self-refresh data verifing...\n");
    for(i=0;i<0x40000;i++)
    {
	j=*(temp+i);
	if(j!=i)
	{
	    Uart_Printf("Memory test fail after Self-refresh\n"); 
	    break;
	}
    }
    if(j+1==i)
	Uart_Printf("Stop mode and self-refresh test O.K.\n");

    free(memdata);
    wake_int=0;

}

void __irq STEint4567Int(void)
{
    wake_int=rEXTINPND;
    rEXTINPND=0xf;		//clear EXTINPND reg.		
    rI_ISPC=BIT_EINT4567;	//clear pending_bit
}


void __irq STEint2Int(void)
{
    rI_ISPC=BIT_EINT2;	//clear pending_bit
    wake_int=9;
}

void __irq STAlarmInt(void)
{
    rI_ISPC=BIT_RTC;   
    //rI_ISPC; //is needed only when cache=on & wrbuf=on & BSFRD=0
    wake_int=1;
}


void stopPort(void)
{
// The I/O ports have to be configured 
// properly to reduce STOP mode current.
// pullup + output=high
    rPCONA=0x3ff;    //ROM addr:16,17,18,19 SDRAM bank addr:21,22

    rPCONB=0x7ff;	    //SDRAM:SCKE,SCLK,nSCAS,nSRAS

    rPDATC=0x0;
    rPCONC=0x10000000;	//all output
    rPUPC=0xc000;

    rPDATD=0x0;
    rPCOND=0x5555;	//all output

    rPDATE=0x0;
    rPCONE=0x4;	//all output
    rPUPE=0x106;

    rPDATF=0x0;
    rPCONF=0x2400;	//all output
    rPUPF=0x1e3;

    rPCONG=0xd30;	//all output
    rPUPG=0x24;

    rSPUCR=0x0;		
    rEXTINT=0x22222222;	//falling edge

    rRTCCON=0x0;    //RTC R/W disable for power consumption
    rADCCON |=0x20; //ADC sleep mode
}

⌨️ 快捷键说明

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