📄 stop.c
字号:
//44BTEST : 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);
void __irq STEINT45(void);
void __irq STAlarm(void);
char wake_int=0;
// Users should not use interrupt in stop mode..
void Test_StopMode(void)
{
char *date[8] = {"","SUN","MON","TUE","WED","THU","FRI","SAT"};
unsigned int i, j, portStatus[20];
unsigned int *memdata,*temp;
unsigned int save_ref;
memdata = (unsigned int *)malloc(0x100000);
temp=memdata;
pISR_EINT4567=(unsigned int)STEINT45;
pISR_RTC=(U32)STAlarm;
for(i=0;i<0x40000;i++)
*(temp+i)=i;
rLOCKTIME=0xfff;//400us @10MHz
// 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 EINT4 and EINT5.\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+9;
//test rtc current
rRTCALM=0x7f; //Start RTC alarm
// Display_Rtc();
// Uart_TxEmpty(0);
//test rtc current
// rINTMSK=BIT_GLOBAL;//Before entering Stop mode interrupts must be masked!!
stopPort();//RTC,ADC off
//test slow->stop
// rPCONE |= 0x3;
// rCLKSLOW=2|(1<<4)|(1<<5); //SLOWVAL=2,Fout=Fin/(2x2),PLL off.
// while(1);
//test slow->stop
rLCDCON1 &= 0xfffffffe;//Before entering the stop mode LCD must be off
EnterPWDN(0x1);//Entering Power down mode.
rCLKCON=0x7ff8; //Thaw mode -> normal mode.
//test slow->stop
// rCLKSLOW=2|(1<<4)|(0<<5); //SLOWVAL=2,Fout=Fin/(2x2),PLL on.
// for(i=0;i<2048;i++); //Wait S/W PLL lock time.
// rCLKSLOW=2; //SLOWVAL=2,Fout=Fpllo,PLL on.
//test slow->stop
rLCDCON1 |= 0x1;
for(i=0;i<20;i++)// Retrun original port configurations
*( (volatile U32 *)(0x1d20000+(i<<2)) )=portStatus[i];
//test rtc current
rRTCCON = 0x01; //R/W enable to write rRTCALM
// Uart_Printf("%4x,%2x,%2x,%s,%2x:%2x:%2x\n",0x2000 + rBCDYEAR,rBCDMON,rBCDDAY,date[rBCDDATE],rBCDHOUR,rBCDMIN,rBCDSEC);
//Display_Rtc();
//test rtc current
rRTCALM = 0x0; //Stop RTC alram
rRTCCON = 0x0; //R/W disable :Stop RTC
rINTMSK = ~(BIT_GLOBAL | BIT_EINT4567);
switch(wake_int)
{
case 1:
Uart_Printf("\nS3C44B0X is waked by EINT4\n");
break;
case 2:
Uart_Printf("\nS3C44B0X is waked by EINT5\n");
break;
case 0:
Uart_Printf("\nS3C44B0X is waked by Alarm\n");
break;
default :
Uart_Printf("\nCheck 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;
rINTMSK = BIT_GLOBAL | BIT_EINT4567;
}
void __irq STEINT45(void)
{
// wake_int=rEXTINTPND;
// rEXTINTPND=0xf; //clear EXTINTPND reg.
rI_ISPC=BIT_EINT4567;
}
void __irq STAlarm(void)
{
rI_ISPC=BIT_RTC;
wake_int=0;
}
void stopPort(void)
{
// The I/O ports have to be configured
// properly to reduce STOP mode current.
// pullup + output=high
rPCONA=0x3ff;
rPDATB=0x600;
rPCONB=0x1ff;
rPDATC=0x5400;
rPUPC=0xfc00;
rPCONC=0x11100000;
rPDATD=0xff;
rPUPD=0xff;
rPCOND=0x5555;
rPUPE=0x106;
rPCONE=0x28;
rPUPF=0x3;
rPCONF=0x0;
rPUPG=0x30;
rPCONG=0xf00;
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 + -