RTC_SLEEP.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. //
  2. // Created by EDZ on 25-9-16.
  3. //
  4. #include "../Inc/RTC_SLEEP.h"
  5. RTC_TimeTypeDef SOS_key_struct = {0};
  6. RTC_TimeTypeDef JUGE_key_struct = {0};
  7. RTC_TimeTypeDef Online_struct = {0};
  8. RTC_TimeTypeDef SOS_struct = {0};
  9. RTC_TimeTypeDef IDLE_struct = {0};
  10. // 单独的RTC时间和日期设置函数
  11. void RTC_SetDateTime(RTC_HandleTypeDef *hrtc, uint8_t hours, uint8_t minutes, uint8_t seconds,
  12. uint8_t weekday, uint8_t month, uint8_t date, uint8_t year) {
  13. RTC_TimeTypeDef sTime = {0};
  14. RTC_DateTypeDef sDate = {0};
  15. // 设置时间
  16. sTime.Hours = hours;
  17. sTime.Minutes = minutes;
  18. sTime.Seconds = seconds;
  19. HAL_RTC_SetTime(hrtc, &sTime, RTC_FORMAT_BCD);
  20. // 设置日期
  21. sDate.WeekDay = weekday;
  22. sDate.Month = month;
  23. sDate.Date = date;
  24. sDate.Year = year;
  25. HAL_RTC_SetDate(hrtc, &sDate, RTC_FORMAT_BCD);
  26. }
  27. // // 读取RTC当前时间和日期
  28. // void RTC_GetDateTime(RTC_HandleTypeDef *hrtc, RTC_DateTimeTypeDef *datetime) {
  29. // RTC_TimeTypeDef sTime = {0};
  30. // RTC_DateTypeDef sDate = {0};
  31. //
  32. // // 读取当前时间
  33. // HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BCD);
  34. // // 读取当前日期
  35. // HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BCD);
  36. //
  37. // // 存储到自定义结构体中
  38. // datetime->hours = sTime.Hours;
  39. // datetime->minutes = sTime.Minutes;
  40. // datetime->seconds = sTime.Seconds;
  41. // datetime->weekday = sDate.WeekDay;
  42. // datetime->month = sDate.Month;
  43. // datetime->date = sDate.Date;
  44. // datetime->year = sDate.Year;
  45. // }
  46. //
  47. // void RTC_Sleep_Enter_Fun() {
  48. // /* 调用独立的函数设置初始时间 */
  49. // RTC_SetDateTime(&hrtc, 0x12, 0x00, 0x00,
  50. // RTC_WEEKDAY_MONDAY, RTC_MONTH_SEPTEMBER, 0x16, 0x25);
  51. //
  52. // /* 获取当前时间用于设置闹钟 */
  53. // RTC_TimeTypeDef currentTime = {0};
  54. // HAL_RTC_GetTime(&hrtc, &currentTime, RTC_FORMAT_BCD);
  55. //
  56. // /* 设置闹钟:50秒后触发 */
  57. // RTC_AlarmTypeDef sAlarm = {0};
  58. // sAlarm.AlarmTime.Hours = currentTime.Hours;
  59. // sAlarm.AlarmTime.Minutes = currentTime.Minutes;
  60. // sAlarm.AlarmTime.Seconds = (currentTime.Seconds + 50) % 60;
  61. // sAlarm.Alarm = RTC_ALARM_A;
  62. //
  63. // HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD);
  64. //
  65. // /* 进入 STANDBY 模式 */
  66. // __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标志
  67. // HAL_PWR_EnterSTANDBYMode(); // MCU 进入 STANDBY
  68. //
  69. // // MCU 唤醒后会从 main() 重新开始运行
  70. // }
  71. /**
  72. * @brief 设置指定秒数后的闹钟
  73. * @param delay_seconds 延迟秒数(最大支持 24*3600-1 秒,即一天内)
  74. */
  75. void Set_Alarm_After(uint32_t delay_seconds)
  76. {
  77. if (delay_seconds == 0 || delay_seconds >= 24*3600)
  78. {
  79. // 超过 RTC 最大范围,报错或截断
  80. printf("Error: delay_seconds must be 1 ~ 86399\r\n");
  81. return;
  82. }
  83. RTC_TimeTypeDef now;
  84. RTC_DateTypeDef date;
  85. // 读当前时间
  86. HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
  87. HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN); // 必须读 Date 解锁
  88. // 将当前时间转换为总秒数
  89. uint32_t now_seconds = now.Hours * 3600 + now.Minutes * 60 + now.Seconds;
  90. // 计算目标时间总秒数
  91. uint32_t alarm_seconds = now_seconds + delay_seconds;
  92. if (alarm_seconds >= 24*3600)
  93. alarm_seconds -= 24*3600; // 跨天处理
  94. // 分解为时分秒
  95. uint8_t hr = alarm_seconds / 3600;
  96. uint8_t min = (alarm_seconds % 3600) / 60;
  97. uint8_t sec = alarm_seconds % 60;
  98. // 设置闹钟
  99. RTC_AlarmTypeDef sAlarm = {0};
  100. sAlarm.AlarmTime.Hours = hr;
  101. sAlarm.AlarmTime.Minutes = min;
  102. sAlarm.AlarmTime.Seconds = sec;
  103. sAlarm.Alarm = RTC_ALARM_A;
  104. if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
  105. {
  106. Error_Handler();
  107. }
  108. // printf("Now : %02d:%02d:%02d\r\n", now.Hours, now.Minutes, now.Seconds);
  109. // printf("NextAlarm: %02d:%02d:%02d\r\n", hr, min, sec);
  110. // /* 进入 STANDBY 模式 */
  111. __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标志
  112. HAL_PWR_EnterSTANDBYMode(); // MCU 进入 STANDBY
  113. }