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