📄 rtc.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 + -