⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stop.c

📁 S3C44b0X 的中断程序代码................
💻 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 + -