RTC设备用户开发指南
简介
本开发指南给用户提供了RTC的基本配置,工程构建编译、操作API介绍以及使用示例展示。
目录
配置指南
基础BSP配置--以STM32为例
建立工程文件
如果在提供的oneos源码中已经有适合的工程DEMO工程,则可以直接使用;如果没有请参照快速上手中的操作指南,新建一个适合的工程。
使用STM32CUBEMX配置硬件
- 打开 oneos\projects\xxxxx(project文件夹)\board\CubeMX_Config下 的 CUBE 工程文件(xxx.ioc);
- 在 CUBE 工程中进行 RTC 配置,如下图所示,红色框选中的地方依次选择RTC、勾选Activate Clock Source,然后点击③的Clock Configuration检查时钟选择,最后点击④的GENARATE CODE 生成代码;
- 确认是否修改时钟配置,如有修改,则使用CubeMX_Config\Src文件夹中main.c的void SystemClock_Config(void)替换掉同目录下bsp.c中的SystemClock_Config(void)。
使用 Menuconfig 配置工程选项
- 在对应的 oneos\projects\xxxxx(project文件夹) 目录下打开OneOS-Cube工具,在命令行输入 menuconfig 打开可视化配置界面;
- 通过[↑]、[↓]按键、空格、enter键或向右方向键选择 Drivers->RTC 下的Using RTC drivers选项,如下所示:
(Top) → Drivers→ RTC
[*] Using RTC drivers
3.Esc键退出menuconfig,注意保存所修改的设置。
使用 Scons 构建工程
在上一步打开的OneOS-Cube 工具命令行中输入 scons --ide=mdk5重新构建keil工程;
工程编译及实现
打开对应的 oneos\projects\xxxxx(project文件夹) 目录下的 project.uvprojx 工程文件,此时即可在工程中添加相应的应用程序。
如下图所示,在打开的工程application 文件夹中右键选择Manage Project Items,按图示添加提供的rtc_test.c文件(路径:oneos\drivers\driver_test);
编译并下载工程,运行程序;
打开串口工具如xshell等,通信成功后,即可通过输入rtc_set_test设置RTC的时间,输入rtc_get_test可获取当前的时间;
通过修改rtc_test.c中所设置的时间,查看效果。
如不再使用RTC设备,可再次使用OneOS-Cube工具取消,在Drivers->RTC 下取消Using RTC drivers 的选择,保存设置后重新生成工程即可。
RTC API介绍
API 列表
访问RTC设备的API接口如下表所示:
接口 | 说明 |
---|---|
set_date() | 设置日期,年、月、日 |
set_time() | 设置时间,时、分、秒 |
rtc_get() | 获取1970年01月01日 0:00:00到现在的秒数 |
set_date
该函数用于设置日期的年、月、日信息,函数原型如下:
os_err_t set_date(os_uint32_t year, os_uint32_t month, os_uint32_t day)
参数 | 说明 |
---|---|
year | 待设置生效的年份 |
month | 待设置生效的月份 |
day | 待设置生效的日 |
返回 | 说明 |
OS_EOK | 设置成功 |
OS_ERROR | 设置失败(未发现 RTC 设备、输入参数区间错误等) |
其他错误码 | 失败 |
set_time
该函数用于设置时、分、秒信息,函数原型如下:
os_err_t set_time(os_uint32_t hour, os_uint32_t minute, os_uint32_t second)
参数 | 说明 |
---|---|
hour | 待设置生效的时 |
minute | 待设置生效的分 |
second | 待设置生效的秒 |
返回 | 说明 |
OS_EOK | 设置成功 |
OS_ERROR | 设置失败(未发现 RTC 设备、输入参数区间错误等) |
其他错误码 | 失败 |
rtc_get
获取1970年01月01日 0:00:00到现在的秒数,函数原型如下:
time_t rtc_get(void)
参数 | 说明 |
---|---|
void | 无 |
返回 | 说明 |
time_t | 1970年01月01日 0:00:00到现在的秒数 |
使用示例
示例代码实现两个函数,其中static int rtc_set_test(int argc, char argv[])实现对时间的设置,static void rtc_get_test(int argc, char argv[])函数实现读取当前的时间值。如下所示:
#include <stdlib.h>
#include <os_task.h>
#include <device.h>
#include <os_errno.h>
#include <sys/time.h>
#include <rtc/rtc.h>
#include <drv_log.h>
#include <os_util.h>
#include <dlog.h>
#include <os_clock.h>
#ifdef OS_USING_SHELL
#include <shell.h>
#endif
#define DBG_TAG "rtc_test"
static int rtc_set_test(int argc, char *argv[])
{
os_err_t ret = OS_EOK;
time_t now;
/* Set date */
ret = set_date(2020, 6, 1);
if (ret != OS_EOK)
{
LOG_E(DBG_TAG,"set RTC date failed %d", (int)ret);
return ret;
}
os_task_msleep(200);
/* Set time */
ret = set_time(9, 30, 0);
if (ret != OS_EOK)
{
LOG_E(DBG_TAG,"set RTC time failed %d", (int)ret);
return ret;
}
os_task_msleep(3000);
/* Get time */
now = rtc_get();
os_kprintf("%s\r\n", ctime(&now));
return ret;
}
SH_CMD_EXPORT(rtc_set_test, rtc_set_test, "set rtc time");
static void rtc_get_test(int argc, char *argv[])
{
time_t now;
/* Get time */
now = rtc_get();
os_kprintf("%s\r\n", ctime(&now));
}
SH_CMD_EXPORT(rtc_get_test, rtc_get_test, "get rtc time");
运行结果如下:
sh />rtc_get_test
Sat Jan 1 00:30:20 2000
sh />
sh />rtc_set_test
Mon Jun 1 09:30:03 2020
sh />
sh />rtc_get_test
Mon Jun 1 09:30:05 2020
sh />
sh />rtc_get_test
Mon Jun 1 09:30:10 2020