📄 stop.c
字号:
// GPC[15:0], GPD[15:0]
//GPC
rGPCCON &=~(0xffffffff<<0);
rGPCCON |= ((0x0<<30)|(0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)\
|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
rGPCUDP &=~(0xffffffff<<0);
#ifdef __EVT1
rGPCUDP |= ((0x2<<30)|(0x2<<28)|(0x2<<26)|(0x2<<24)|(0x2<<22)|(0x2<<20)|(0x2<<18)|(0x2<<16)
|(0x2<<14)|(0x2<<12)|(0x2<<10)|(0x2<<8)|(0x2<<6)|(0x2<<4)|(0x2<<2)|(0x2<<0));
#else
rGPCUDP |= ((0x0<<30)|(0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)
|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
#endif
rGPCDAT &=~ (0x1fff<<0);
rGPCDAT |= ((0x0<<14)|(0x1<<13)|(0x0<<12)|(0x1<<11)|(0x0<<10)|(0x1<<9)|(0x1<<8)|(0x0<<3)|(0x1<<2)|(0x1<<1)|(0x1<<0));
//GPD
rGPDCON &=~(0xffffffff<<0);
rGPDCON |= ((0x0<<30)|(0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)\
|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
rGPDUDP &=~(0xffffffff<<0);
#ifdef __EVT1
rGPDUDP |= ((0x2<<30)|(0x2<<28)|(0x2<<26)|(0x2<<24)|(0x2<<22)|(0x2<<20)|(0x2<<18)|(0x2<<16)\
|(0x2<<14)|(0x2<<12)|(0x2<<10)|(0x2<<8)|(0x2<<6)|(0x2<<4)|(0x2<<2)|(0x2<<0));
#else
rGPDUDP |= ((0x0<<30)|(0x0<<28)|(0x0<<26)|(0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)\
|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
#endif
rGPDDAT &=~ (0xffff<<0);
rGPDDAT |= ((0x0<<14)|(0x1<<13)|(0x0<<12)|(0x1<<11)|(0x0<<10)|(0x1<<9)|(0x1<<8)|(0x0<<3)|(0x1<<2)|(0x1<<1)|(0x1<<0));
///////////////////////////////////////////////////////////////////////////////////////////
// VDD_CAM IO
// GPJ[15:0],
//GPJ
rGPJCON &=~(0x3ffffff<<0);
rGPJCON |= ((0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)\
|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
rGPJUDP &=~(0x3ffffff<<0);
#ifdef __EVT1
rGPJUDP |= ((0x2<<24)|(0x2<<22)|(0x2<<20)|(0x2<<18)|(0x2<<16)\
|(0x2<<14)|(0x2<<12)|(0x2<<10)|(0x2<<8)|(0x2<<6)|(0x2<<4)|(0x2<<2)|(0x2<<0));
#else
rGPJUDP |= ((0x0<<24)|(0x0<<22)|(0x0<<20)|(0x0<<18)|(0x0<<16)\
|(0x0<<14)|(0x0<<12)|(0x0<<10)|(0x0<<8)|(0x0<<6)|(0x0<<4)|(0x0<<2)|(0x0<<0));
#endif
rGPJDAT &=~ (0x1fff<<0);
rGPJDAT |= ((0x0<<12)|(0x1<<11)|(0x0<<10)|(0x1<<9)|(0x1<<8)\
|(0x0<<7)|(0x1<<6)|(0x1<<5)|(0x1<<4)|(0x0<<3)|(0x1<<2)|(0x1<<1)|(0x1<<0));
///////////////////////////////////////////////////////////////////////////////////////////
// VDD_RMOP
rMSLCON = 0x0;
#ifdef __EVT1
rGPMCON &=~((0x3<<2) | (0x3<<0));
rGPMUDP &=~((0x3<<4) |(0x3<<2) | (0x3<<0));
rGPMUDP |= ((0x3<<4) | (0x3<<2) | (0x3<<0));
#endif
///////////////////////////////////////////////////////////////////////////////////////////
// VDD_SMOP : stop wakeup iteration fail or not?
rMSLCON = 0x0;
#ifdef __EVT1
rDATAPDEN &=~((0x1<<0)|(0x1<<1)|(0x1<<2)|(0x1<<3)|(0x1<<4)|(0x1<<5)); // reset value = 0x3f; --> 0x30 = 2uA
rDATAPDEN = (0x3<<4);
#else
rGPKUDP &=~((0x1<<0)|(0x1<<1)|(0x1<<2)|(0x1<<3)|(0x1<<4)|(0x1<<5)); // reset value = 0x3f; --> 0x30 = 2uA
rGPKUDP |= (0x3<<4);
#endif
}
volatile unsigned int mslcon_bakup,mslcon_bakup2;
void ConfigMiscIO_stop(void)
{
mslcon_bakup = rMISCCR;
rMISCCR |= (1<<13)|(1<<12);
}
volatile unsigned int cnt_Stop=0;
//volatile unsigned int error=0;
void Test_StopMode(void)
{
printf("[STOP Mode Test]\n");
#ifdef __EVT1
#else
// Save the port configurations
for(i=0;i<32;i++) {
portStatus1[i]=*( (volatile U32 *)0x56000000 + i); // 0x5600_0000:GPACON addr.
}
for(i=0;i<16;i++) {
portStatus2[i]=*( (volatile U32 *)0x560000d0 + i); // 0x5600_00d0:GPJCON addr.
}
#endif
printf("S3C2443 will wake up by EINT0 & EINT11 (Falling Edge Triggered).\n");
#ifdef __EVT1
rEXTINT0 = rdEXTINT0 & (~(1<<3));
rEXTINT0 = (rdEXTINT0 | (1<<3)); //
#else
rGPFUDP &= ~(1<<1); // Pull up down disable
#endif
rGPFCON=rGPFCON & ~(3<<0)|(2<<0); //GPF0=EINT0
#ifdef __EVT1
rEXTINT0=rdEXTINT0&~(0x7<<0)|(0x2<<0); //EINT0=falling edge triggered
#else
rEXTINT0=rEXTINT0&~(0x7<<0)|(0x2<<0); //EINT0=falling edge triggered
#endif
rGPGUDP &=~ (1<<7);
rGPGCON=rGPGCON & ~(3<<6)|(2<<6); //GPG3=EINT11
#ifdef __EVT1
rEXTINT1=rdEXTINT1&~(7<<12)|(2<<12); //EINT11=falling edge triggered
rEXTINT1= rdEXTINT1 | (1<<15);
#else
rEXTINT1=rEXTINT1&~(7<<12)|(2<<12); //EINT11=falling edge triggered
#endif
printf("\nNow, I am entering Stop mode.\n");
Uart_TxEmpty(); //Wait until UART0 Tx buffer empty.
pISR_EINT0 = (U32)Eint0Int;
pISR_EINT8_23 = (U32)Eint8_23Int;
pISR_RTC = (U32)AlarmInt;
pISR_TICK = (U32)Tick_WakeDN;
rEINTPEND |= (1<<11); // clear EINT11 pending bit in rEINTPEND
rSRCPND = BIT_EINT0 | BIT_RTC | BIT_EINT8_23|BIT_TICK;
rINTPND = BIT_EINT0 | BIT_RTC | BIT_EINT8_23|BIT_TICK;
rEINTMASK &= ~(1<<11);
rINTMSK &=~(BIT_EINT0|BIT_RTC|BIT_EINT8_23|BIT_TICK);
rADCCON|=(1<<2); // ADC stanby.
LcdEnvidOnOff(0);// jcs 060610 //Before entering stop mode, LCD must be off
Delay(1);
ConfigStopGPIO();
ConfigMiscIO_stop();
/*
printf("Alarm wake-up (y/n)? ");
if(getchar()=='y')
{
printf("\nS3C2443 will wake up by RTC alarm(10 sec) \n");
SetAlarmWakeUp2();
}
printf("RTC tick interrupt (y/n)? ");
if(getchar()=='y')
{
printf("\nS3C2443 will wake up by RTC tick(4 sec) \n");
RTC_TimeTickSet(); // wake up will be occurred after 4sec!!!
}
*/
// SetAlarmWakeUp2();
printf("rPWRCFG: 0x%x", rPWRCFG);
Uart_TxEmpty();
// Entering the STOP mode
//*************************//
rOSCSET=0xffff;
printf("rOSCSET: %x\n", rOSCSET);
rPWRCFG=(1<<15)|(0<<9)|(0<<8)|(0<<7)|(0<<4)|(0<<3)|(0<<2)|(1<<0);
rPWRMODE=(1<<16);
/////////////////////////////// wakeup ///////////////////////////////
rPWRMODE &= ~(1<<16);
rPWRCFG=(1<<4); // USB Phy power on
//rTICNT0 &= ~(0<<7); // Tick Time Interrupt Enable
//Restore the port configurations
#ifdef __EVT1
#else
for(i=0;i<32;i++){
*( (volatile U32 *)0x56000000 + i)=portStatus1[i];
}
for(i=0;i<16;i++){
*( (volatile U32 *)0x560000d0 + i)=portStatus2[i];
}
#endif
rINTMSK &=~(BIT_EINT0|BIT_RTC|BIT_EINT8_23|BIT_TICK);
rINTMSK =BIT_ALLMSK;
Led_Display(0xa);
// Lcd_EnvidOnOff(1); // jcs 060610
printf("Return to Normal Mode.\n");
printf("wake-up= %08x\n", rWKUPSTAT);
//Check wake-up source
if( rWKUPSTAT & (1<<0) ) // EINT?
{
printf("\n__ Wake-up by EINT\n");
rWKUPSTAT |= (1<<0);
}
else if( rWKUPSTAT & (1<<1) ) // RTC?
{
printf("\n__ Wake-up by RTC Alarm\n");
rWKUPSTAT |= (1<<1);
}
else if( rWKUPSTAT & (1<<4) ) // RTC?
{
printf("\n__ Wake-up by RTC tick\n");
rWKUPSTAT |= (1<<4);
}
else if( rWKUPSTAT & (1<<5) ) // BATFLT?
{
printf("\n__ Wake-up by nBATFLT\n");
rWKUPSTAT |= (1<<5);
}
}
void Test_SoftMode(void)
{
printf("Software reset Test : 0x%x \n", rRSTSTAT);
//Check wake-DN reset
if( rRSTSTAT & (1<<0) ) // nRESET?
{
printf("\n__ Wake-UP by nRESET\n");
rRSTSTAT |= (1<<0);
}
else if( rRSTSTAT & (1<<2) ) // WDTRST?
{
printf("\n__ Wake-UP by WDTRST\n");
rRSTSTAT |= (1<<2);
}
else if( rRSTSTAT & (1<<3) ) // SLEEP?
{
printf("\n__ Wake-UP by SLEEP\n");
rRSTSTAT |= (1<<3);
}
else if( rRSTSTAT & (1<<4) ) // ESLEEP?
{
printf("\n__ Wake-UP by ESLEEP\n");
rRSTSTAT |= (1<<4);
}
else if( rRSTSTAT & (1<<5) ) // SWRST?
{
printf("\n__ Wake-UP by SWRST\n");
rRSTSTAT |= (1<<5);
}
// rPWRCFG|=(1<<9); // nand reset disable
rSWRST = 0x533c2443;
}
void RTC_TimeTickSet(void)
{
printf("RTC Tick set\n");
rRTCCON = (rRTCCON & ~(0x7<<5)) | (1<<5);
rTICNT0=0x7f; // upper count
rTICNT1=0xff; // Lower count
rTICNT0 |= (1<<7); // Tick Time Interrupt Enable
rRTCCON|=0x1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -