瑞芯微(EASY EAI)RV1126B RTC使用

1. RTC介绍

RTC的英文全称是Real-Time Clock,翻译过来是实时时钟芯片。实时时钟芯片通过引脚对外提供时间读写接口,通常使用独立电池供电,以保证在外部系统关电时,芯片电路正常工作,时间正常运行。

不同的时钟芯片内部机制不一样,但在Linux系统中驱动封装了不同时钟芯片的操作细节,为应用程序提供了统一的时间操作接口。

1.1 开发板的RTC资源

EASY EAI Nano-TB 【默认不带】RTC电路。若想底板支持RTC功能,可通过使用我司的RTC模块进行【扩展】

扩展RTC的具体操作:【首先】要把底板【断电】,然后再把模块【正面朝上】地插入到底板的40PIN接口上,如下图所示。

插稳后,再进行【上电】操作。

通过ls命令,可查看RTC芯片是否有被系统识别

复制代码
ls /dev/rtc*

确认驱动成功加载后,可通过下方命令访问驱动,读出RTC芯片的所有信息。

复制代码
cat /proc/driver/rtc

1.2 RTC时间的读写

这里涉及2个时钟,RTC芯片时钟以及系统时钟。手动管理RTC时钟操作的本质就是:同步时钟(要么把系统时钟同步到RTC芯片时钟上,要么把RTC芯片时钟同步到系统时钟)。

系统时钟:系统时钟本质是一个64位的整数,这个整数代表当前与Epoch Time的时间差(以秒为单位),我们称之为时间戳。这个时钟由CPU主芯片定时器维护,CPU掉电后,时钟信息就会丢失。操作系统时钟的命令为date。

复制代码
date    #查询系统时间
date -s "2023-09-20 11:18:00"    #修改系统时间

注:

* Epoch Time:是指一个特定的时间。1970年1月1日0时0分0秒。假设现在距离1970年1月1日0时0分0秒走了N秒,在Linux系统里,时间数值就是N。

RTC芯片时钟:RTC芯片内部所维护的时间。在系统掉电后由电池进行供电。因此系统电源掉电后RTC时间仍然能够正常运行,RTC芯片时钟的作用是在Linux不运行时,依然可以保持时间信息。

芯片时钟同步到系统时钟。

复制代码
sudo hwclock --hctosys

系统时钟同步到芯片时钟(或者是sudo hwclock -w)。

复制代码
sudo hwclock --systohc

如果只想查询RTC芯片时钟,但不同步到系统时钟,可以采用以下命令。

复制代码
sudo hwclock -r

1.3 系统时钟的读写

本文着重介绍的是【RTC时钟】,关于【系统时钟】的详细介绍和操作,可以通过阅读《EASY-EAI-Toolkit/通用组件/系统操作-时间参数》一文进行了解。

1.4 时区和校时服务

时区:【RTC时钟】和【系统时钟】用的都是UTC时间,不同地区所使用的时间,还需要考虑上时区的影响。

校时服务:【RTC时钟】除了可以被手动操作,校时服务也会影响RTC时钟。

关于【时区设置】和【校时服务】,EASY-EAI-Nano-TB可以参考《应用笔记/自动校时与时区设置》一文进行操作。更详细的交互作用机制,可参考《系统时间管理介绍》

2. 快速上手

2.1 开发环境准备

如果您初次阅读此文档,请阅读《入门指南/开发环境准备/Easy-Eai编译环境准备与更新》,并按照其相关的操作,进行编译环境的部署

在PC端Ubuntu系统中执行run脚本,进入EASY-EAI编译环境,具体如下所示。

复制代码
cd ~/develop_environment
./run.sh

2.2 源码下载以及例程编译

首先,在虚拟机后台终端,执行以下命令,创建外设单例源码管理目录:

复制代码
cd /opt
mkdir -p EASY-EAI-Nano-TB/demo

首先,到【百度网盘】上下载相关的单例程序:

链接:https://pan.baidu.com/s/1Br608Hiff2Xs65PzWO_qWQ?pwd=1234

提取码:1234

比如把单例程序下载到:此电脑\D:\BaiduNetdisk (无规定,用户可自主选择),如下图所示。

再将下载好的单例复制进入虚拟机的文件系统,过程如下图所示。

最后,进入到对应的例程目录执行编译操作,具体命令如下所示:

复制代码
cd EASY-EAI-Nano-TB/demo/12_RTC
./build.sh

注:

* 由于依赖库部署在板卡上,因此交叉编译过程中必须保持/mnt挂载。

编译成功后,会生成一个test-rtc的可执行程序在Release目录下,并会自动部署到开发板的/userdata/目录中。

2.3 例程运行

通过串口调试ssh调试,进入板卡后台,定位到例程部署的位置,如下所示:

复制代码
cd /userdata

执行例程命令,如下所示。

复制代码
sudo ./test-rtc

执行效果如下所示。

3. C语言使用案例

RTC的C语言使用案例,代码地址为*12_RTC/test-rtc/main.c,*供用户编码参考。以下代码展示了对RTC时钟的读写操作流程:

复制代码
int main(int argc, char const *argv[])
{
    const char *strDateTime = "2023-09-21 15:22:37";
    // 将字符串转换为tm结构体类型的时间信息
    struct tm tm = {0};
    strptime(strDateTime, "%Y-%m-%d %H:%M:%S", &tm);
    // 打开RTC设备
    int rtc_fd = open("/dev/rtc0", O_RDWR);
    if (rtc_fd < 0) {
        perror("open RTC device /dev/rtc0 faild.");
        close(rtc_fd);
        return -1;
    }
    printf("---设置参数前日期时间---\n");
    system("date");
    
    /***  1.关闭网络校时服务 ***/
    system("systemctl stop ntp.service");
    
    /***  2.将预设好的时间写入【RTC时钟】 ***/
    struct rtc_time rtc_tm;
    rtc_tm.tm_sec  = tm.tm_sec;
    rtc_tm.tm_min  = tm.tm_min;
    rtc_tm.tm_hour = tm.tm_hour;
    rtc_tm.tm_mday = tm.tm_mday;
    rtc_tm.tm_mon  = tm.tm_mon;
    rtc_tm.tm_year = tm.tm_year;
    if (ioctl(rtc_fd, RTC_SET_TIME, &rtc_tm) < 0) {
        perror("set data time to rtc0");
        perror("RTC时间设置失败");
        close(rtc_fd);
        return -1;
    }
    
    /***  3.将【RTC时钟】同步回【系统时钟】 ***/
    // 读出刚才写入的RTC时钟参数
    if (ioctl(rtc_fd, RTC_RD_TIME, &rtc_tm) < 0) {
        perror("RTC时间读取失败");
        close(rtc_fd);
        return -1;
    }
    close(rtc_fd);
    tm.tm_sec  = rtc_tm.tm_sec;
    tm.tm_min  = rtc_tm.tm_min;
    tm.tm_hour = rtc_tm.tm_hour;
    tm.tm_mday = rtc_tm.tm_mday;
    tm.tm_mon  = rtc_tm.tm_mon;
    tm.tm_year = rtc_tm.tm_year;
    struct timeval tv;
    tv.tv_sec = mktime(&tm);
    tv.tv_usec = 0;
    // 同步时间到系统时钟
    if(0 != settimeofday(&tv, (struct timezone *)0)){
        perror("系统时间设置失败");
    }
    printf("---设置参数后日期时间---\n");
    system("date");
    
    return 0;
}
相关推荐
破晓单片机6 小时前
STM32单片机分享:智能浇花系统
stm32·单片机·嵌入式硬件
RFID舜识物联网6 小时前
高校实验室智能化升级:RFID技术革新化学试剂管理
大数据·人工智能·科技·物联网·安全
llilian_166 小时前
gps对时扩展装置 抢险救灾中时间同步精确的重要性分析 电力系统同步时钟
网络·功能测试·单片机·嵌入式硬件
Y1rong6 小时前
STM32之看门狗
stm32·单片机·嵌入式硬件
TDengine (老段)6 小时前
TDengine ODBC 连接器进阶指南
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
az44yao6 小时前
windows api 创建mdi程序
windows·stm32·单片机
JERRY. LIU6 小时前
PV 光电(光伏技术)
单片机·嵌入式硬件
破晓单片机6 小时前
STM32单片机分享:智能洗碗机系统
stm32·单片机·嵌入式硬件
DBA小马哥6 小时前
时序数据库InfluxDB迁移替换及跨地域同步全解析
物联网·时序数据库·dba
首席拯救HMI官7 小时前
【拯救HMI】AR技术与HMI融合:工业现场的可视化新范式
网络·stm32·单片机·网络协议·ar·设计规范