shark_rtc.c 2.5 KB

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