目录
- 0.源码
- 1. RTC
- 2. iTop4412 中的 RTC使用的相关寄存器
- 3. BCD编码
- 4. 关键源码
0.源码
GitHub:https://github.com/Kilento/4412NoOS
1. RTC
RTC是实时时钟(Real Time Clock)的缩写,是一种用于计算机系统的硬件设备,用于记录和维护当前的日期和时间。RTC通常包括一个电池供电的计时器和一个晶体振荡器,以确保即使在停电情况下也能继续运行,并且能够提供准确的时间信息。
2. iTop4412 中的 RTC使用的相关寄存器
我们使用 RTCCON寄存器控制时钟的读写。BCDSEC、BCDMIN、BCDHOUR、BCDDAYWEEK BCDDAY BCDMON 、BCDYEAR 等寄存器控制年月日时分秒。
3. BCD编码
BCD(Binary-Coded Decimal)编码是一种用二进制数表示十进制数字的编码方式。在BCD编码中,每个十进制数字用4位二进制数表示,即一个十进制数的每个数字都被编码为4位的二进制数。例如,十进制数57用BCD编码表示为 0b01010111,对应十六进制为0x57。
4. 关键源码
static unsigned int dec_2_bcd(unsigned int dec)
{
return ((dec / 10) << 4 | (dec % 10));
}
static unsigned int bcd_2_dec(unsigned int bcd)
{
return (((bcd & 0xf0) >> 4) * 10 + (bcd & 0x0f));
}
void rtc_set_time(const struct rtc_time* time)
{
// 打开RTC读写开关
RTCCON |= (1 << 0);
/// 写 RTC时间寄存器
BCDYEAR = dec_2_bcd(time->year) - 2000;
BCDMON = dec_2_bcd(time->month);
BCDDAY = dec_2_bcd(time->day);
BCDDAYWEEK = dec_2_bcd(time->dayweek);
BCDHOUR = dec_2_bcd(time->hour);
BCDMIN = dec_2_bcd(time->minute);
BCDSEC = dec_2_bcd(time->second);
RTCCON &= ~(1 << 0);
return;
}
void rtc_get_time(struct rtc_time* time)
{
// 打开RTC读写开关
RTCCON |= (1 << 0);
/// 写 RTC时间寄存器
time->year = bcd_2_dec(BCDYEAR) + 2000;
time->month = bcd_2_dec(BCDMON);
time->day = bcd_2_dec(BCDDAY);
time->dayweek = bcd_2_dec(BCDDAYWEEK);
time->hour = bcd_2_dec(BCDHOUR);
time->minute = bcd_2_dec(BCDMIN);
time->second = bcd_2_dec(BCDSEC);
RTCCON &= ~(1 << 0);
}
2024年02月14日
Kilento