iTop-4412 裸机程序(二十二)- RTC时钟

目录

  • 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使用的相关寄存器

iTop-4412 裸机程序(二十二)- RTC时钟_第1张图片
我们使用 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

你可能感兴趣的:(Exynos4412,exynos)