Edit online

设计说明

26 Nov 2024
Read time: 2 minute(s)

源码说明

源代码位于 bsp/artinchip/

  • bsp/artinchip/drv/rtc/drv_rtc.c,RTC Driver 层实现

  • bsp/artinchip/hal/rtc/hal_rtc.c,RTC HAL 层实现

  • bsp/artinchip/include/hal/hal_rtc.h,RTC HAL 层接口头文件

模块架构

RTC 驱动 Driver 层采用 RT-Thread 的 RTC 设备驱动框架,如果只使用 HAL 层也可以支持 Baremetal 方式的应用场景。


sw_system1

1. RTC 驱动的软件架构图

RTC 控制器除了适配到通用的 RTC 时间、闹钟接口以外,其他非标准的特性如下所示:

  • Alarm 的中断输出:

    Alarm 的中断输出是否可用完全由板级电路的设计决定,软件上只需要使能中断信号即可。

    具体操作详见 打开 RTC 驱动

  • 时钟校准:

    RTC 控制器支持 ±975 ppm 的校准范围,用户需要实测 32 KHz 晶振的时钟频率,然后配置给 menuconfig 中的参数 AIC_RTC_CLK_RATE,详见 打开 RTC 驱动

  • SYS_BAK 寄存器:

    RTC 控制器提供了 128 bits 的 NVMEM 寄存器,系统复位时不会丢失数据,目前主要用于记录系统复位状态。 详见 WRI 模块的复位原因管理说明。

  • 8-bit 寄存器的读写:
    为了减少对代码的干扰,可以将 8-bit 数据的拆解、打包进行封装,示例如下:
    #define RTC_WRITEL(val, reg) \
        do { \
                RTC_WRITE_ENABLE; \
                writeb((val) & 0xFF, RTC_BASE + (reg)); \
                writeb(((val) >> 8) & 0xFF, RTC_BASE + (reg) + 0x4); \
                writeb(((val) >> 16) & 0xFF, RTC_BASE + (reg) + 0x8); \
                writeb(((val) >> 24) & 0xFF, RTC_BASE + (reg) + 0xC); \
                RTC_WRITE_DISABLE; \
        } while (0)
    
    #define RTC_READL(reg)  (readb(RTC_BASE + reg) \
                        | (readb((RTC_BASE + reg) + 0x4) << 8) \
                        | (readb((RTC_BASE + reg) + 0x8) << 16) \
                        | (readb((RTC_BASE + reg) + 0xC) << 24))