| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- #include <string.h>
- #include "gd32f3x0_rtc.h"
- #include "shark_rtc.h"
- #include "bsp/mcu_power_sleep.h"
- static void _init_rtc_date(void);
- 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();
- _init_rtc_date();
- }
- static void _init_rtc_date(void){
- 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_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_register_sync_wait();
- 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_register_sync_wait();
- 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;
- }
- _init_rtc_date();
-
- 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_set_backup(uint32_t v) {
- RTC_BKP0 = v;
- }
- uint32_t shark_rtc_get_backup(void){
- return RTC_BKP0;
- }
- 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);
- }
- }
|