实时时钟的介绍
实时时钟(Real Time Clock, RTC)可在系统断电时使用备用电池进行工作。即使断电,备用电池也可存储秒、分、小时、周、日、月、年的时间数据。RTC单元外接32.768 kHz晶片,具有报警功能。
实时时钟的实现
首先打开中断,并将他的中断注册,并打开实时时钟
irq_request_cpu0(RTCTIC_IRQID, do_ticalarm, 0);
RTCCON |= 1<<8; //enable tic timer
RTCCON &= ~(0XF<<4);//32.768KHZ
TICCNT = (32768>>1 -1); //配置响应时间
时间的获取,由于他是bnd码,所以我们想要看懂所以需要转化
二进码十进数(英语bai:Binary-Coded Decimal,简称BCD,大陆称duBCD码或二-十进制zhi编码)是一种十进制的数字编码形式
u16 bcd2bin(u16 n)
{
return (n&0xf) + ((n>>4)&0xf)*10;
}
u16 bin2bcd(u16 n)
{
return ((n%10) | ((n/10) <<4));
}
写一个读的函数,一个写的函数
void rtc_gettime(rtctime_t *t)
{
t->year = bcd2bin(BCDYEAR);
t->mon = bcd2bin(BCDMON);
t->mday = bcd2bin(BCDDAY);
t->hour = bcd2bin(BCDHOUR);
t->min = bcd2bin(BCDMIN);
t->sec = bcd2bin(BCDSEC);
t->wday = bcd2bin(BCDDAYWEEK);
}
void rtc_settime(rtctime_t *t)
{
RTCCON |= 0X1;//允许写值
BCDYEAR = bin2bcd(t->year);
BCDMON = bin2bcd(t->mon);
BCDDAY = bin2bcd(t->mday);
BCDHOUR = bin2bcd(t->hour);
BCDMIN = bin2bcd(t->min);
BCDSEC = bin2bcd(t->sec);
BCDDAYWEEK = bin2bcd(t->wday);
RTCCON &= ~0X1;//禁止写值
}
void do_ticalarm(void)
{
if (INTP & 0X2)
{
printf("ALARM INT \n");
}
else if (INTP & 0X1)
{
rtctime_t t;
rtc_gettime(&t);
printf("\r20%2d--%2d--%2d %2d:%2d:%2d weekday:%d\r",
t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.wday);
INTP |= 0X1;
}
}
再编写main函数来测试
int main(void)
{
rtctime_t t = {
.year = 20,
.mon = 8,
.mday = 29,
.hour = 18,
.min = 5,
.sec = 35,
.wday = 6
};
rebuild_vectors_table();
rtc_tic_irq_init();
rtc_settime(&t);
printf("come back to main...\n");
return 0;
}