ls1c_rtc.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-05-06 sundm75 first version
  9. */
  10. #include "ls1c.h"
  11. #include "ls1c_public.h"
  12. #include "ls1c_rtc.h"
  13. #define LS1C_SEC_OFFSET (4)
  14. #define LS1C_MIN_OFFSET (10)
  15. #define LS1C_HOUR_OFFSET (16)
  16. #define LS1C_DAY_OFFSET (21)
  17. #define LS1C_MONTH_OFFSET (26)
  18. #define LS1C_SEC_MASK (0x3f)
  19. #define LS1C_MIN_MASK (0x3f)
  20. #define LS1C_HOUR_MASK (0x1f)
  21. #define LS1C_DAY_MASK (0x1f)
  22. #define LS1C_MONTH_MASK (0x3f)
  23. #define LS1C_YEAR_MASK (0xff)
  24. #define ls1c_get_sec(t) (((t) >> LS1C_SEC_OFFSET) & LS1C_SEC_MASK)
  25. #define ls1c_get_min(t) (((t) >> LS1C_MIN_OFFSET) & LS1C_MIN_MASK)
  26. #define ls1c_get_hour(t) (((t) >> LS1C_HOUR_OFFSET) & LS1C_HOUR_MASK)
  27. #define ls1c_get_day(t) (((t) >> LS1C_DAY_OFFSET) & LS1C_DAY_MASK)
  28. #define ls1c_get_month(t) (((t) >> LS1C_MONTH_OFFSET) & LS1C_MONTH_MASK)
  29. int RTC_SetTime(RTC_TypeDef *hrtc, RTC_TimeTypeDef *sTime)
  30. {
  31. hrtc->SYS_TOYWRITE0
  32. = (sTime->Month << LS1C_MONTH_OFFSET)
  33. | (sTime->Date << LS1C_DAY_OFFSET)
  34. | (sTime->Hours << LS1C_HOUR_OFFSET)
  35. | (sTime->Minutes << LS1C_MIN_OFFSET)
  36. | (sTime->Seconds << LS1C_SEC_OFFSET);
  37. hrtc->SYS_TOYWRITE1 = sTime->Year % 100;
  38. printf("\r\ntoy_read0 = 0x%x, toy_read1 = 0x%x.\r\n", hrtc->SYS_TOYREAD0, hrtc->SYS_TOYREAD1);
  39. return 0;
  40. }
  41. int RTC_GetTime(RTC_TypeDef *hrtc, RTC_TimeTypeDef *sTime)
  42. {
  43. unsigned long toy_read0, toy_read1;
  44. toy_read0 = hrtc->SYS_TOYREAD0;
  45. toy_read1 = hrtc->SYS_TOYREAD1;
  46. sTime->Seconds = ls1c_get_sec(toy_read0);
  47. sTime->Minutes = ls1c_get_min(toy_read0);
  48. sTime->Hours = ls1c_get_hour(toy_read0);
  49. sTime->Date = ls1c_get_day(toy_read0);
  50. sTime->Month = ls1c_get_month(toy_read0);
  51. sTime->Year = toy_read1 & LS1C_YEAR_MASK;
  52. return 0 ;
  53. }
  54. unsigned char RTC_IsLeapYear(unsigned int nYear)
  55. {
  56. if((nYear % 4U) != 0U)
  57. {
  58. return 0U;
  59. }
  60. if((nYear % 100U) != 0U)
  61. {
  62. return 1U;
  63. }
  64. if((nYear % 400U) == 0U)
  65. {
  66. return 1U;
  67. }
  68. else
  69. {
  70. return 0U;
  71. }
  72. }
  73. unsigned char RTC_WeekDayNum(unsigned long nYear, unsigned char nMonth, unsigned char nDay)
  74. {
  75. unsigned long year = 0U, weekday = 0U;
  76. year = 2000U + nYear;
  77. if(nMonth < 3U)
  78. {
  79. /*D = { [(23 x month)/9] + day + 4 + year + [(year-1)/4] - [(year-1)/100] + [(year-1)/400] } mod 7*/
  80. weekday = (((23U * nMonth)/9U) + nDay + 4U + year + ((year-1U)/4U) - ((year-1U)/100U) + ((year-1U)/400U)) % 7U;
  81. }
  82. else
  83. {
  84. /*D = { [(23 x month)/9] + day + 4 + year + [year/4] - [year/100] + [year/400] - 2 } mod 7*/
  85. weekday = (((23U * nMonth)/9U) + nDay + 4U + year + (year/4U) - (year/100U) + (year/400U) - 2U ) % 7U;
  86. }
  87. return (unsigned char)weekday;
  88. }