도와주세요!!
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
DRAM 을 초기화 하면 코드가 없어져 버립니다.
DRAM 을 초기화 하지 말고 해보세요.