shark_rtc.c 2.8 KB

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