- 学习路线
- RT-Thread 简介
- RT-Thread Nano
- RT-Thread Smart
- RT-Thread Studio
- 快速上手
- 内核
- Env 工具
- 设备和驱动
- 组件
- 软件包
- 物联网
- 工具
- MicroPython用户手册
- 应用开发
- RT-Thread 版本选择
- 开发环境搭建
- 固件尺寸优化
- 在RT-Thread潘多拉开发板上实现电源管理
- 网络协议栈驱动移植
- 在STM32F429上应用网络功能
- 在STM32F429上应用文件系统
- 在潘多拉上使用 SFUD 操作 Flash
- FreeModbus 应用笔记
- 应用AT组件连接ESP8266模块
- 多线程非阻塞网络编程
- 使用QEMU运行动态模块组件
- CmBacktrace应用
- 在 STM32L4 上应用 littlefs 文件系统
- STM32通用Bootloader
- wireshark抓取tls数据包
- 在 STM32 上应用 C++
- STM32 上使用 PWM
- STM32 上使用 USB Host 读写 U 盘
- QEMU 网络视频教程
- Demo 示例
- 其他
- 传感器驱动开发指南
- 软件包开发
- 向RT-Thread贡献代码
- 内核视频教程
- Env 视频教程
- rw007 SPI WiFi 模块使用
- wireshark抓取tls数据包
- Keil MDK 安装
- Rtthread dir
- 支持的传感器列表
- 支持的 Touch 列表
- Builtin functions and exceptions
- Cmath
- Gc
- Math
- Sys
- Uarray
- Ubinascii
- Ucollections
- Uerrno
- Uhashlib
- Uheapq
- Uio
- Ujson
- Uos
- Ure
- Uselect
- Usocket
- ussl – SSL/TLS 模块
- Ustruct
- Utime
- Uzlib
- thread
- micropython – 内部功能访问与控制模块
- Rtthread
- Machine
- Pin
- I2C
- SPI
- UART
- LCD
- RTC
- PWM
- ADC
- WDT
- Timer
- Network
- Wlan
- 传感器驱动框架介绍
- Preparations
RTC设备
RTC 简介
RTC (Real-Time Clock)实时时钟可以提供精确的实时时间,它可以用于产生年、月、日、时、分、秒等信息。目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。有些时钟芯片为了在主电源掉电时还可以工作,会外加电池供电,使时间信息一直保持有效。
RT-Thread 的 RTC设备为操作系统的时间系统提供了基础服务。面对越来越多的 IoT 场景,RTC 已经成为产品的标配,甚至在诸如 SSL 的安全传输过程中,RTC 已经成为不可或缺的部分。
访问 RTC 设备
应用程序通过 RTC 设备管理接口来访问 RTC 硬件,相关接口如下所示:
函数 | 描述 |
---|---|
set_date() | 设置日期,年、月、日 |
set_time() | 设置时间,时、分、秒 |
time() | 获取当前时间 |
设置日期
通过如下函数设置 RTC 设备当前日期值:
rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)
参数 | 描述 |
---|---|
year | 待设置生效的年份 |
month | 待设置生效的月份 |
day | 待设置生效的日 |
返回 | —— |
RT_EOK | 设置成功 |
-RT_ERROR | 失败,没有找到 rtc 设备 |
其他错误码 | 失败 |
使用示例如下所示:
/* 设置日期为2018年12月3号 */
set_date(2018, 12, 3);
设置时间
通过如下函数设置 RTC 设备当前时间值:
rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)
参数 | 描述 |
---|---|
hour | 待设置生效的时 |
minute | 待设置生效的分 |
second | 待设置生效的秒 |
返回 | —— |
RT_EOK | 设置成功 |
-RT_ERROR | 失败,没有找到 rtc 设备 |
其他错误码 | 失败 |
使用示例如下所示:
/* 设置时间为11点15分50秒 */
set_time(11, 15, 50);
获取当前时间
使用到 C 标准库中的时间 API 获取时间:
time_t time(time_t *t)
参数 | 描述 |
---|---|
t | 时间数据指针 |
返回 | —— |
当前时间值 |
使用示例如下所示:
time_t now; /* 保存获取的当前时间值 */
/* 获取时间 */
now = time(RT_NULL);
/* 打印输出时间信息 */
rt_kprintf("%s\n", ctime(&now));
注意事项
目前系统内只允许存在一个 RTC 设备,且名称为 "rtc"
。
功能配置
启用 Soft RTC (软件模拟 RTC)
在 menuconfig 中可以启用使用软件模拟 RTC 的功能,这个模式非常适用于对时间精度要求不高,没有硬件 RTC 的产品。配置选项如下所示:
RT-Thread Components →
Device Drivers:
-*- Using RTC device drivers /* 使用 RTC 设备驱动 */
[ ] Using software simulation RTC device /* 使用软件模拟 RTC */
启用 NTP 时间自动同步
如果 RT-Thread 已接入互联网,可启用 NTP 时间自动同步功能,定期同步本地时间。
首先在 menuconfig 中按照如下选项开启 NTP 功能:
RT-Thread online packages →
IoT - internet of things →
netutils: Networking utilities for RT-Thread:
[*] Enable NTP(Network Time Protocol) client
开启 NTP 后 RTC 的自动同步功能将会自动开启,还可以设置同步周期和首次同步的延时时间:
RT-Thread Components →
Device Drivers:
-*- Using RTC device drivers /* 使用 RTC 设备驱动 */
[ ] Using software simulation RTC device /* 使用软件模拟 RTC */
[*] Using NTP auto sync RTC time /* 使用 NTP 自动同步 RTC 时间 */
(30) NTP first sync delay time(second) for network connect /* 首次执行 NTP 时间同步的延时。延时的目的在于,给网络连接预留一定的时间,尽量提高第一次执行 NTP 时间同步时的成功率。默认时间为 30S; */
(3600) NTP auto sync period(second) /* NTP 自动同步周期,单位为秒,默认一小时(即 3600S)同步一次。 */
FinSH 命令
输入 date
即可查看当前时间,大致效果如下:
msh />date
Fri Feb 16 01:11:56 2018
msh />
同样使用 date
命令,在命令后面再依次输入 年
月
日
时
分
秒
(中间空格隔开, 24H 制),设置当前时间为 2018-02-16 01:15:30,大致效果如下:
msh />date 2018 02 16 01 15 30
msh />
RTC 设备使用示例
RTC 设备的具体使用方式可以参考如下示例代码,首先设置了年月日时分秒信息,然后延时 3 秒后获取当前时间信息。
/*
* 程序清单:这是一个 RTC 设备使用例程
* 例程导出了 rtc_sample 命令到控制终端
* 命令调用格式:rtc_sample
* 程序功能:设置RTC设备的日期和时间,延时一段时间后获取当前时间并打印显示。
*/
#include <rtthread.h>
#include <rtdevice.h>
static int rtc_sample(int argc, char *argv[])
{
rt_err_t ret = RT_EOK;
time_t now;
/* 设置日期 */
ret = set_date(2018, 12, 3);
if (ret != RT_EOK)
{
rt_kprintf("set RTC date failed\n");
return ret;
}
/* 设置时间 */
ret = set_time(11, 15, 50);
if (ret != RT_EOK)
{
rt_kprintf("set RTC time failed\n");
return ret;
}
/* 延时3秒 */
rt_thread_mdelay(3000);
/* 获取时间 */
now = time(RT_NULL);
rt_kprintf("%s\n", ctime(&now));
return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(rtc_sample, rtc sample);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论