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;
}