📄 rtc.c
字号:
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\rtc.h"
void Rtc_Tick(void);
void Rtc_display(void);
void Wdt_Int(void);
char *date[8] = {"","SUN","MON","TUE","WED","THU","FRI","SAT"};
volatile unsigned int sec_tick;
int year,month,day,weekday,hour,min,sec;
void Display_Rtc(void)
{
int i;
Uart_Printf("\nTyping any key to exit(press 1 will reset)!!!\n");
pISR_TICK=(unsigned)Rtc_display;
rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset
sec_tick=1;
rINTMSK=~(BIT_GLOBAL|BIT_TICK);
rTICINT = 127+(1<<7); //START
i=Uart_GetIntNum();
rINTMSK |= (BIT_GLOBAL | BIT_TICK);
rRTCCON=0x0; //END
if(i==1)
Test_WDTimer();
}
void Rtc_display(void)
{
rI_ISPC=BIT_TICK; //clear pending_bit
year = 0x2000 + rBCDYEAR;
month=rBCDMON;
day=rBCDDAY;
weekday=rBCDDATE;
hour=rBCDHOUR;
min=rBCDMIN;
sec=rBCDSEC;
Uart_Printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%4x,%2x,%2x,%s,%2x:%2x:%2x",year,month,day,date[weekday],hour,min,sec);
DisplayRtc();
}
void Rtc_Init(void)
{
int i,j;
rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset
Uart_Printf("\nEnter Year(XX):");
i=Uart_GetIntNum();
rBCDYEAR = 0x2000+i+(i/10)*6;
Uart_Printf("Enter month(XX):");
i=Uart_GetIntNum();
rBCDMON = i+(i/10)*6;
Uart_Printf("Enter DAY:");
i=Uart_GetIntNum();
rBCDDAY = i+(i/10)*6; // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
Uart_Printf("Enter DATE((SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7):):");
i=Uart_GetIntNum();
rBCDDATE = i;
Uart_Printf("Enter hours:");
i=Uart_GetIntNum();
rBCDHOUR =i+(i/10)*6;
Uart_Printf("Enter minute:");
i=Uart_GetIntNum();
rBCDMIN=i+(i/10)*6;
Uart_Printf("Enter sec:");
i=Uart_GetIntNum();
rBCDSEC=i+(i/10)*6;
rRTCCON = 0x00; // R/W enable, 1/32768, Normal(merge), No reset
}
volatile int isWdtInt;
/****************************************
* Watch-dog timer test *
****************************************/
void Test_WDTimer(void)
{
Uart_Printf("[WatchDog Timer Test]\n");
rINTMSK=~(BIT_GLOBAL|BIT_WDT);
pISR_WDT=(unsigned)Wdt_Int;
isWdtInt=0;
rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1<<2); // t_watchdog = 1/66/128, interrupt enable
rWTDAT=8448/4; // t_watchdog=1/(Prescaler value+1)/Division_factor
rWTCNT=8448/4;
rWTCON=rWTCON|(1<<5); // 1/40/128,interrupt
while(isWdtInt!=10);
rWTCON=((MCLK/1000000-1)<<8)|(3<<3)|(1); // 1/66/128, reset enable
Uart_Printf("\nI will restart after 2 sec!!!\n");
rWTCNT=8448*2;
rWTCON=rWTCON|(1<<5); // 1/40/128,interrupt
while(1);
rINTMSK=BIT_GLOBAL;
}
void Wdt_Int(void)
{
rI_ISPC=BIT_WDT; //clear pending_bit
Uart_Printf("%d ",++isWdtInt);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -