#include #include "gd32f3x0_rtc.h" #include "shark_rtc.h" #include "bsp/mcu_power_sleep.h" void shark_rtc_init(void){ /* enable PMU and BKPI clocks */ rcu_periph_clock_enable(RCU_PMU); /* allow access to BKP domain */ pmu_backup_write_enable(); rcu_osci_on(RCU_IRC40K); rcu_osci_stab_wait(RCU_IRC40K); /* select RCU_RTCSRC_IRC40K as RTC clock source */ rcu_rtc_clock_config(RCU_RTCSRC_IRC40K); /* enable RTC Clock */ rcu_periph_clock_enable(RCU_RTC); rtc_register_sync_wait(); rtc_deinit(); rtc_parameter_struct rtc_initpara; memset(&rtc_initpara, 0, sizeof(rtc_initpara)); rtc_initpara.rtc_factor_asyn = 99; rtc_initpara.rtc_factor_syn = 399; rtc_initpara.rtc_display_format = RTC_24HOUR; rtc_initpara.rtc_am_pm = RTC_AM; rtc_initpara.rtc_date = 1; rtc_init(&rtc_initpara); } uint8_t _bcd_to_int(uint8_t bcd){ return (((bcd>>4)&0xF) *10) + (bcd&0xF); } uint8_t _int_to_bcd(uint8_t data){ return ((((data/10) << 4)&0xF0) | ((data%10) & 0xF)); } int shark_rtc_get_second(void){ rtc_parameter_struct rtc_time; rtc_current_time_get(&rtc_time); return _bcd_to_int(rtc_time.rtc_second); } /* sencod must less than 59 */ static int set_rtc_alarm(uint32_t sencod){ rtc_parameter_struct rtc_initpara; rtc_current_time_get(&rtc_initpara); rtc_alarm_struct rtc_alarm; memset(&rtc_alarm, 0, sizeof(rtc_alarm)); rtc_alarm.rtc_am_pm = rtc_initpara.rtc_am_pm; rtc_alarm.rtc_alarm_mask = RTC_ALARM_DATE_MASK | RTC_ALARM_HOUR_MASK | RTC_ALARM_MINUTE_MASK; rtc_alarm.rtc_alarm_day = rtc_initpara.rtc_date; rtc_alarm.rtc_alarm_hour = rtc_initpara.rtc_hour; rtc_alarm.rtc_alarm_minute = rtc_initpara.rtc_minute; rtc_alarm.rtc_weekday_or_date = rtc_initpara.rtc_day_of_week; uint8_t rtc_second = _bcd_to_int(rtc_initpara.rtc_second) + sencod; if (rtc_second >= 60){ rtc_second -= 60; } rtc_alarm.rtc_alarm_second = _int_to_bcd(rtc_second); rtc_alarm_config(&rtc_alarm); return 0; } int shark_rtc_start_alarm(uint32_t second){ if (rtc_register_sync_wait() != SUCCESS){ return -1; } if (rtc_alarm_disable() != SUCCESS){ return -1; } set_rtc_alarm(second); rtc_interrupt_enable(RTC_INT_ALARM); rtc_alarm_enable(); exti_init(EXTI_17,EXTI_INTERRUPT,EXTI_TRIG_RISING); nvic_irq_enable(RTC_IRQn,4,0); return 0; } void shark_rtc_stop_alarm(void){ rtc_alarm_disable(); rtc_flag_clear(RTC_STAT_ALRM0F); rtc_interrupt_disable(RTC_INT_ALARM); } int shark_rtc_update_alarm(uint32_t sencod){ if (rtc_register_sync_wait() != SUCCESS){ return -1; } if (rtc_alarm_disable() != SUCCESS){ return -1; } rtc_alarm_disable(); set_rtc_alarm(sencod); rtc_alarm_enable(); return 0; } void RTC_IRQHandler(void){ if(RESET != rtc_flag_get(RTC_STAT_ALRM0F)){ rtc_flag_clear(RTC_STAT_ALRM0F); exti_flag_clear(EXTI_17); mcu_sleep_set_wakeup_source(WAKEUP_SOURCE_RTC); } }