RTC_SLEEP.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //
  2. // Created by EDZ on 25-9-16.
  3. //
  4. #include "../Inc/RTC_SLEEP.h"
  5. RTC_SOS_key_struct SOS_key_struct = {
  6. .SOS_key_Count = 0,
  7. .SOS_key_Duration = 0,
  8. .sosCheckActive = FALSE
  9. };
  10. RTC_DateTimeTypeDef firstPressTime;
  11. // 单独的RTC时间和日期设置函数
  12. void RTC_SetDateTime(RTC_HandleTypeDef *hrtc, uint8_t hours, uint8_t minutes, uint8_t seconds,
  13. uint8_t weekday, uint8_t month, uint8_t date, uint8_t year) {
  14. RTC_TimeTypeDef sTime = {0};
  15. RTC_DateTypeDef sDate = {0};
  16. // 设置时间
  17. sTime.Hours = hours;
  18. sTime.Minutes = minutes;
  19. sTime.Seconds = seconds;
  20. HAL_RTC_SetTime(hrtc, &sTime, RTC_FORMAT_BCD);
  21. // 设置日期
  22. sDate.WeekDay = weekday;
  23. sDate.Month = month;
  24. sDate.Date = date;
  25. sDate.Year = year;
  26. HAL_RTC_SetDate(hrtc, &sDate, RTC_FORMAT_BCD);
  27. }
  28. // 读取RTC当前时间和日期
  29. void RTC_GetDateTime(RTC_HandleTypeDef *hrtc, RTC_DateTimeTypeDef *datetime) {
  30. RTC_TimeTypeDef sTime = {0};
  31. RTC_DateTypeDef sDate = {0};
  32. // 读取当前时间
  33. HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BCD);
  34. // 读取当前日期
  35. HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BCD);
  36. // 存储到自定义结构体中
  37. datetime->hours = sTime.Hours;
  38. datetime->minutes = sTime.Minutes;
  39. datetime->seconds = sTime.Seconds;
  40. datetime->weekday = sDate.WeekDay;
  41. datetime->month = sDate.Month;
  42. datetime->date = sDate.Date;
  43. datetime->year = sDate.Year;
  44. }
  45. void RTC_Sleep_Enter_Fun() {
  46. /* 调用独立的函数设置初始时间 */
  47. RTC_SetDateTime(&hrtc, 0x12, 0x00, 0x00,
  48. RTC_WEEKDAY_MONDAY, RTC_MONTH_SEPTEMBER, 0x16, 0x25);
  49. /* 获取当前时间用于设置闹钟 */
  50. RTC_TimeTypeDef currentTime = {0};
  51. HAL_RTC_GetTime(&hrtc, &currentTime, RTC_FORMAT_BCD);
  52. /* 设置闹钟:50秒后触发 */
  53. RTC_AlarmTypeDef sAlarm = {0};
  54. sAlarm.AlarmTime.Hours = currentTime.Hours;
  55. sAlarm.AlarmTime.Minutes = currentTime.Minutes;
  56. sAlarm.AlarmTime.Seconds = (currentTime.Seconds + 50) % 60;
  57. sAlarm.Alarm = RTC_ALARM_A;
  58. HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD);
  59. /* 进入 STANDBY 模式 */
  60. __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标志
  61. HAL_PWR_EnterSTANDBYMode(); // MCU 进入 STANDBY
  62. // MCU 唤醒后会从 main() 重新开始运行
  63. }