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

📄 rtc.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
//====================================================================
// File Name : rtc.c
// Function  : S3C2450 RTC Test Program
// Date      : June. 5, 2006
// Version   : 0.0
// History
//   0.0 : Programming start (June. 05, 2006)
//====================================================================

#include "System.h"
#include "rtc.h"


//added
#include "auto_typedefine.h"
#include "autotest_api.h"
//added-end


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

void RTC_tick_CLKRST(void);
void __irq Rtc_Tick_ISR_clkrst(void);

void * rtc_func[][2]=
{
	(void *)RTC_time_tick,		"RTC Time Tick Int Test		",
	(void *)RTC_initialize,			"RTC time initialize        ",	
	(void *)Rtc_Alarm,			"RTC Alarm Test	",
	//(void *)RTC_BATFLT,			"RTC battery falut check Test	",
//	(void *)RTC_Display,			"RTC Display		",
//	(void*)RTC_SetTime,			"RTC Set Time	",
//	(void*)RTC_tick_CLKRST, 		"RTC Clock reset test	",
	0,0
};


void Test_RTC(void)
{
	
	
	while(1) {
		int i=0;
		printf("\n");
		while(1)
		{   //display menu
	    	printf("%2d:%s",i,rtc_func[i][1]);
	    	i++;
	    	if((int)(rtc_func[i][0])==0)
	    	{
				printf("\n");
				break;
	    	}
	    	if((i%4)==0) printf("\n");
		}
		printf("\nSelect(-1 to exit): ");
		i = GetIntNum();

		if(i==-1) break;

		if(i>=0 && (i<(sizeof(rtc_func)/4)) ) 
	    	( (void (*)(void)) (rtc_func[i][0]) )();	// execute selected function.
	}
}


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

	year =  6;
	month= 12;
	date = 31;
	hour = 23;
	min  = 59;
	sec  = 00;
	
    	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)  | 0x3;		//SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
    	rBCDHOUR =( ((hour/10)<<4) + (hour%10) );
    	rBCDMIN  =( ((min/10)<<4)  + (min%10)  );
    	rBCDSEC  =( ((sec/10)<<4)  + (sec%10)  );     	

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

  	while (!Uart_GetKey()){	
    		printf("%2x : %2x : %2x  %10s,  %2x/%2x/20%02x\n",rBCDHOUR,rBCDMIN,rBCDSEC,day[rBCDDAY],rBCDMON,rBCDDATE,rBCDYEAR);
  	}
}

void RTC_Display(void)
{
	int i;
	while (!Uart_GetKey())
	{	
		if ( !(i == rBCDSEC))
		{
			printf("%2x : %2x : %2x  %10s,  %2x/%2x/20%02x\n",rBCDHOUR,rBCDMIN,rBCDSEC,day[rBCDDAY],rBCDMON,rBCDDATE,rBCDYEAR);	
			i = rBCDSEC;
		}
	}
	

}



