📄 rtc.c
字号:
//====================================================================
// 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 + -