5.8 RTC 设备
2026/7/19大约 2 分钟设备驱动驱动RTC实时时钟闹钟
5.8 RTC 设备
📚 本节导读
学习时长:约 20 分钟
难度级别:⭐⭐☆☆☆
前置知识:第 5.1 节设备驱动框架
🎯 学习目标
- 理解 OneOS RTC 设备驱动框架
- 掌握 RTC 时间的读写操作
- 了解 RTC 闹钟设置方法
- 掌握 RTC 设备的使用流程
一、概述
RTC(Real-Time Clock)是 MCU 内置的实时时钟外设。OneOS RTC 设备驱动位于 drivers/rtc/,核心头文件 rtc.h(第 32-44 行定义 IOCTL 命令和 API,包括 rtc_get/rtc_set/set_date/set_time/set_rtc_alarm),提供统一的时间管理接口。
二、核心数据结构
2.1 时间结构体
typedef struct
{
os_uint16_t year; /* 年(如 2026) */
os_uint8_t month; /* 月(1-12) */
os_uint8_t day; /* 日(1-31) */
os_uint8_t hour; /* 时(0-23) */
os_uint8_t minute; /* 分(0-59) */
os_uint8_t second; /* 秒(0-59) */
os_uint8_t weekday; /* 星期(0-6,0=周日) */
} os_rtc_time_t;2.2 RTC 设备
typedef struct os_device_rtc
{
struct os_device parent; /* 继承自 os_device_t */
const struct os_rtc_ops *ops; /* RTC 操作接口 */
os_rtc_time_t time; /* 当前时间 */
void (*alarm_callback)(void *arg); /* 闹钟回调 */
} os_device_rtc_t;三、核心 API
/* 打开/关闭 RTC 设备 */
os_device_t *os_device_open(const char *name);
os_err_t os_device_close(os_device_t *dev);
/* 获取当前时间 */
os_err_t os_rtc_get_time(os_device_t *dev, os_rtc_time_t *time);
/* 设置当前时间 */
os_err_t os_rtc_set_time(os_device_t *dev, os_rtc_time_t *time);
/* 设置闹钟 */
os_err_t os_rtc_set_alarm(os_device_t *dev, os_rtc_time_t *alarm_time,
void (*callback)(void *arg));
/* 获取 Unix 时间戳 */
os_uint32_t os_rtc_get_timestamp(os_device_t *dev);四、使用示例
#include <device.h>
#include <rtc.h>
void rtc_alarm_callback(void *arg)
{
os_kprintf("RTC Alarm triggered!\r\n");
}
void rtc_demo(void)
{
os_device_t *rtc;
os_rtc_time_t time;
/* 打开 RTC 设备 */
rtc = os_device_open("rtc");
if (rtc == NULL) return;
/* 设置当前时间 */
time.year = 2026;
time.month = 7;
time.day = 19;
time.hour = 10;
time.minute = 30;
time.second = 0;
os_rtc_set_time(rtc, &time);
/* 读取当前时间 */
os_rtc_get_time(rtc, &time);
os_kprintf("Current: %04d-%02d-%02d %02d:%02d:%02d\r\n",
time.year, time.month, time.day,
time.hour, time.minute, time.second);
/* 设置闹钟(10秒后触发) */
time.second += 10;
os_rtc_set_alarm(rtc, &time, rtc_alarm_callback);
}📝 本节小结
- RTC 设备提供独立电池供电的实时时钟管理
os_rtc_time_t结构体包含年月日时分秒- 支持闹钟设置和回调通知
- 可通过
os_rtc_get_timestamp获取 Unix 时间戳