当前位置: 首页 > 文档资料 > YoC 编程基础 >

RTC

优质
小牛编辑
116浏览
2023-12-01

简要说明

RTC(Real_Time Clock)实时时钟为系统提供可靠的时间基准, 一般有独立的晶振和电源,保证主电源掉电时还可以工作。 RTC 一般可以提供日历格式的时间。

RTC也可以提供定时中断功能,用于实现定时器功能或者定时唤醒系统的功能。

接口描述

csi_rtc_initialize

rtc_handle_t csi_rtc_initialize(int32_t idx, rtc_event_cb_t cb_event)
  • 功能描述:

    • 通过索引号初始化对应的rtc实例,返回rtc实例的句柄。
  • 参数:

    • idx: rtc 实例的索引号。

    • cb_event: rtc 实例的事件回调函数(一般在中断上下文执行)。回调函数原型定义见rtc_event_cb_t。

      回调函数类型rtc_event_cb_t定义如下:

      typedef void (*rtc_event_cb_t)(int32_t idx, rtc_event_e event);
      

      其中idx为设备号,event 为传给回调函数的事件类型。

      rtc回调时间枚举类型见 rtc_evnet_e定义

  • 返回值:

    • NULL: 初始化失败。

    • 其它: 实例句柄。

rtc_evnet_e:

名字定义备注
RTC_EVENT_TIMER_INTRERRUPT产生中断事件

csi_rtc_uninitialize

int32_t csi_rtc_uninitialize(rtc_handle_t handle)
  • 功能描述:

    • rtc实例反初始化。该接口会停止rtc实例的工作,并且释放相关的软硬件资源。
  • 参数:

    • handle: 实例句柄。
  • 返回值:

    • 错误码。

csi_rtc_power_control

int32_t csi_rtc_power_control(rtc_handle_t handle, csi_power_stat_e state)
  • 功能描述:

    • 配置rtc实例的功耗模式。
  • 参数:

    • handle: 实例句柄。

    • state: rtc的功耗模式,参看 csi_power_stat_e的定义。

  • 返回值:

    • 错误码。

csi_rtc_get_capabilities

rtc_capabilities_t csi_rtc_get_capabilities(int32_t idx)
  • 功能描述:

    • 获取rtc实例支持的能力。
  • 参数:

    • idx: 设备号。
  • 返回值:

    • 描述rtc能力的结构体,rtc的能力定义见 rtc_capabilities_t 。

rtc_capabilities_t:

名字定义备注
interrupt_mode :1支持中断模式
wrap_mode :1支持循环模式

csi_rtc_set_time

int32_t csi_rtc_set_time(rtc_handle_t handle, const struct tm *rtctime)
  • 功能描述:

    • 设置rtc时间。
  • 参数:

    • handle: 实例句柄。

    • rtctime: RTC时间,参看 struct tm的定义。

  • 返回值:

    • 错误码。

struct tm:

名字定义备注
int tm_sec秒–取值区间为[0,59]
int tm_min分 - 取值区间为[0,59]
int tm_hour时 - 取值区间为[0,23]
int tm_mday天 - 取值区间为[1,31]
int tm_mon月份(从一月开始,0代表一月) - 取值区间为[0,11]
int tm_year年份,其值从0开始,代表1900年

csi_rtc_get_time

int32_t csi_rtc_get_time(rtc_handle_t handle, struct tm *rtctime)
  • 功能描述:

    • 获取rtc时间。
  • 参数:

    • handle: 实例句柄。

    • rtctime: RTC时间,参看 struct_tm 的定义。

  • 返回值:

    • 错误码。

csi_rtc_start

int32_t csi_rtc_start(rtc_handle_t handle)
  • 功能描述:

    • rtc计时开始。
  • 参数:

    • handle: 实例句柄。
  • 返回值:

    • 错误码。

csi_rtc_stop

int32_t csi_rtc_stop(rtc_handle_t handle)
  • 功能描述:

    • rtc计时停止。
  • 参数:

    • handle: 实例句柄。
  • 返回值:

    • 错误码。

csi_rtc_get_status

rtc_status_t csi_rtc_get_status(rtc_handle_t handle)
  • 功能描述:

    • 获取当前时刻rtc的状态。
  • 参数:

    • handle: 实例句柄。
  • 返回值:

    • rtc状态的结构体,rtc的状态定义见 rtc_status_t 。

rtc_status_t:

名字定义备注
active :1RTC运行状态

csi_rtc_set_alarm

int32_t csi_rtc_set_alarm(rtc_handle_t handle, const struct tm *rtctime)
  • 功能描述:

    • 配置rtc实例的闹钟日期。
  • 参数:

    • handle: 实例句柄。

    • rtctime: rtc日期,参看 struct tm 的定义。

  • 返回值:

    • 错误码。

csi_rtc_enable_alarm

int32_t csi_rtc_enable_alarm(rtc_handle_t handle, uint8_t flag)
  • 功能描述:

    • rtc闹钟上报使能。
  • 参数:

    • handle: 实例句柄。

    • flag: 1-使能,0-禁止。

  • 返回值:

    • 错误码。

示例

RTC示例1

static rtc_handle_t rtc_handle;
static volatile uint8_t cb_rtc_flag;

extern void mdelay(uint32_t ms);
define RTC_TIME_SECS 5

void rtc_event_cb_fun(int32_t idx, rtc_event_e event)
{
    if (event == RTC_EVENT_TIMER_INTRERRUPT) {
        cb_rtc_flag = 1;
    }
}
void example_main(void)
{
    int32_t ret;
    struct tm current_time, last_time;
    uint32_t secs = 0;

    rtc_capabilities_t cap;

    //get rtc capabilities
    cap = csi_rtc_get_capabilities(0);
    printf("rtc %s interrupt mode\n",cap.interrupt_mode==1 ? "support":"not support");
    printf("rtc %s wrap mode\n",cap.wrap_mode==1 ? "support":"not support");

    rtc_handle = csi_rtc_initialize(0, rtc_event_cb_fun);

    if (rtc_handle == NULL) {
        printf("csi_rtc_initialize error\n");
        return;
    }
    ret = csi_rtc_start(rtc_handle);

    if (ret < 0) {
        printf("csi_rtc_start error\n");
        return;
    }


    current_time.tm_sec     = 55;
    current_time.tm_min     = 59;
    current_time.tm_hour    = 23;
    current_time.tm_mday    = 28;
    current_time.tm_mon     = 1;
    current_time.tm_year    = 100;

    ret = csi_rtc_set_time(rtc_handle, &current_time);

    if (ret < 0) {
        printf("csi_rtc_set_time error\n");
        return;
    }

    mdelay(RTC_TIME_SECS * 1000);
    ret = csi_rtc_get_time(rtc_handle, &last_time);

    if (ret < 0) {
        printf("csi_rtc_get_time error\n");
        return ;
    }

    if (current_time.tm_sec != last_time.tm_sec) {
        secs += (last_time.tm_sec - current_time.tm_sec);
    }

    if (current_time.tm_min != last_time.tm_min) {
        secs += (last_time.tm_min - current_time.tm_min) * 60;
    }

    if (current_time.tm_hour != last_time.tm_hour) {
        secs += (last_time.tm_hour - current_time.tm_hour) * 60 * 60;
    }

    if (current_time.tm_mday != last_time.tm_mday) {
        secs += (last_time.tm_mday - current_time.tm_mday) * 60 * 60 * 24;
    }

    if ((secs <= (RTC_TIME_SECS + 1)) && (secs = (RTC_TIME_SECS - 1))) {
        last_time.tm_year = last_time.tm_year + 1900;
        last_time.tm_mon = last_time.tm_mon + 1;
        printf("The time is %d-%d-%d %d:%d:%d\n", last_time.tm_year, last_time.tm_mon, last_time.tm_mday, last_time.tm_hour, last_time.tm_min, last_time.tm_sec);
    } else {
        printf("get rtc timer error\n");
        return ;
    }
    ret = csi_rtc_stop(rtc_handle);

    if (ret < 0) {
        printf("csi_rtc_stop error\n");
        return;
    }
    ret = csi_rtc_uninitialize(rtc_handle);

    if (ret < 0) {
        printf("csi_rtc_uninitialize error\n");
        return;
    }
}

RTC示例2

static rtc_handle_t rtc_handle;
static volatile uint8_t cb_rtc_flag;

extern void mdelay(uint32_t ms);
define RTC_TIME_SECS 5
define RTC_TIMEOUT_SECS 15
define RTC_TIMEOUT2_SECS 1

void rtc_event_cb_fun(int32_t idx, rtc_event_e event)
{
    if (event == RTC_EVENT_TIMER_INTRERRUPT) {
        cb_rtc_flag = 1;
    }
}
void example_main(void)
{
    int32_t ret;
    struct tm current_time,last_time,set_time;
    uint32_t secs = 0;

    rtc_handle = csi_rtc_initialize(0, rtc_event_cb_fun);

    if (rtc_handle == NULL) {
        printf("csi_rtc_initialize error\n");
        return;
    }
    ret = csi_rtc_start(rtc_handle);

    if (ret < 0) {
        printf("csi_rtc_start error\n");
        return;
    }

    current_time.tm_sec     = 55;
    current_time.tm_min     = 59;
    current_time.tm_hour    = 23;
    current_time.tm_mday    = 28;
    current_time.tm_mon     = 1;
    current_time.tm_year    = 100;

    ret = csi_rtc_set_time(rtc_handle, &current_time);

    if (ret < 0) {
        printf("csi_rtc_set_time error\n");
        return;
    }

    mdelay(RTC_TIME_SECS * 1000);

    set_time.tm_sec     = 10;
    ret = csi_rtc_set_alarm(rtc_handle, &set_time);

    if (ret < 0) {
        printf("csi_rtc_set_timeout error\n");
        return;
    }

    printf("test rtc timeout %ds\n", RTC_TIMEOUT_SECS);

    ret = csi_rtc_enable_alarm(rtc_handle, 1);

    if (ret < 0) {
        printf("csi_rtc_enable_alarm error\n");
        return;
    }
    while( csi_rtc_get_status(rtc_handle).active);

    mdelay(RTC_TIMEOUT2_SECS * 1000  + 2000);

    if (cb_rtc_flag == 1) {

        ret = csi_rtc_get_time(rtc_handle, &last_time);

        if (ret < 0) {
            printf("csi_rtc_get_time error\n");
            return ;
        }

        if (set_time.tm_sec != last_time.tm_sec) {
            secs += (last_time.tm_sec - set_time.tm_sec);
        }

        if (set_time.tm_min != last_time.tm_min) {
            secs += (last_time.tm_min - set_time.tm_min) * 60;
        }

        if (set_time.tm_hour != last_time.tm_hour) {
            secs += (last_time.tm_hour - set_time.tm_hour) * 60 * 60;
        }

        if (set_time.tm_mday != last_time.tm_mday) {
            secs += (last_time.tm_mday - set_time.tm_mday) * 60 * 60 * 24;
        }

        last_time.tm_year = last_time.tm_year + 1900;
        last_time.tm_mon = last_time.tm_mon + 1;
        printf("The time is %d-%d-%d %d:%d:%d\n", last_time.tm_year, last_time.tm_mon, last_time.tm_mday, last_time.tm_hour, last_time.tm_min, last_time.tm_sec);
        ret = csi_rtc_enable_alarm(rtc_handle, 0);

        if (ret < 0) {
            printf("csi_rtc_enable_alarm error\n");
            return ;
        }

        return;
    } else {
        return ;
    }
    ret = csi_rtc_stop(rtc_handle);

    if (ret < 0) {
        printf("csi_rtc_stop error\n");
        return;
    }
    ret = csi_rtc_uninitialize(rtc_handle);

    if (ret < 0) {
        printf("csi_rtc_uninitialize error\n");
        return;
    }
}