s3c2440a 칩 기반의 mba2440 보드를 사용하고 있습니다.


SleepMode에 들어가 core및 peripheral들에 대한 전원을 중단시켰다가 다시 깨어나는 작업을 하고 있습니다.


제가 짠 코드는... 아래와 같습니다. 메뉴얼을 보면서 짰구요.... 


sleep모드로 들어가는거 같기는 한데... 깨어나질 않는군요.. 외부인터럽트0으로 버튼을 연결해놨고... RTC도 설정했습니다.


그런데 WAKE-UP이 안되더군요.. 혹시 경험 있으신분들.. 해법좀 알려주셨으면 좋겠습니다... 그냥 외부 인터럽트를 띄워도


RTC가 떠도 계속 잠만 자는군요.. 이 잠탱이보드녀석이 ㅠㅠㅠㅠㅠ 아래 제가 작성한 코드이고 코드를 짜면서 궁금한부분은


빨간색 글씨로 표기했는데요... 부탁좀 드릴게요 요녀석좀 깨워주세요 ㅠㅠ



void TestSleepMode(){


Uart_Printf("[Sleep Mode Test]\n");   


ConfigSleepGPIO();   ---->gpio설정 함수... 그냥 EINT0를 키는 곳입니다... 버튼 1로... 설정.. 


 //Interrupt initialize  --->  메뉴얼에 RTC나 EINT를 통해 깨어날수 있다고해서 해당 인터럽트만 마스크 OFF 시켰습니다

    rINTMSK = 0xffffffff;

    rINTMSK &= ~(BIT_RTC | BIT_EINT0);

    rSRCPND |= (BIT_RTC | BIT_EINT0);

    rINTPND |= (BIT_RTC | BIT_EINT0);

        //USB suspend mode  ---> USB서스팬드 모드로 변경

        rMISCCR|=(1<<12); //USB port0 = suspend    

       rMISCCR|=(1<<13); //USB port1 = suspend    


//Data Bus Pull-up enable --->데이터 버스 풀업을 디스에블 시켰습니다.. 이부분은 이해가 안가서 일딴 디스에이블 해                                                         놨습니다.. ㅠ 인에이블해야할지 .. 디스에블해야할지 잘 모르겠습니다..

        //rMISCCR |= (1 << 1 ) | (1 << 0 ); enable

         rMISCCR= rMISCCR & ~(3<<0) ;     //disalbe

    

      //Lcd Off ------> LCD 전원 끄기

      rLCDCON1 &= ~(1<<0);

      rGPGCON  |= (3 << 8);

      rGPGUP |=( 1 << 4);

    rEXTINT0=rEXTINT0&~(7<<0)|(2<<0);  //EINT0=falling edge triggered    

    

    //rGPFCON=rGPFCON & ~(3<<0)|(2<<0); //PF0=EINT0    

    


    Uart_Printf("Alarm wake-up (y/n)? ");   ---->RTC를 사용할지 여부 

    if(Uart_Getch()=='y')   

    {   

        Uart_Printf("S3C2440 will wake up by RTC alarm(10 sec) or EINT0 .\n");   

        SetAlarmWakeUp();   --->내부에서 알람을 설정해서 10초정도 기다리면 RTC가 발생하도록 설정했습니다. 

    }   

     // ADC TOUCH SCREEN STAND BY!!  

      rADCCON|=(1<<2);   

 

      rGSTATUS3=(MK_U32_t)SleepWakeup ;  // memory control part in startup code.    

       Uart_Printf("set restart address:%x\n", rGSTATUS3);   

      rGSTATUS4=0xaaaaaaaa;   

   

    Uart_TxEmpty(1);    //Wait until UART0 Tx buffer empty.    

    Enter_SLEEP(8); //Sleep mode    ------->ASM으로 쩜푸입니다.. 나머지 부분을 스타트업 코드에 작성했습니다. 


}




---- ASM 코드 -----


        stmfd sp!, {r0-r3}


ldr r0, =GSTATUS3

ldr r1, =WAKEUP_SLEEP

str r1, [r0];


;ldmfd sp!, {r0-r1}


      ;load refersh clkcon for TLB fill

      ldr r0 , =REFRESH

      ldr r1 , =CLKCON


     ;self refersh setting ----->SDRAM Self-refresh 기능을 활성화 하는 곳인데.. 활성화해버리면 그냥 멈춰 버려서 일딴은

                                             사용하지 않고 있습니다. 왜 멈추는지 설명해 주셨으면 좋겠습니다.. 

                                              그냥 refresh 기능을 수행하도록 레지스터를 설정하는 건데.. str부분에서 멈춥니다 ㅠㅠ

      ;ldr r2, [r0];

      ;dr r3, =0xc00000

      ;orr r2 , r2 , r3

      ;str r2 , [r0]


mov r2, #10 ;Wait until self-refresh is issued,which may not be needed.

0 subs r2, r2, #1

bne %B0


      ;set sclk0~3       -------->self-refresh 하는동안 보호차원에서 sclk를 끈어버린다고 하는데.. 일단은 주석 처리 해놨습니                                               다. refresh  가 안되니까...

;ldr r0 , =MISCCR

;ldr r2 , [r0]

;ldr r3 , =0xe0000

;orr r2 , r2 , r3

;str r2 , [r0]


       mov r0 , #0x4

    str r0, [r1]


       ;wakeup??

       ldr r0 , =GSTATUS3

       mov pc , r0