shark_rtc.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include <string.h>
  2. #include "gd32f3x0_rtc.h"
  3. #include "shark_rtc.h"
  4. #include "bsp/mcu_power_sleep.h"
  5. static void _init_rtc_date(void);
  6. void shark_rtc_init(void){
  7. /* enable PMU and BKPI clocks */
  8. rcu_periph_clock_enable(RCU_PMU);
  9. /* allow access to BKP domain */
  10. pmu_backup_write_enable();
  11. rcu_osci_on(RCU_IRC40K);
  12. rcu_osci_stab_wait(RCU_IRC40K);
  13. /* select RCU_RTCSRC_IRC40K as RTC clock source */
  14. rcu_rtc_clock_config(RCU_RTCSRC_IRC40K);
  15. /* enable RTC Clock */
  16. rcu_periph_clock_enable(RCU_RTC);
  17. rtc_register_sync_wait();
  18. _init_rtc_date();
  19. }
  20. static void _init_rtc_date(void){
  21. rtc_deinit();
  22. rtc_parameter_struct rtc_initpara;
  23. memset(&rtc_initpara, 0, sizeof(rtc_initpara));
  24. rtc_initpara.rtc_factor_asyn = 99;
  25. rtc_initpara.rtc_factor_syn = 399;
  26. rtc_initpara.rtc_display_format = RTC_24HOUR;
  27. rtc_initpara.rtc_am_pm = RTC_AM;
  28. rtc_init(&rtc_initpara);
  29. }
  30. uint8_t _bcd_to_int(uint8_t bcd){
  31. return (((bcd>>4)&0xF) *10) + (bcd&0xF);
  32. }
  33. uint8_t _int_to_bcd(uint8_t data){
  34. return ((((data/10) << 4)&0xF0) | ((data%10) & 0xF));
  35. }
  36. int shark_rtc_get_second(void){
  37. rtc_parameter_struct rtc_time;
  38. rtc_register_sync_wait();
  39. rtc_current_time_get(&rtc_time);
  40. return _bcd_to_int(rtc_time.rtc_second);
  41. }
  42. /* sencod must less than 59 */
  43. static int set_rtc_alarm(uint32_t sencod){
  44. rtc_parameter_struct rtc_initpara;
  45. rtc_register_sync_wait();
  46. rtc_current_time_get(&rtc_initpara);
  47. rtc_alarm_struct rtc_alarm;
  48. memset(&rtc_alarm, 0, sizeof(rtc_alarm));
  49. rtc_alarm.rtc_am_pm = rtc_initpara.rtc_am_pm;
  50. rtc_alarm.rtc_alarm_mask = RTC_ALARM_DATE_MASK | RTC_ALARM_HOUR_MASK | RTC_ALARM_MINUTE_MASK;
  51. rtc_alarm.rtc_alarm_day = rtc_initpara.rtc_date;
  52. rtc_alarm.rtc_alarm_hour = rtc_initpara.rtc_hour;
  53. rtc_alarm.rtc_alarm_minute = rtc_initpara.rtc_minute;
  54. rtc_alarm.rtc_weekday_or_date = rtc_initpara.rtc_day_of_week;
  55. uint8_t rtc_second = _bcd_to_int(rtc_initpara.rtc_second) + sencod;
  56. if (rtc_second >= 60){
  57. rtc_second -= 60;
  58. }
  59. rtc_alarm.rtc_alarm_second = _int_to_bcd(rtc_second);
  60. rtc_alarm_config(&rtc_alarm);
  61. return 0;
  62. }
  63. int shark_rtc_start_alarm(uint32_t second){
  64. if (rtc_register_sync_wait() != SUCCESS){
  65. return -1;
  66. }
  67. if (rtc_alarm_disable() != SUCCESS){
  68. return -1;
  69. }
  70. _init_rtc_date();
  71. set_rtc_alarm(second);
  72. rtc_interrupt_enable(RTC_INT_ALARM);
  73. rtc_alarm_enable();
  74. exti_init(EXTI_17,EXTI_INTERRUPT,EXTI_TRIG_RISING);
  75. nvic_irq_enable(RTC_IRQn,4,0);
  76. return 0;
  77. }
  78. void shark_rtc_set_backup(uint32_t v) {
  79. RTC_BKP0 = v;
  80. }
  81. uint32_t shark_rtc_get_backup(void){
  82. return RTC_BKP0;
  83. }
  84. void shark_rtc_stop_alarm(void){
  85. rtc_alarm_disable();
  86. rtc_flag_clear(RTC_STAT_ALRM0F);
  87. rtc_interrupt_disable(RTC_INT_ALARM);
  88. }
  89. int shark_rtc_update_alarm(uint32_t sencod){
  90. if (rtc_register_sync_wait() != SUCCESS){
  91. return -1;
  92. }
  93. if (rtc_alarm_disable() != SUCCESS){
  94. return -1;
  95. }
  96. rtc_alarm_disable();
  97. set_rtc_alarm(sencod);
  98. rtc_alarm_enable();
  99. return 0;
  100. }
  101. void RTC_IRQHandler(void){
  102. if(RESET != rtc_flag_get(RTC_STAT_ALRM0F)){
  103. rtc_flag_clear(RTC_STAT_ALRM0F);
  104. exti_flag_clear(EXTI_17);
  105. mcu_sleep_set_wakeup_source(WAKEUP_SOURCE_RTC);
  106. }
  107. }