全部文档
概述 硬件支持 快速开发指南 内核 驱动 通用组件 专业组件 常见问题

RTC设备用户开发指南

简介

本开发指南给用户提供了RTC的基本配置,工程构建编译、操作API介绍以及使用示例展示。

目录

配置指南

基础BSP配置--以STM32为例

建立工程文件

如果在提供的oneos源码中已经有适合的工程DEMO工程,则可以直接使用;如果没有请参照快速上手中的操作指南,新建一个适合的工程。

使用STM32CUBEMX配置硬件

  1. 打开 oneos\projects\xxxxx(project文件夹)\board\CubeMX_Config下 的 CUBE 工程文件(xxx.ioc);
  2. 在 CUBE 工程中进行 RTC 配置,如下图所示,红色框选中的地方依次选择RTC、勾选Activate Clock Source,然后点击③的Clock Configuration检查时钟选择,最后点击④的GENARATE CODE 生成代码; cube_clock_generate
  3. 确认是否修改时钟配置,如有修改,则使用CubeMX_Config\Src文件夹中main.c的void SystemClock_Config(void)替换掉同目录下bsp.c中的SystemClock_Config(void)。

使用 Menuconfig 配置工程选项

  1. 在对应的 oneos\projects\xxxxx(project文件夹) 目录下打开OneOS-Cube工具,在命令行输入 menuconfig 打开可视化配置界面;
  2. 通过[↑]、[↓]按键、空格、enter键或向右方向键选择 Drivers->RTC 下的Using RTC drivers选项,如下所示:
(Top) → Drivers→ RTC
[*] Using RTC drivers

3.Esc键退出menuconfig,注意保存所修改的设置。

使用 Scons 构建工程

在上一步打开的OneOS-Cube 工具命令行中输入 scons --ide=mdk5重新构建keil工程;

工程编译及实现

  1. 打开对应的 oneos\projects\xxxxx(project文件夹) 目录下的 project.uvprojx 工程文件,此时即可在工程中添加相应的应用程序。

  2. 如下图所示,在打开的工程application 文件夹中右键选择Manage Project Items,按图示添加提供的rtc_test.c文件(路径:oneos\drivers\driver_test);

    cube_clock_generate

  3. 编译并下载工程,运行程序;

  4. 打开串口工具如xshell等,通信成功后,即可通过输入rtc_set_test设置RTC的时间,输入rtc_get_test可获取当前的时间;

  5. 通过修改rtc_test.c中所设置的时间,查看效果。

  6. 如不再使用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

results matching ""

    No results matching ""