Ds1302.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "Ds1302.h"
  2. #include "string.h"
  3. #include "gpio.h"
  4. #include "stdio.h"
  5. #include "ac780x_rtc.h"
  6. #include "ac780x.h"
  7. DateTime g_dateTime;
  8. /**
  9. * RTCCallBackFunc
  10. *
  11. * @param[in] wparam: reserved
  12. * @param[in] lparam: reserved
  13. * @return 0: success, other: error value
  14. *
  15. * @brief 中断回调函数
  16. * 改变LED输出,使得LED闪烁
  17. */
  18. void RTCCallBackFunc(void *device, uint32_t wpara, uint32_t lpara)
  19. {
  20. if (wpara & RTC_SC_RPIF_Msk) //预分频中断
  21. {
  22. }
  23. if (wpara & RTC_SC_RTIF_Msk) //RTC溢出中断
  24. {
  25. //printf("g_timer0Cnt:%d \r\n", g_timer0Cnt);
  26. DS1302_UpdateTime();
  27. }
  28. }
  29. /**
  30. * RTC_Timeout1s
  31. *
  32. * @param[in] none
  33. * @return none
  34. *
  35. * @brief 配置RTC计时1S,时钟源为Bus clock
  36. */
  37. void RTC_Timeout1s(void)
  38. {
  39. uint32_t tmpMod = 239999;
  40. uint32_t tmpPrescalerValue = 99; //(99+1)*(239999+1)/24000000 = 1s
  41. RTC_ConfigType RTCConfig;
  42. memset(&RTCConfig,0,sizeof(RTCConfig));
  43. RTCConfig.clockSource = RTC_CLOCK_APB; //时钟源选择:0:Bus clk (demo板上总线时钟为24M);
  44. //1: LSI 32KHz; 2: External OSC; 3:Internal 8M;
  45. RTCConfig.periodValue = tmpMod;
  46. RTCConfig.psrInterruptEn = DISABLE;
  47. RTCConfig.rtcInterruptEn = ENABLE;
  48. RTCConfig.psrValue = tmpPrescalerValue; //time = (pre+1)*(mod+1)/clk
  49. RTCConfig.rtcOutEn = DISABLE;
  50. RTCConfig.callBack = RTCCallBackFunc;
  51. RTC_Init(&RTCConfig); //配置RTC
  52. }
  53. void DS1302_Init(void)
  54. {
  55. g_dateTime.year = 24;
  56. g_dateTime.month = 7;
  57. g_dateTime.day = 5;
  58. g_dateTime.hour = 15;
  59. g_dateTime.minute = 0;
  60. g_dateTime.second = 0;
  61. RTC_Timeout1s();
  62. }
  63. uint8_t Ds1302_ReadReg(uint8_t _address)
  64. {
  65. return 0;
  66. }
  67. void DS1302_SetTime(DateTime* pDateTime)
  68. {
  69. }
  70. void DS1302_UpdateTime()
  71. {
  72. g_dateTime.second++;
  73. if(g_dateTime.second >= 60){
  74. g_dateTime.second=0;
  75. g_dateTime.minute++;
  76. if(g_dateTime.minute >= 60){
  77. g_dateTime.minute=0;
  78. g_dateTime.hour++;
  79. if(g_dateTime.hour>= 24){
  80. g_dateTime.hour=0;
  81. g_dateTime.day++;
  82. }
  83. }
  84. }
  85. //if(g_dateTime.day>= 3){
  86. //
  87. //}
  88. }
  89. void DS1302_PrintDateTime()
  90. {
  91. printf("DS1302 DateTime:[%d][%d][%d] \r\n", g_dateTime.hour, g_dateTime.minute, g_dateTime.second);
  92. }
  93. void DS1302_DeInit(void)
  94. {
  95. }