void RTC_time_tick(void)
{
	int i;
	transtime = 0;
	
	
	RTC_Init();

	printf("[0]1/16384\t[1]:1/8192\t[2]1/4096\t[3]1/2048\t[4]1/128\t[5]1/1\n[6]1/1024\n"
		"[7]1/512\t[8]1/256\t[9]1/64\t\t[10]1/32\t[11]1/16\n[12]1/8\t\t[13]1/4\t\t[14]1/2\t\t[15]1/32768\t :\n");

	i=GetIntNum();
	if (i<0 && i>15 ) return ;
	if (i==15)
		rRTCCON = (rRTCCON & ~(0x1<<4)) | (1<<4);
	else	
		rRTCCON = (rRTCCON & ~(0xf<<5)&~(0x1<<4) ) | (i<<5)|(0<<4);
	
	printf(" rtcon = %08x\n", rRTCCON);



	#if 0 //yym for tick clock check changing Tick SEL
		
		rTICNT2 = 0;
		rTICNT0 = 0;
		rTICNT1 = 100;
		

	#endif
	
	#if 1
	switch(i)
		{
			// tick interval = 1/tick_clock * (tick_count +1)
			#if 1
			case 0: 	Tick_Count_Set(16384); break;
			case 1: 	Tick_Count_Set(8192); break;
			case 2: 	Tick_Count_Set(4096); break;
			case 3: 	Tick_Count_Set(2048); break;
			case 4: 	Tick_Count_Set(128); break;
			case 5: 	Tick_Count_Set(1); break;			
			case 6: 	Tick_Count_Set(1024); break;			
			case 7: 	Tick_Count_Set(512); break;	
			case 8: 	Tick_Count_Set(256); break;	
			case 9: 	Tick_Count_Set(64); break;	
			case 10: 	Tick_Count_Set(32); break;	
			case 11: 	Tick_Count_Set(16); break;	
			case 12: 	Tick_Count_Set(8); break;	
			case 13: 	Tick_Count_Set(4); break;
			case 14: 	Tick_Count_Set(2); break;	
			case 15: 	Tick_Count_Set(32768); break;	

			default : break;
			
			#elif 0  // for tick interval test
			case 0: 	Tick_Count_Set(1); break;
			case 1: 	Tick_Count_Set(1); break;
			case 2: 	Tick_Count_Set(1); break;
			case 3: 	Tick_Count_Set(1); break;
			case 4: 	Tick_Count_Set(1); break;
			case 5: 	Tick_Count_Set(1); break;			
			case 6: 	
					rRTCCON &= ~(7<<5);
					rRTCCON |= (1<<4); 
					printf(" rtcon = %08x\n", rRTCCON);
					Tick_Count_Set(1); 
					break;			
			default : break;
			
			#elif 0 // for tick clock resolution
			case 0: 	Tick_Count_Set(2); break;
			case 1: 	Tick_Count_Set(2); break;
			case 2: 	Tick_Count_Set(2); break;
			case 3: 	Tick_Count_Set(2); break;
			case 4: 	Tick_Count_Set(2); break;
			case 5: 	Tick_Count_Set(2); break;			
			case 6: 	
					rRTCCON &= ~(7<<5);
					rRTCCON |= (1<<4); 
					printf(" rtcon = %08x\n", rRTCCON);
					Tick_Count_Set(2); 
					break;			
			default : break;
			
				
			
			#endif
			
	
		}
	#endif

	
  	pISR_TICK = (U32)Rtc_Tick_ISR;
   	rINTMSK &= ~(BIT_TICK);

	// for checking tick interval
   	rGPHCON = (rGPHCON & ~(3<<26)) | (1<<26);
	rGPHDAT |= (1<<13);

    	
   	rTICNT0 |= (1<<7);	// Tick Time Interrupt Enable
	//StartStopwatch();
    	
   	while(!Uart_GetKey()) {
    		
   		while(!Tick)
   			{
 #if 0    // yym tick enable setup time check after tick disable(tick counter reset operation check)
			  if(Uart_GetKey())
   			  	{
   			  	     rTICNT0 &= ~(1<<7);
   			  	     rTICNT0 |= (1<<7);
   			  	}
			  printf("Tick cnt value = %08x\n", rTICKCNT);
#endif
   			}

		;	// Wait Tick Interrupt
		//printf("Tick cnt value = %08d\n", rTICNT0); // internal tick time counter register (s3C2443 only)
		//Print_RTC();
  		Tick=0;
    	}

	//transtime = EndStopwatch();
	//printf("%dusec\n",transtime);

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

}


void RTC_tick_CLKRST(void)
{
	int i,j;
	RTC_Init();
	//Uart_getc();
	SetResStopwatch(100000);
	//while(1)
	//{	

	transtime = 0;
	
		

	rRTCCON  = rRTCCON  & ~(0x1) &~(1<<3) | 0x1|(0<<3);            // clk counter enable, RTC Control enable
	
	rRTCCON = (rRTCCON & ~(0xf<<5)&~(0x1<<4) ) | (5<<5)|(0<<4);     //  1/32768 second tick colck
	
	printf(" rtcon = %08x\n", rRTCCON);

	j= rand()%0x100000;
	for (i=0; i<j;i++);
		
	rTICNT2 = 0;
	rTICNT0 = 0;
	rTICNT1 = 1;
		
		
  	pISR_TICK = (U32)Rtc_Tick_ISR_clkrst;
   	rINTMSK &= ~(BIT_TICK);

	// for checking tick interval
   	rGPHCON = (rGPHCON & ~(3<<26)) | (1<<26);
	rGPHDAT |= (1<<13);

    	printf("\n\n-----without clock reset----- \n\n");
   	rTICNT0 |= (1<<7);	// Tick Time Interrupt Enable
	StartStopwatch();
    	
   	while(Tick<11)
		{
	rINTMSK &= ~(BIT_TICK);
	rTICNT0 |= (1<<7);	// Tick Time Interrupt Enable
		
		}
   		
   	//printf("Tick cnt value = %08x\n", rTICKCNT);
	transtime = EndStopwatch();
	printf("-----without clock reset-----\n\n");
	
	Tick=0;
	transtime = 0;

	rRTCCON  = rRTCCON  & ~(0x1) &~(1<<3) |(0<<3)| 0x1;            // clk counter reset, RTC Control enable
	rRTCCON  = rRTCCON  & ~(0x1) &~(1<<3) |(1<<3)| 0x0;            // clk counter enable, RTC Control disable
  	rTICNT0 &= ~(1<<7);	// Tick Time Interrupt Disable
   	rINTMSK |= (BIT_TICK);
   	ClearPending(BIT_TICK);



	rINTMSK &= ~(BIT_TICK);

	printf("\n\n------After clock reset----- \n\n");
   	rTICNT0 |= (1<<7);	// Tick Time Interrupt Enable
	StartStopwatch();
    	
   	while(Tick<11)

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

	}
   		
   	//printf("Tick cnt value = %08x\n", rTICKCNT);
	transtime = EndStopwatch();
	printf("------after clock reset------- \n\n");

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

//	}  //while(1)		
    	
}

void __irq Rtc_Tick_ISR_clkrst(void)
{

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

⌨️ 快捷键说明

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