对于不同底层驱动的rtc操作实现,统一封装成本文所述hal rtc接口。 hal相关头文件位于目录:include/aos/hal。hal相关实现位于具体的mcu目录下,如:platform/mcu/stm32f1xx/hal/。

API列表

hal_rtc_init 初始化指定RTC
hal_rtc_get_time 获取指定RTC时间
hal_rtc_set_time 设置指定RTC时间
hal_rtc_finalize 关闭指定RTC

API详情

请参考include/aos/hal/rtc.h

相关宏

#define HAL_RTC_FORMAT_DEC 1   /*  Use Binary-Coded */
#define HAL_RTC_FORMAT_BCD 2   /* Use Decimal-Coded */

相关数据结构

rtc_dev_t

typedef struct {
    uint8_t      port;       /* rtc port */
    rtc_config_t config; /* rtc config */
    void        *priv;        /* priv data */
} rtc_dev_t;

rtc_config_t

typedef struct {
    uint8_t  format; /* time formart DEC or BCD */
} rtc_config_t;

rtc_time_t

typedef struct {
    uint8_t sec;     /* DEC format:value range from 0 to 59, BCD format:value range from 0x00 to 0x59 */
    uint8_t min;     /* DEC format:value range from 0 to 59, BCD format:value range from 0x00 to 0x59 */
    uint8_t hr;      /* DEC format:value range from 0 to 23, BCD format:value range from 0x00 to 0x23 */
    uint8_t weekday; /* DEC format:value range from 1 to  7, BCD format:value range from 0x01 to 0x07 */
    uint8_t date;    /* DEC format:value range from 1 to 31, BCD format:value range from 0x01 to 0x31 */
    uint8_t month;   /* DEC format:value range from 1 to 12, BCD format:value range from 0x01 to 0x12 */
    uint8_t year;    /* DEC format:value range from 0 to 99, BCD format:value range from 0x00 to 0x99 */
} rtc_time_t;

hal_rtc_init

初始化指定RTC

函数原型

int hal_rtc_init(rtc_dev_t *rtc);

参数

rtc_dev_t *rtc 入参 初始化指定RTC 用户自定义一个rtc_dev_t结构体

返回值

返回成功或失败, 返回0表示RTC初始化成功,非0表示失败

调用示例

#define RTC1_PORT_NUM 1
rtc_dev_t rtc1;
/* rtc port set */
rtc1.port = RTC1_PORT_NUM;
/* set to DEC format */
rtc1.config.format = HAL_RTC_FORMAT_DEC;
ret = hal_rtc_init(&rtc1);

hal_rtc_get_time

获取指定RTC时间

函数原型

int32_t hal_rtc_get_time(rtc_dev_t *rtc, rtc_time_t *time);

参数

rtc_dev_t *rtc 入参 RTC设备描述 使用hal_rtc_init时传入rtc_dev_t结构体
rtc_time_t *time 出参 要获取的时间 用户创建rtc_time_t结构体传入指针

返回值

返回成功或失败, 返回0表示RTC时间获取成功,非0表示失败

调用示例

rtc_time_t   time_buf;
memset(&time_buf, 0, sizeof(rtc_time_t));
ret = hal_rtc_get_time(&rtc1, &time_buf);

hal_rtc_set_time

设置指定RTC时间

函数原型

int32_t hal_rtc_set_time(rtc_dev_t *rtc, const rtc_time_t *time);

参数

rtc_dev_t *rtc 入参 RTC设备描述 使用hal_rtc_init时传入rtc_dev_t结构体
rtc_time_t *time 入参 要设置的时间 用户创建rtc_time_t结构体传入指针

返回值

返回成功或失败, 返回0表示RTC时间设定成功,非0表示失败

调用示例

rtc_time_t   time_buf;
time_buf.sec     = 0;
time_buf.min     = 0;
time_buf.hr      = 0;
time_buf.weekday = 2;
time_buf.date    = 1;
time_buf.month   = 1;
time_buf.year    = 2019;
/* set rtc1 time to 2019/1/1,00:00:00 */
ret = hal_rtc_set_time(&rtc1, &time_buf);

hal_rtc_finalize

关闭指定RTC

函数原型

int32_t hal_rtc_finalize(rtc_dev_t *rtc);

参数

rtc_dev_t *rtc 入参 RTC设备描述 使用hal_rtc_init时传入rtc_dev_t结构体

返回值

返回成功或失败, 返回0表示RTC关闭成功,非0表示失败

调用示例

hal_rtc_finalize(&rtc1);

使用

添加该组件

在相应的platform/mcu的mk内,添加对应hal文件的编译包含。

包含头文件

#include "aos/hal/rtc.h"

使用示例

#include <aos/hal/rtc.h>

#define RTC1_PORT_NUM 1

/* define dev */
rtc_dev_t rtc1;

int application_start(int argc, char *argv[])
{
    int ret = -1;

    rtc_config_t rtc_cfg;
    rtc_time_t   time_buf;

    /* rtc port set */
    rtc1.port = RTC1_PORT_NUM;

    /* set to DEC format */
    rtc1.config.format = HAL_RTC_FORMAT_DEC;

    /* init rtc1 with the given settings */
    ret = hal_rtc_init(&rtc1);
    if (ret != 0) {
        printf("rtc1 init error !\n");
    }

    time_buf.sec     = 0;
    time_buf.min     = 0;
    time_buf.hr      = 0;
    time_buf.weekday = 2;
    time_buf.date    = 1;
    time_buf.month   = 1;
    time_buf.year    = 2019;

    /* set rtc1 time to 2019/1/1,00:00:00 */
    ret = hal_rtc_set_time(&rtc1, &time_buf);
    if (ret != 0) {
        printf("rtc1 set time error !\n");
    }

    memset(&time_buf, 0, sizeof(rtc_time_t));

    /* get rtc current time */
    ret = hal_rtc_get_time(&rtc1, &time_buf);
    if (ret != 0) {
        printf("rtc1 get time error !\n");
    }

    /* finalize rtc1 */
    hal_rtc_finalize(&rtc1);

    while(1) {
        /* sleep 500ms */
        aos_msleep(500);
    };
}

注:port为逻辑端口号,其与物理端口号的对应关系见具体的对接实现

移植说明

新建hal_rtc_xxmcu.c和hal_wdg_xxmcu.h的文件,并将这两个文件放到platform/mcu/xxmcu/hal目录下。在hal_rtc_xxmcu.c中实现所需要的hal函数,hal_rtc_xxmcu.h中放置相关宏定义。 参考platform/mcu/stm32l4xx/src/STM32L496G-Discovery/hal/hal_rtc_stm32l4.c