📄 rtc.c
字号:
rGPHDAT ^= (1<<13); // for test tick interval
Tick++;
transtime = EndStopwatch();
printf(" reset: %dusec\n",transtime);
StartStopwatch();
}
void Rtc_Alarm(void)
{
int i;
printf("[ RTC Alarm Test for S3C2450 ]\n");
rRTCCON = 0x01; //No reset, Merge BCD counters, 1/32768, RTC Control enable
rALMYEAR = TESTYEAR2 ;
rALMMON = TESTMONTH2;
rALMDATE = TESTDATE2 ;
rALMHOUR = TESTHOUR2 ;
rALMMIN = TESTMIN2 ;
rALMSEC = TESTSEC2 ;
printf("Select alarm interrupt source \n");
printf("1:sec 2:min 3:hour 4:date 5:month 6:year\n");
i = GetIntNum();
rRTCALM = (rRTCALM & ~(0x3f<<0))|(1<<(i-1)); //Year,Month,Day,Hour,Minute,Second alarm enable
printf( " rRTCALM = %08x\n", rRTCALM);
printf("After 5 sec, alarm interrupt will occur.. \n");
printf("alarm:%2x : %2x : %2x %2x/%2x/20%02x\n",rALMHOUR,rALMMIN,rALMSEC,rALMMON,rALMDATE,rALMYEAR);
RTC_Init();
printf("curr:%2x : %2x : %2x %2x/%2x/20%02x\n",rBCDHOUR,rBCDMIN,rBCDSEC,rBCDMON,rBCDDATE,rBCDYEAR);
Alarm = 0;
pISR_RTC = (unsigned int)Rtc_Alarm_ISR;
rRTCALM |= (1<<6);
rRTCCON = 0x0; //No reset, Merge BCD counters, 1/32768, RTC Control disable
rINTMSK = ~(BIT_RTC);
while(Alarm==0)
{
if ( !(i == rBCDSEC))
{ printf("%2x : %2x : %2x %10s, %2x/%2x/20%02x\n",rBCDHOUR,rBCDMIN,rBCDSEC,day[rBCDDAY],rBCDMON,rBCDDATE,rBCDYEAR);
i = rBCDSEC;
}
}
Alarm = 0;
printf("Alarmed:%2x : %2x : %2x %10s, %2x/%2x/20%02x\n",rBCDHOUR,rBCDMIN,rBCDSEC,day[rBCDDAY],rBCDMON,rBCDDATE,rBCDYEAR);
rRTCALM = 0x0; //alarm off
rINTMSK = BIT_ALLMSK;
//rRTCCON = 0x0; //RTC Control disable(for power consumption), 1/32768, Normal(merge), No reset}
}
void Tick_Count_Set(U32 count)
{
U32 temp;
if (count !=1)
{
temp = (count-1)%32768;
rTICNT2 = (count-1)/32768;
rTICNT0 = temp/256;
rTICNT1 = temp%256;
}
else
{
printf("time display by every 2 seconds\n");
rTICNT2 = 0;
rTICNT0 = 0;
rTICNT1 = 1;
}
}
void Rtc_Alarm_Set(void)
{
rRTCCON = rRTCCON | 0x1; //RTC Control enable
rALMHOUR =rBCDHOUR;
rALMMIN =rBCDMIN;
rALMSEC =rBCDSEC+5;
printf("After 5 second, Alarm Interrupt Occur\n");
//rRTCCON = rRTCCON & ~(0x1); //RTC Control disable
}
void Print_RTC(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 RTC_SetTime(void)
{
int year,month,date,hour,min,sec,weekday;
rRTCCON = rRTCCON | 0x1; //RTC Control enable
printf("\nYear(0x00~0x99):");
year = GetIntNum();
printf("\nMonth(0x1~0x12):");
month = GetIntNum();
printf("\nweekday(0x1~0x7):");
weekday = GetIntNum();
printf("\nDate(0x1~0x31):");
date = GetIntNum();
printf("\nHour(0x0~0x23):");
hour = GetIntNum();
printf("\nMin(0x0~0x59):");
min = GetIntNum();
printf("\nSec(0x0~0x59):");
sec = GetIntNum();
printf("\n");
rBCDYEAR = year;
rBCDMON = month;
rBCDDAY = weekday ;
rBCDDATE = date ;
rBCDHOUR = hour ;
rBCDMIN = min ;
rBCDSEC = sec ;
rRTCCON = rRTCCON & ~(0x1); //RTC Control disable
if(rBCDYEAR==0x99)
year = 0x1999;
else
year = 0x2000 + rBCDYEAR;
month = rBCDMON;
weekday = rBCDDAY;
date = rBCDDATE;
hour = rBCDHOUR;
min = rBCDMIN;
sec = rBCDSEC;
printf("%2x : %2x : %2x %10s, %2x/%2x/%4x\n",hour,min,sec,day[weekday],month,date,year);
}
void RTC_Init(void)
{
rRTCCON = rRTCCON & ~(0xf) | 0x1; //No reset, Merge BCD counters, 1/32768, RTC Control enable
rBCDYEAR = rBCDYEAR & ~(0xff) | TESTYEAR;
rBCDMON = rBCDMON & ~(0x1f) | TESTMONTH;
rBCDDATE = rBCDDATE & ~(0x3f) | TESTDATE;
rBCDDAY = rBCDDAY & ~(0x7) | TESTDAY; //SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
rBCDHOUR = rBCDHOUR & ~(0x3f) | TESTHOUR;
rBCDMIN = rBCDMIN & ~(0x7f) | TESTMIN;
rBCDSEC = rBCDSEC & ~(0x7f) | TESTSEC;
rRTCCON = 0x0; //No reset, Merge BCD counters, 1/32768, RTC Control disable
}
void __irq Rtc_Tick_ISR(void)
{
rGPHDAT ^= (1<<13); // for test tick interval
ClearPending(BIT_TICK);
Tick=1;
//transtime = EndStopwatch();
//printf("\n%dusec\n",transtime);
printf(" RTC tick interrupt occurred!\n");
}
void __irq Rtc_Alarm_ISR(void)
{
ClearPending(BIT_RTC);
Alarm=1;
printf(" RTC alarm test OK\n");
printf("rSRCPND %x , rINTPND %x \n",rSRCPND,rINTPND);
}
/////////////////////////////////////////////////////
// autotest
//
//condition to success :
//coverage :
bool RTC_initialize_autotest(void)
{
int year,month,date,hour,min,sec;
int old_sec = 0x0, i=0;
int cntfail=0;
year = 6;
month= 12;
date = 31;
hour = 23;
min = 59;
sec = 20;
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 | (1<<3); //divider count init.
rRTCCON = rRTCCON & ~(1<<3);
rRTCCON = rRTCCON & ~(0x1); //RTC Control disable
while (!Uart_GetKey())
{
sec = (rBCDSEC & 0x7F);
if(sec==old_sec)
{
if(i++ == 2000000)
{
i = 0;
printf("[]");
}
}
else
{
if( sec == old_sec+1)
{
if( ( sec & 0xF)<10 ||
((sec>>4) & 0xF)<6
)
{
if(i++ == 2000000)
{
i = 0;
printf("[]");
}
// 2 log at every 10min
min=rBCDMIN;
if( (min&0xF) == 0 && (sec==0x5 || sec == 0x35) )
{
AUTO_msginfo_printf("%2x:%2x:%2x %10s, %2x.%2x.20%02x",
rBCDHOUR,rBCDMIN,rBCDSEC,day[rBCDDAY],rBCDMON,rBCDDATE,rBCDYEAR);
}
// test for during 2min
if(min == 0x2) break;
}
else
{
AUTO_errinfo_printf("i:%d sec : 0x%2x -- old_sec : 0x%2x", i, sec, old_sec);
cntfail++;
}
}
else
{
if( (old_sec == 0x9 && sec == 0x10) ||
(old_sec == 0x19 && sec == 0x20) ||
(old_sec == 0x29 && sec == 0x30) ||
(old_sec == 0x39 && sec == 0x40) ||
(old_sec == 0x49 && sec == 0x50) ||
(old_sec == 0x59 && sec == 0x0)
)
{
if(i++ == 2000000)
{
i = 0;
printf("[]");
}
}
else
{
AUTO_errinfo_printf("i:%d sec : 0x%2x -- old_sec : 0x%2x", i, sec, old_sec);
cntfail++;
}
}
}
old_sec = sec;
}
if(cntfail == 0) return true;
else return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -