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

📄 rtc.c

📁 三星2413芯片的测试代码,对进行驱动开发很有帮助.
💻 C
字号:
//====================================================================
// File Name : rtc.c
// Function  : S3C2413 RTC Test Program
// Date      : Sep. 27, 2005
// Version   : 0.0
// History
//   0.0 : Programming start (Sep. 27, 2005)
//====================================================================

#include <stdio.h>
#include <stdlib.h>

#include "2413addr.h"
#include "System.h"
#include "Exception.h"
#include "Console.h"
#include "def.h"
#include "rtc.h"
#include <time.h>

#define	SUN		1
#define	MON	2
#define	TUE		3
#define	WED	4
#define	THU		5
#define	FRI		6
#define	SAT		7

char *day[8] = {" ","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
volatile U32 Tick, Alarm;

void RTC_Tick(void);
void RTC_Alarm(void);
void RTC_Display(void);

void RTC_DataInit(void);
void RTC_TimeTickSet(U32 TICsel, U32 TCnt);
void Rtc_AlarmSet(void);
void RTC_Print(void);
void RTC_Zero(void);
void RTC_ReadTick(void);

void __irq Rtc_Tick_ISR(void);
void __irq Rtc_Alarm_ISR(void);

void * rtc_func[][2]=
{
	(void *)RTC_Display,	"RTC Time Display        ",
	(void *)RTC_Tick,		"RTC Time Tick Int        ",
	(void *)RTC_Alarm,	"RTC Alarm Test           ",
	(void *)RTC_Zero,		"RTC Time Zero Set      ",
	(void *)RTC_ReadTick,"RTC Time Tick Read    ",
	(void *)RTC_Set_Current_Time, "RTC_Set_Current_Time  ",
	(void *)RTC_Set_Clock_Read_Clock_Test, "RTC_Set_Clock_Read_Clock_Test  ",
	0,0
};

void Ch16_Rtc(void)
{
	int i=0;

	while(1)
	{
		i=0;
		printf("\n\n");
		while(1)
		{   //display menu
			printf("%2d:%s",i,rtc_func[i][1]);
			i++;
			if((int)(rtc_func[i][0])==0)
			{
				printf("\n");
				break;
			}
			printf("\n");
		}

		printf("\nPress Enter key to exit : ");
		i = GetIntNum();
		if(i==-1) break;		// return.
		if(i>=0 && (i<((sizeof(rtc_func)-1)/8)) )	// select and execute...
			( (void (*)(void)) (rtc_func[i][0]) )();
	}
}

void RTC_Display(void)
{
	S8 YorN;
	Tick=FALSE;
	
	printf("Real Time Clock Display\n");
	printf("Do you want to input RTC data? [y/n] :");
	YorN=getchar();

	printf("\n");
	if(YorN=='Y'||YorN=='y') {
		RTC_DataInit();
	}

	RTC_TimeTickSet(0, 2047);
//	RTC_TimeTickSet(1, 32767);
	
  	pISR_TICK = (U32)Rtc_Tick_ISR;
   	rINTMSK &= ~(BIT_TICK);
	rTICNT0 |= (1<<7);			// Tick Time Interrupt Enable

	printf("\n [Real Time Clock]       ");
	RTC_Print();
   	while(!Uart_GetKey()) {
   		if (Tick==TRUE) {			// Wait Tick Interrupt
  			Tick=FALSE;
			printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
			RTC_Print();
   		}
    	}

  	rTICNT0 &= ~(1<<7);			// Tick Time Interrupt Disable
   	rINTMSK |= (BIT_TICK);
   	ClearPending(BIT_TICK);
}

void RTC_Tick(void)
{
	S8 YorN;
	U32 i=0;
	U32 DivSel,DivVal;
	
	Tick=FALSE;
	
	printf("Real Time Clock Display [ probe GPG0(GON12 p7) ]\n");
	rGPGDAT &= ~(1<<0);
  	rGPGCON=rGPGCON&~(3<<0)|(1<<0);  //GPG3=OutPut
   	rGPGDN &= ~(1<<0);

	while(1) {
		printf("Select Clock Divider 0:[1/2048]   1:[1/32768] =>");
		DivSel = GetIntNum();
		if(DivSel<2) break;
	}

	do {
		printf("Select Divider Value (1~32767) =>");
		DivVal = GetIntNum();
	} while((DivVal<1)||(DivVal>32767));

	RTC_TimeTickSet(DivSel, DivVal);
	
  	pISR_TICK = (U32)Rtc_Tick_ISR;
   	rINTMSK &= ~(BIT_TICK);
	rTICNT0 |= (1<<7);			// Tick Time Interrupt Enable

   	while(!Uart_GetKey()) {
    		
   		if (Tick==TRUE) {			// Wait Tick Interrupt
  			Tick=FALSE;

			if(i++%2) rGPGDAT |= (1<<0);
			else	 rGPGDAT &= ~(1<<0);
		}

    	}

  	rTICNT0 &= ~(1<<7);			// Tick Time Interrupt Disable
   	rINTMSK |= (BIT_TICK);
   	ClearPending(BIT_TICK);
}

void RTC_Alarm(void)
{
//	RTC_DataInit();
	Rtc_AlarmSet();

  	pISR_RTC = (U32)Rtc_Alarm_ISR;
   	rINTMSK &= ~(BIT_RTC);

	rRTCALM=0x7F;
	Alarm=FALSE;
	while(Alarm==FALSE);	// Wait Alarm Interrupt
	printf("Alarm ");
  	RTC_Print();
    	
   	rINTMSK |= (BIT_RTC);
   	ClearPending(BIT_RTC);
}

void RTC_Zero(void)
{
   	rRTCCON  = rRTCCON  | 0x1;		//RTC Control enable

	rBCDYEAR =0;
	rBCDMON  =0;
	rBCDDATE =0;
 	rBCDDAY  = SUN;
	rBCDHOUR =0;
	rBCDMIN  =0;
	rBCDSEC  =0;

  	rRTCCON  = rRTCCON  & ~(0x1);		//RTC Control disable
}

void RTC_Set_Current_Time(void) {
	int temp,upper,lower;
	int year, month, date, day1, hour, min, sec;
	
	printf ( "input Current Year (2000~2099)[00~99]\n");
	temp = GetIntNum();
	temp = temp % 100;
	upper = temp / 10;
	lower = temp % 10;
	year = upper<<4 | lower;
	
	printf ( "input Current Month [1~12]\n");
	temp = GetIntNum();
	temp = temp % 13;
	upper = temp / 10;
	lower = temp % 10;
	month = upper<<4 | lower;

	printf ( "input Current Day [1-31]\n");
	temp = GetIntNum();
	temp = temp % 32;
	upper = temp / 10;
	lower = temp % 10;
	date = upper<<4 | lower;

	printf ( "input Current day of week [1~7]\n");
	temp = GetIntNum();
	lower = temp % 8;
	day1 = lower;

	printf ( "input Current hour [0~23]\n");
	temp = GetIntNum();
	temp = temp % 24;
	upper = temp / 10;
	lower = temp % 10;
	hour = upper<<4 | lower;
	
	printf ( "input Current minute [0~59]\n");
	temp = GetIntNum();
	temp = temp % 60;
	upper = temp / 10;
	lower = temp % 10;
	min = upper<<4 | lower;
	
	printf ( "input Current second [0~59]\n");
	temp = GetIntNum();
	temp = temp % 60;
	upper = temp / 10;
	lower = temp % 10;
	sec = upper<<4 | lower;

	rRTCCON  = rRTCCON  | 0x1;		//RTC Control enable
	rBCDYEAR = year;
	rBCDMON = month;
	rBCDDATE = date;
	rBCDDAY = day1;
	rBCDHOUR = hour;
	rBCDMIN = min;
	rBCDSEC = sec;
	rRTCCON  = rRTCCON  & ~(0x1);		//RTC Control disable
}

void RTC_Set_Clock_Read_Clock_Test(void) {
	int upper,lower,temp;
	int year, month, date, day1, hour, min, sec;
	int i;
	
	srand(rBCDSEC);

	for ( i = 0 ; i<1024*1024*2-1; i++ ) {
		rRTCCON  = rRTCCON  | 0x1;		//RTC Control enable
		
		temp = rand();
		temp = temp % 100;
		upper = temp / 10;
		lower = temp % 10;
		year =  upper<<4 | lower;
		rBCDYEAR = year;
		
		temp = rand();
		temp = temp % 13;
		upper = temp / 10;
		lower = temp % 10;
		month = upper<<4 | lower;
		rBCDMON = month;

		temp = rand();
		temp = temp % 32;
		upper = temp / 10;
		lower = temp % 10;
		date = upper<<4 | lower;
		rBCDDATE = date;

		temp = rand();
		lower = temp % 8;
		day1 = lower;
		rBCDDAY = day1;

		temp = rand();
		temp = temp % 24;
		upper = temp / 10;
		lower = temp % 10;
		hour = upper<<4 | lower;
		rBCDHOUR = hour;
		
		temp = rand();
		temp = temp % 60;
		upper = temp / 10;
		lower = temp % 10;
		min = upper<<4 | lower;
		rBCDMIN = min;
		
		temp = rand();
		temp = temp % 60;
		upper = temp / 10;
		lower = temp % 10;
		sec = upper<<4 | lower;
		rBCDSEC = sec;

		rRTCCON  = rRTCCON  & ~(0x1);		//RTC Control disable

		rRTCCON  = rRTCCON  | 0x1;		//RTC Control enable
		if ( year != rBCDYEAR | month != rBCDMON | date != rBCDDATE | day1 != rBCDDAY | hour != rBCDHOUR | min != rBCDMIN | sec != rBCDSEC ) {
			printf("set  : %2x : %2x : %2x  %10s,  %2x/%2x/%4x\n",hour,min,sec,day[day1],month,date,year);
			year = rBCDYEAR;
			month   = rBCDMON;
			date    = rBCDDATE;
			day1 = rBCDDAY;
			hour    = rBCDHOUR;
			min     = rBCDMIN;
			sec     = rBCDSEC;
			printf("read : %2x : %2x : %2x  %10s,  %2x/%2x/%4x\n",hour,min,sec,day[day1],month,date,year);
		}
  		rRTCCON  = rRTCCON  & ~(0x1);		//RTC Control disable
	
		
	}

}

void RTC_ReadTick(void)
{
	S8 YorN;
	U32 i=0;
	U32 DivSel,DivVal;
	U32 EXIT=FALSE;
	
	Tick=FALSE;
	
//	printf("Real Time Clock Display [ probe GPG0(GON12 p7) ]\n");
//	rGPGDAT &= ~(1<<0);
//	rGPGCON=rGPGCON&~(3<<0)|(1<<0);  //GPG3=OutPut
//   	rGPGDN &= ~(1<<0);

#if 0
	while(1) {
		printf("Select Clock Divider 0:[1/2048]   1:[1/32768] =>");
		DivSel = GetIntNum();
		if(DivSel<2) break;
		}

	do {
		printf("Select Divider Value (1~32767) =>");
		DivVal = GetIntNum();
		} while((DivVal<1)||(DivVal>32767));

	RTC_TimeTickSet(DivSel, DivVal);
#endif	

	RTC_TimeTickSet(0, 2048);
	printf("Set:TCNT0[0x%08x]\tTCNT1[0x%08x]\n",rTICNT0,rTICNT1);

  	pISR_TICK = (U32)Rtc_Tick_ISR;
   	rINTMSK &= ~(BIT_TICK);
	rTICNT0 |= (1<<7);			// Tick Time Interrupt Enable

	while(1) {
		if(Tick==TRUE) {
			printf(".");
			Tick=FALSE;
		}
#if 0
		if(Uart_GetKey()!='x') {
//			rTICNT0 &= ~(1<<7);			// Tick Time Interrupt Disable
			printf("TCNT0[0x%08x]\tTCNT1[0x%08x]\n",rTICNT0,rTICNT1);
//			rTICNT0 |= (1<<7);			// Tick Time Interrupt Enable
			}
		else break;
#endif
		switch(Uart_GetKey()) {
			case 0 :
				break;
			case 'x' : EXIT=TRUE;
				break;
			default :
				printf("TCNT0[0x%08x]\tTCNT1[0x%08x]\n",rTICNT0,rTICNT1);
		}
		if(EXIT==TRUE) break;
	}
#if 0
   	while(!Uart_GetKey()) {
    		
   		if (Tick==TRUE) {			// Wait Tick Interrupt
  			Tick=FALSE;

			if(i++%2) rGPGDAT |= (1<<0);
			else	 rGPGDAT &= ~(1<<0);
		}

    	}
#endif

  	rTICNT0 &= ~(1<<7);			// Tick Time Interrupt Disable
   	rINTMSK |= (BIT_TICK);
   	ClearPending(BIT_TICK);
}

void Rtc_AlarmSet(void)
{
   	rRTCCON  = rRTCCON  | 0x1;		//RTC Control enable

	rALMYEAR = rBCDYEAR;
	rALMMON = rBCDMON;
	rALMDATE = rBCDDATE;
	rALMHOUR =rBCDHOUR;
	rALMMIN  =rBCDMIN;
	rALMSEC  =rBCDSEC+5;
   	printf("After 5 second, Alarm Interrupt Occur\n");

  	rRTCCON  = rRTCCON  & ~(0x1);		//RTC Control disable
}


void RTC_TimeTickSet(U32 TICsel, U32 TCnt)
{
	rRTCCON = (rRTCCON&~(1<<4))|(TICsel<<4) ;
	rTICNT0 = (TCnt)/256;
	rTICNT1 = (TCnt)%256;
}

void RTC_DataInit(void)
{
	int year,month,date,hour,min,sec;

	year =  5;
	month= 12;
	date = 31;
	hour = 23;
	min  = 59;
	sec  = 50;
	
   	rRTCCON  = rRTCCON  | 0x1;		//RTC Control enable

	rBCDYEAR =( ((year/10)<<4) + (year%10) );
	rBCDMON  =( ((month/10)<<4)+ (month%10));
	rBCDDATE =( ((date/10)<<4) + (date%10) );     	
 	rBCDDAY  = rBCDDAY  & ~(0x7)  | SAT;
	rBCDHOUR =( ((hour/10)<<4) + (hour%10) );
	rBCDMIN  =( ((min/10)<<4)  + (min%10)  );
	rBCDSEC  =( ((sec/10)<<4)  + (sec%10)  );     	

  	rRTCCON  = rRTCCON  & ~(0x1);	//RTC Control disable
  	
	printf("Init %2d : %2d : %2d  %10s,  %2d/%2d/20%02d\n",hour,min,sec,day[SAT],month,date,year);
}

void RTC_Print(void)
{
	int year,month,date,hour,min,sec,weekday;

   	rRTCCON  = rRTCCON  | 0x1;		//RTC Control enable
   		
	if(rBCDYEAR==0x99) 
       	year = 0x1999;
  	else 
       	year = 0x2000 + rBCDYEAR;
              	
	month   = rBCDMON;
	weekday = rBCDDAY;
	date    = rBCDDATE;
	hour    = rBCDHOUR;
	min     = rBCDMIN;
	sec     = rBCDSEC;

  	rRTCCON  = rRTCCON  & ~(0x1);		//RTC Control disable
	printf("%2x : %2x : %2x  %10s,  %2x/%2x/%4x\n",hour,min,sec,day[weekday],month,date,year);
}

void __irq Rtc_Tick_ISR(void)
{
	ClearPending(BIT_TICK);
	Tick=TRUE;
}

void __irq Rtc_Alarm_ISR(void)
{
	ClearPending(BIT_RTC);
	Alarm=TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -