RTC
简要说明
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 :1 | RTC运行状态 |
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, ¤t_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, ¤t_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;
}
}