Sigmastar_RTC使用参考

REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 08/27/2024

    1. 概述

    Real Time Clock(实时时钟),简称RTC,主要是用于计时和闹钟设置。

    2. 硬件介绍

    2.1. RTC晶振频率

    RTC目前使用32.768kHz频率的晶振

    3. RTOS用法介绍

    3.1 DRIVER PATH

    sc/driver/sysdriver/rtcpwc/drv/pub/drv_rtcpwc.h
    sc/driver/sysdriver/rtcpwc/drv/src/drv_rtcpwc.c
    sc/driver/sysdriver/rtcpwc/drv/src/drv_rtcpwc_test.c
    sc/driver/sysdriver/rtcpwc/hal/chipname/src/hal_rtcpwc.c
    sc/driver/sysdriver/rtcpwc/hal/chipname/inc/hal_rtcpwc.h
    sc/driver/sysdriver/rtcpwc/hal/chipname/inc/hal_rtcpwc_cfg.h
    sc/driver/sysdriver/rtcpwc/hal/chipname/inc/hal_rtcpwcreg.h
    

    3.2 CONFIG配置

    #make menuconfig
    
    BSP Driver Options --->
        [*] Sstar RTC Driver
        [ ]   Sstar RTC With PWC
        [*]   Sstar RTC With Alarm
        [ ]   Sstar RTC With Offset
    

    3.3 SYSDESC配置

    chipname.sys文件位于sc/driver/sysdriver/sysdesc/hal/chipname/pub

        <rtcpwc>
            [reg_u32] 0x1F006800;
            [interrupts_u8] INT_IRQ_RTC_PWRGD;
            [status_u8] 1;
    

    RTCPWC驱动中支持配置的属性如下表:

    属性 描述 设定值 备注
    reg_u32 指定bank的地址 不需要修改
    interrupts_u8 指定硬件中断号 不需要修改
    status_u8 选择是否使能驱动 1表示enable;0表示disable 可根据需要修改

    3.4 API说明

    头文件位于sc/driver/sysdriver/rtcpwc/drv/pub/drv_rtcpwc.h

    3.4.1. drv_rtcpwc_read_time

    • 目的

      读取时间。

    • 语法

      int drv_rtcpwc_read_time(struct tm *ptime);
      
    • 参数

      参数名称 描述
      ptime 用于存储时间信息的结构体,具体用法可参考下文demo
    • 返回值

      结果 描述
      成功 返回0
      失败 返回负数

    3.4.2. drv_rtcpwc_set_time

    • 目的

      设置时间。

    • 语法

      int drv_rtcpwc_set_time(struct tm *ptime);
      
    • 参数

      参数名称 描述
      ptime 用于设置时间信息的结构体,具体用法可参考下文demo
    • 返回值

      结果 描述
      成功 返回0
      失败 返回负数

    3.4.3. drv_rtcpwc_read_alarm

    • 目的

      读取闹钟时间。

    • 语法

      int drv_rtcpwc_read_alarm(struct rtc_wkalrm *alarm);
      
    • 参数

      参数名称 描述
      ptime 用于存储闹钟时间信息的结构体,具体用法可参考下文demo
    • 返回值

      结果 描述
      成功 返回0
      失败 返回负数

    3.4.4. drv_rtcpwc_set_alarm

    • 目的

      设置闹钟时间。

    • 语法

      int drv_rtcpwc_set_alarm(struct rtc_wkalrm *alarm);
      
    • 参数

      参数名称 描述
      ptime 用于设置闹钟时间信息的结构体,具体用法可参考下文demo
    • 返回值

      结果 描述
      成功 返回0
      失败 返回负数

    3.5 DEMO

    demo源码位于sc/driver/sysdriver/rtcpwc/drv/src/drv_rtcpwc_test.c

    static int rtcpwc_test(CLI_t *cli, char *p)
    {
        char  *cmd;
        u32 year                     = 0;
        u32 month                    = 0;
        u32 day                      = 0;
        u32 hour                     = 0;
        u32 minute                   = 0;
        u32 second                   = 0;
        struct tm *rtc_test          = NULL;
        struct rtc_wkalrm *rtc_alarm = NULL;
    
        rtc_test        = (struct tm *)CamOsMemAlloc(sizeof(struct tm));
        rtc_alarm       = (struct rtc_wkalrm *)CamOsMemAlloc(sizeof(struct rtc_wkalrm));
        rtc_alarm->time = (struct tm *)CamOsMemAlloc(sizeof(struct tm));
    
        cmd = CliTokenPop(cli);
        if (!cmd)
            return -eCLI_PARSE_INPUT_ERROR;
    
        if (strcmp(cmd, "gettime") == 0)
        {
            drv_rtcpwc_read_time(rtc_test);
            cliPrintf("[%d-%d-%d %d:%d:%d]\n", rtc_test->tm_year + 1900, rtc_test->tm_mon + 1,\
                rtc_test->tm_mday, rtc_test->tm_hour, rtc_test->tm_min, rtc_test->tm_sec);
        }
        else if (strcmp(cmd, "settime") == 0)
        {
            if (CliTokenCount(cli) == 6)
            {
                if (CliTokenPopNum(cli, &year, 0) != eCLI_PARSE_OK)
                    goto _RTCPWC_HELP_EXIT;
                if (CliTokenPopNum(cli, &month, 0) != eCLI_PARSE_OK)
                    goto _RTCPWC_HELP_EXIT;
                if (CliTokenPopNum(cli, &day, 0) != eCLI_PARSE_OK)
                    goto _RTCPWC_HELP_EXIT;
                if (CliTokenPopNum(cli, &hour, 0) != eCLI_PARSE_OK)
                    goto _RTCPWC_HELP_EXIT;
                if (CliTokenPopNum(cli, &minute, 0) != eCLI_PARSE_OK)
                    goto _RTCPWC_HELP_EXIT;
                if (CliTokenPopNum(cli, &second, 0) != eCLI_PARSE_OK)
                    goto _RTCPWC_HELP_EXIT;
    
                rtc_test->tm_year = year - 1900;
                rtc_test->tm_mon  = month - 1;
                rtc_test->tm_mday = day;
                rtc_test->tm_hour = hour;
                rtc_test->tm_min  = minute;
                rtc_test->tm_sec  = second;
    
                drv_rtcpwc_set_time(rtc_test);
                cliPrintf("[%d-%d-%d %d:%d:%d]\n", rtc_test->tm_year + 1900, rtc_test->tm_mon + 1, rtc_test->tm_mday,\
                    rtc_test->tm_hour, rtc_test->tm_min, rtc_test->tm_sec);
            }
        }
        else if (strcmp(cmd, "getalarm") == 0)
        {
            drv_rtcpwc_read_alarm(rtc_alarm);
            cliPrintf("[%d-%d-%d %d:%d:%d]\n", rtc_alarm->time->tm_year + 1900, rtc_alarm->time->tm_mon + 1,\
                rtc_alarm->time->tm_mday, rtc_alarm->time->tm_hour, rtc_alarm->time->tm_min, rtc_alarm->time->tm_sec);
        }
        else if (strcmp(cmd, "setalarm") == 0)
        {
            if (CliTokenCount(cli) == 6)
            {
                if (CliTokenPopNum(cli, &year, 0) != eCLI_PARSE_OK)
                    goto _RTCPWC_HELP_EXIT;
                if (CliTokenPopNum(cli, &month, 0) != eCLI_PARSE_OK)
                    goto _RTCPWC_HELP_EXIT;
                if (CliTokenPopNum(cli, &day, 0) != eCLI_PARSE_OK)
                    goto _RTCPWC_HELP_EXIT;
                if (CliTokenPopNum(cli, &hour, 0) != eCLI_PARSE_OK)
                    goto _RTCPWC_HELP_EXIT;
                if (CliTokenPopNum(cli, &minute, 0) != eCLI_PARSE_OK)
                    goto _RTCPWC_HELP_EXIT;
                if (CliTokenPopNum(cli, &second, 0) != eCLI_PARSE_OK)
                    goto _RTCPWC_HELP_EXIT;
    
                rtc_alarm->time->tm_year = year - 1900;
                rtc_alarm->time->tm_mon  = month - 1;
                rtc_alarm->time->tm_mday = day;
                rtc_alarm->time->tm_hour = hour;
                rtc_alarm->time->tm_min  = minute;
                rtc_alarm->time->tm_sec  = second;
                rtc_alarm->enabled       = 1;
    
                cliPrintf("[%d-%d-%d %d:%d:%d]\n", rtc_alarm->time->tm_year + 1900, rtc_alarm->time->tm_mon + 1,\
                    rtc_alarm->time->tm_mday, rtc_alarm->time->tm_hour, rtc_alarm->time->tm_min, rtc_alarm->time->tm_sec);
                drv_rtcpwc_set_alarm(rtc_alarm);
            }
        }
        else
        {
        _RTCPWC_HELP_EXIT:
            CamOsMemRelease(rtc_test);
            CamOsMemRelease(rtc_alarm);
            CamOsMemRelease(rtc_alarm->time);
            cliPrintf("Plz key in : rtcpwc [settime] [year] [month] [day] [hour] [minute] [second]\n");
            cliPrintf("Plz key in : rtcpwc [setalarm] [month] [day] [hour] [minute] [second]\n");
            cliPrintf("Plz key in : rtcpwc [gettime]\n");
            cliPrintf("Plz key in : rtcpwc [getalarm]\n");
            return eCLI_PARSE_INVALID_PARAMETER;
        }
    
        CamOsMemRelease(rtc_test);
        CamOsMemRelease(rtc_alarm);
        CamOsMemRelease(rtc_alarm->time);
    
        return eCLI_PARSE_OK;
    }