【平头哥RVB2601创意应用开发】4. 运用RTC来记录时间
[复制链接]
本帖最后由 hehung 于 2022-3-6 19:28 编辑
前言
RTC用来记录时间是一个很好的选择,不用外接时钟芯片,还可以达到获取精确时钟的目的,因为我需要做的项目是网络时钟,需要用到内部RTC,所以本文将作为记录讲解如何使用RTC。
RTC接口分析
直接说代码如何实现的,因为平头哥提供的资料没有讲解如何使用RTC,我也不确定这款单片能不能使用RTC,先做了尝试。
RVB2601使用的是阿里的YOC物联网系统,所以参考文档中的描述使用RTC,参考文档路径:https://yoc.docs.t-head.cn/yocbook/Chapter3-AliOS/CSI%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8%E6%8E%A5%E5%8F%A3/CSI2/RTC.html
我们主要使用的三个函数见下图,可以跳转到网址查看具体操作方式。
这里做简单的介绍
csi_rtc_init:用来初始化RTC;
csi_rtc_set_time:用来设置时间,这是时间需要注意范围与格式,年的取值范围是70-199,真实年数值-1900,如果想设置为2022年,该成员设置为122.
月是从0开始的,真实月份需要加1,比如想设置3月,该成员需要设置为2。
csi_rtc_get_time:获取时间,只要时间设置要了,可以随时获取时间。获取的年需要+1900才是真实年份,月份需要+1才是真实月份。
代码实现
知道了直接的工作以及实现方式,现在可以来编写代码了。
变量定义
需要定义三个变量,用了初始化,设置时间和获取时间。
如下:
rtc是句柄;
time_init是初始化时间变量;
current_time是获取时间的变量,其实和time_init变量可以设置为同一个,这里为了区分与可读性设置为了两个;
csi_rtc_t rtc;
csi_rtc_time_t time_init;
csi_rtc_time_t current_time;
初始化与设置时间
如下:先初始化,然后设置时间,设置的时间是2022年3月6日17点49分,50秒。
printf("===%s, %d\n", __FUNCTION__, __LINE__);的意思是打印当前的函数与行数,当出现故障的时候方便定位使用。
if(CSI_OK != csi_rtc_init(&rtc, 0))
{
printf("===%s, %d\n", __FUNCTION__, __LINE__);
}
time_init.tm_year = 122; /* 2022年 */
time_init.tm_mon = 2; /* 3月 */
time_init.tm_mday = 6; /* 6日 */
time_init.tm_hour = 17;
time_init.tm_min = 49;
time_init.tm_sec = 50;
if(CSI_OK != csi_rtc_set_time(&rtc, &time_init))
{
printf("===%s, %d\n", __FUNCTION__, __LINE__);
}
获取时间并通过串口打印
下面的代码是获取时间,然后通过串口打印出来。
if(CSI_OK != csi_rtc_get_time(&rtc, ¤t_time))
{
printf("===%s, %d\n", __FUNCTION__, __LINE__);
}
printf("Time:%d-%d-%d ", current_time.tm_year+1900, current_time.tm_mon+1, current_time.tm_mday);
printf("%d:%d:%d\n", current_time.tm_hour, current_time.tm_min, current_time.tm_sec);
效果演示
通过上面的方式,成功实现了RTC功能,我在代码中1s中获取一次时间并通过串口打印出来,效果如下:
|