Sigmastar_RTC使用参考
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 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; }