📄 main.c
字号:
#include "option.h"
#include "def.h"
#include "44b.h"
#include "44blib.h"
#include "DataType.h"
U32 SERIAL_BAUD = 57600;
TIME_STRUC SysTime;
char *WeekDay[7] = {"SUN","MON", "TUES", "WED", "THURS","FRI", "SAT"};
/*********************************************************/
static void delay(U32 cnt)
{
while(cnt--);
}
/*********************************************************/
#define RTC_YEAR0 (0x03) //年
#define RTC_MONTH0 (0x02) //月
#define RTC_DAY0 (0x0e) //日
#define RTC_DATE0 (0x06) //星期SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
#define RTC_HOUR0 (0x08) //小时
#define RTC_MIN0 (0x08) //分
#define RTC_SEC0 (0x08) //秒
#define RTC_YEAR1 (0x03) //年
#define RTC_MONTH1 (0x03) //月
#define RTC_DAY1 (0x0e) //日
#define RTC_DATE1 (0x06) //星期-SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
#define RTC_HOUR1 (0x08) //小时
#define RTC_MIN1 (0x08) //分
#define RTC_SEC1 (0x08) //秒
#define RTC_RW_EN() rRTCCON = 1 //|= 1
#define RTC_RW_DS() rRTCCON &= 0xfe
void RtcSetDay(TIME_STRUC *time)
{
RTC_RW_EN(); //RTC读写使能,选择BCD时钟、计数器,无复位,1/32768
rBCDYEAR = time->year;; //年
rBCDMON = time->month; //月
rBCDDAY = time->day; //日
RTC_RW_DS();
}
void RtcSetWeek(TIME_STRUC *time)
{
RTC_RW_EN();
rBCDDATE = time->weekday;
RTC_RW_DS();
}
void RtcSetTime(TIME_STRUC *time)
{
RTC_RW_EN(); //RTC读写使能,选择BCD时钟、计数器,无复位,1/32768
rBCDHOUR = time->hour; //小时
rBCDMIN = time->min; //分
rBCDSEC = time->sec; //秒
RTC_RW_DS();
}
void RtcInit(TIME_STRUC *time)
{
RTC_RW_EN(); //RTC读写使能,选择BCD时钟、计数器,无复位,1/32768
rBCDYEAR = time->year;; //年
rBCDMON = time->month; //月
rBCDDAY = time->day; //日
rBCDDATE = time->weekday; //星期
rBCDHOUR = time->hour; //小时
rBCDMIN = time->min; //分
rBCDSEC = time->sec; //秒
rTICNT = 0x80+127; //enable tick timer interrupt, set tick timer interrupt time = (127+1)/128 second
RTC_RW_DS();
}
void RtcAlarm(TIME_STRUC *time)
{
rALMYEAR = time->year; //年
rALMMON = time->month; //月
rALMDAY = time->day; //日
rALMHOUR = time->hour; //小时
rALMMIN = time->min; //分
rALMSEC = time->sec; //秒
rRTCALM = 0x7f; //全局警报使能控制,年、月、日、星期、时分秒警报使能控制
}
void RtcGetTime(TIME_STRUC *time)
{
U8 m;
RTC_RW_EN(); //RTC读写使能
time->year = 2000 + rBCDYEAR;
time->weekday = rBCDDATE;
m = rBCDMON;
time->month = m;//(m>>4)*10 + (m&0xf); //BCD码转十进制
m = rBCDDAY;
time->day = m;//(m>>4)*10 + (m&0xf); //BCD码转十进制
m = rBCDHOUR;
time->hour = m;//(m>>4)*10 + (m&0xf); //BCD码转十进制
m = rBCDMIN;
time->min = m;//(m>>4)*10 + (m&0xf); //BCD码转十进制
m = rBCDSEC;
time->sec = m;//(m>>4)*10 + (m&0xf); //BCD码转十进制
RTC_RW_DS(); //RTC读写禁止(降低功率消耗),选择BCD时钟、计数器,无复位,1/32768
}
void InitSysTimer(U8 Freq)
{
rTCON &= 0xf0ffffff; //clear manual update bit, stop Timer 5
rTCFG0 &= 0xff00ffff; //定时器4/5的预分频为16
rTCFG0 |= (16-1)<<16;
rTCFG1 &= 0xff0fffff; //定时器5的MUX为1/8
rTCFG1 |= 2<<20;
rTCNTB5 = MCLK/(Freq*16*8); //定时器5的重装值,在ENABLE之前设定
rTCON |= 0x02000000; //定时器5的MANUAL UPDATE BIT设为1
rTCON &= 0xf0ffffff; //MANUAL UPDATE BIT清零
rTCON |= 0x05000000; //定时器5 start, 设为INTERVAL模式
}
/*********************************************************/
int SysClock(int argc, char *argv[])
{
printf("System is running @%dHz\n", MCLK);
return 0;
}
int GetDate(int argc, char *argv[])
{
int i, error = 0;
char tmp[8];
char *str;
U32 year, month, day;
RtcGetTime(&SysTime);
Uart_Printf("Current date is %d-%d-%d \n", SysTime.year, SysTime.month, SysTime.day);
if(argc<2)
return 0;
str = argv[1];
for(i=0; i<5; i++)
tmp[i] = str[i];
if(tmp[4]!='-')
error = 1;
year = strtodec(str, 4);
if(year<2000||error)
{
puts("year error!\n");
return 0;
}
str += 5;
i = 0;
if(str[++i]!='-')
if(str[++i]!='-')
error = 1;
str[i] = 0;
month = strtobcd(str);
if((month-1)>0x11||error)
{
puts("month error!\n");
return 0;
}
str += i+1;
i = 0;
if(str[++i]!=0)
if(str[++i]!=0)
error = 1;
str[i] = 0;
day = strtobcd(str);
if((day-1)>0x30||error)
{
puts("day error!\n");
return 0;
}
SysTime.year = year-2000;
SysTime.month = month;
SysTime.day = day;
RtcSetDay(&SysTime);
Uart_Printf("Set date %d-%x-%x %s\n", year, month, day, WeekDay[SysTime.weekday]);
return 1;
}
int SetWeek(int argc, char *argv[])
{
U32 i;
int error = 0;
if(argc<2)
error = 1;
i = strtodec(argv[1], 1);
if((i-1)>5)
error = 1;
if(!error)
{
SysTime.weekday = i;
RtcSetWeek(&SysTime);
Uart_Printf("Set to %s\n", WeekDay[i]);
}
else
{
puts("Please enter weekday\n");
puts("0 : Sunday\n");
puts("1 : Monday\n");
puts("2 : Tuesday\n");
puts("3 : Wednesday\n");
puts("4 : Thursday\n");
puts("5 : Friday\n");
puts("6 : Satday\n");
}
return 0;
}
int GetTime(int argc, char *argv[])
{
int i, error = 0;
char *str;
U32 hour, min, sec;
RtcGetTime(&SysTime);
Uart_Printf("Current time is %x:%x:%x\n", SysTime.hour, SysTime.min, SysTime.sec);
if(argc>1)
{
str = argv[1];
i = 0;
if(str[++i]!=':')
if(str[++i]!=':')
error = 1;
str[i] = 0;
hour = strtobcd(str);
if(hour>0x23||error)
{
puts("hour error!\n");
return error;
}
str += i+1;
i = 0;
if(str[++i]!=':')
if(str[++i]!=':')
error = 1;
str[i] = 0;
min = strtobcd(str);
if(min>0x59||error)
{
puts("minute error!\n");
return error;
}
str += i+1;
i = 0;
if(str[++i]!=0)
if(str[++i]!=0)
error = 1;
str[i] = 0;
sec = strtobcd(str);
if(sec>0x59||error)
{
puts("second error!\n");
return error;
}
SysTime.hour = hour;
SysTime.min = min;
SysTime.sec = sec;
RtcSetTime(&SysTime);
Uart_Printf("Set time %x:%x:%x\n", hour, min, sec);
}
return error;
}
void Main(void)
{
U8 aa;
int i;
rSYSCFG=CACHECFG; // Using 8KB Cache//
Port_Init();
Beep(0);
Led_Display(0x0);
Uart_Init(0,57600);
Delay(10);
Uart_Select(0); //Select UART0
Uart_Printf("\nS3C44B0X rtc test");
SysTime.year = 5;
SysTime.month = 11;
SysTime.day = 22;
SysTime.weekday = 3;
SysTime.hour = 0x17;
SysTime.min = 0x09;
SysTime.sec = 0;
//如果需要做时间设置,请把下面2句话打开
// RtcSetDay(&SysTime);
// RtcSetTime(&SysTime);
while(1){
GetDate(0, NULL);
GetTime(0, NULL);
for(i=0;i<8000000;i++);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -