RTC设备
RTC简介
RTC (Real-Time Clock)实时时钟可以提供精确的实时时间,它可以用于产生年、月、日、时、分、秒等信息。UC8288采用内部32.768KHz时钟作为RTC时钟源。并且添加RTC报警功能,设置RTC报警日期和时间后在RTC设备计时到达后会产生一个RTC报警中断。
访问RTC设备
应用程序通过 RTC 设备管理接口来访问 RTC 硬件,相关接口如下所示:
函数 | 描述 |
---|---|
void rc32k_init(); |
初始化32.768K时钟 |
void rtc_init(); |
RTC设备初始化 |
void rtc_enable(); |
使能RTC设备 |
void rtc_disable(); |
关闭RTC设备 |
void rtc_set_time(); |
设置RTC日期和时间 |
void rtc_get_time(); |
获取RTC日期和时间 |
void rtc_set_alarm(); |
设置RTC报警日期和时间 |
void rtc_get_alarm(); |
获取RTC报警日期和时间 |
void rtc_enable_alarm_interrupt(); |
使能RTC报警中断 |
void rtc_disable_alarm_interrupt(); |
关闭RTC报警中断 |
void rtc_clear_alarm_pending(); |
清除RTC报警中断标志 |
初始化RTC—32K时钟设备
通过如下程序初始化32.768K时钟设备:
void rc32k_init(void);
初始化RTC设备
通过如下函数初始化RTC设备:
void rtc_init(RTC_TypeDef *RTCx);
使能RTC设备
通过如下函数使能RTC设备:
void rtc_enable(RTC_TypeDef *RTCx);
失能RTC设备
通过如下函数关闭RTC设备:
void rtc_disable(RTC_TypeDef *RTCx);
设置日期时间
通过如下函数设置 RTC 设备当前日期和时间:
void rtc_set_time(RTC_TypeDef *RTCx, rtc_time_t *rtc_time);
获取当前时间
通过如下函数设置 RTC 获取当前时间值:
void rtc_get_time(RTC_TypeDef *RTCx, rtc_time_t *rtc_time);
设置报警时间
通过如下函数设置 RTC 报警时间:
void rtc_set_alarm(RTC_TypeDef *RTCx, rtc_alarm_t *rtc_alarm);
获取报警时间
通过如下函数获取 RTC 报警时间:
void rtc_get_alarm(RTC_TypeDef *RTCx, rtc_alarm_t *rtc_alarm);
使能RTC报警中断
通过如下函数使能RTC报警中断:
void rtc_enable_alarm_interrupt(RTC_TypeDef *RTCx);
关闭RTC报警中断
通过如下函数关闭RTC报警中断:
void rtc_disable_alarm_interrupt(RTC_TypeDef *RTCx);
清除RTC报警中断标志
通过如下函数清除RTC报警中断标志:
void rtc_clear_alarm_pending(RTC_TypeDef *RTCx);
RTC设备使用示例
RTC 设备的具体使用方式可以参考如下示例代码:
#include <stdio.h>
#include "int.h"
#include "event.h"
#include "rtc.h"
static void delay_ms(uint32_t nms)
{
for(int i=0;i<nms;i++)
{
for(int j=0;j<9600;j++)
{
asm("nop");
}
}
}
void ISR_RTC(void)
{
rtc_disable_alarm_interrupt(UC_RTC);
rtc_clear_alarm_pending(UC_RTC);
printf("RTC INTERRUPT!\n");
}
int main(int argc, char **argv)
{
rtc_time_t rtc_time;
rtc_alarm_t rtc_alarm;
printf("rtc demo begin\r\n");
rc32k_init();
rtc_init(UC_RTC);
rtc_get_time(UC_RTC, &rtc_time);
printf("init time: %d-%d-%d %d:%d:%d week=%d\r\n", rtc_time.year, rtc_time.mon, rtc_time.day, rtc_time.hour, rtc_time.min, rtc_time.sec, rtc_time.week);
rtc_time.year = 2020;
rtc_time.mon = 1;
rtc_time.day = 1;
rtc_time.week = RTC_WDAY_WED;
rtc_time.hour = 12;
rtc_time.min = 0;
rtc_time.sec = 0;
printf("set time: %d-%d-%d %d:%d:%d week=%d\r\n", rtc_time.year, rtc_time.mon, rtc_time.day, rtc_time.hour, rtc_time.min, rtc_time.sec, rtc_time.week);
rtc_set_time(UC_RTC, &rtc_time);
rtc_get_time(UC_RTC, &rtc_time);
printf("get time: %d-%d-%d %d:%d:%d week=%d\r\n", rtc_time.year, rtc_time.mon, rtc_time.day, rtc_time.hour, rtc_time.min, rtc_time.sec, rtc_time.week);
rtc_alarm.year = 2020;
rtc_alarm.mon = 1;
rtc_alarm.day = 1;
rtc_alarm.week = RTC_WDAY_WED;
rtc_alarm.hour = 12;
rtc_alarm.min = 0;
rtc_alarm.sec = 10;
rtc_alarm.mask = RTC_AM_YEAR | RTC_AM_MON | RTC_AM_DAY | RTC_AM_WEEK;//repeat every day
printf("set alarm: %d-%d-%d %d:%d:%d week=%d mask=%08x\r\n", rtc_alarm.year, rtc_alarm.mon, rtc_alarm.day, rtc_alarm.hour, rtc_alarm.min, rtc_alarm.sec, rtc_alarm.week, rtc_alarm.mask);
rtc_set_alarm(UC_RTC, &rtc_alarm);
rtc_get_alarm(UC_RTC, &rtc_alarm);
printf("get alarm: %d-%d-%d %d:%d:%d week=%d mask=%08x\r\n", rtc_alarm.year, rtc_alarm.mon, rtc_alarm.day, rtc_alarm.hour, rtc_alarm.min, rtc_alarm.sec, rtc_alarm.week, rtc_alarm.mask);
rtc_enable_alarm_interrupt(UC_RTC);
int_enable(); //enable global interrupt
while(1)
{
delay_ms(1000);
rtc_get_time(UC_RTC, &rtc_time);
printf("get time: %d-%d-%d %d:%d:%d week=%d\r\n", rtc_time.year, rtc_time.mon, rtc_time.day, rtc_time.hour, rtc_time.min, rtc_time.sec, rtc_time.week);
}
return 0;
}