#include "include.h" void rtc_clock_init(void) { // printf("rtc_clock_init\n"); tm_t tm; tm.year = 2025; tm.mon = 1; tm.day = 1; tm.hour = 9; tm.min = 0; tm.sec = 0; //tm.weekday = get_weekday(tm.year, tm.mon, tm.day); RTCCNT = tm_to_time(tm); } //多少秒后闹钟响 AT(.text.rtc) void rtc_set_alarm_relative_time(u32 nsec) { tm_t rtc_tm; rtc_tm = time_to_tm(RTCCNT); //更新时间结构体 RTCALM = tm_to_time(rtc_tm) + nsec; //设置闹钟相对于当前时间n秒后 } //设置多少秒后闹钟唤醒 AT(.text.rtc) void rtc_set_alarm_wakeup(u32 nsec) { uint rtccon3 = RTCCON3; RTCCON0 |= BIT(18); RTCCON0 = (RTCCON0 & ~(0X3<<8)) | (0X2<<8); RTCCPND = BIT(17); //clear RTC alarm pending RTCCON9 = BIT(0); //clear alarm pending rtc_set_alarm_relative_time(nsec); rtccon3 |= BIT(8); //RTC alarm wakeup enable RTCCON3 = rtccon3; } //关闭闹钟 AT(.text.rtc) void rtc_alarm_disable(void) { // printf("%s\n", __func__); RTCCPND = BIT(17); //clear RTC alarm pending RTCCON9 = BIT(8); //clear alarm pending rtc_set_alarm_relative_time(0xffff); RTCCON3 &= ~BIT(8); } /* * 设置RTC时间 * 输入:tm结构体指针 */ void rtc_clock_set(tm_t rtc_tm) { RTCCNT = tm_to_time(rtc_tm); } /* * 设置RTC时间 * 输入:timestamp格林威治时间(UTC/GMT) * time_zone时区(范围0~24, 表示西十二区(UTC_W12) ~ 东十二区(UTC_E12)) */ void rtc_clock_timestamp_set(u32 timestamp, u8 time_zone) { int zone_offset = (time_zone - UTC_0); u32 day_offset = (2020 - 1970)*365 + (2020 - 1970)/4; //RTCCNT时间从2020年开始, 标准的是从1970年开始算,需计算偏移 u32 offset = day_offset*86400; RTCCNT = timestamp + zone_offset*3600 - offset; } /* * 获取RTC时间 * 输入: 空 输出: rtc_tm结构体 */ tm_t rtc_clock_get(void) { return time_to_tm(RTCCNT); } //休眠后后RTC校准时回调函数 AT(.sleep_text.rtc) void rtc_clock_calc_notify(void) { sys_cb.rtc_cal_cnt++; }