| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- //
- // Created by EDZ on 25-9-16.
- //
- #include "../Inc/RTC_SLEEP.h"
- RTC_TimeTypeDef SOS_key_struct = {0};
- RTC_TimeTypeDef JUGE_key_struct = {0};
- RTC_TimeTypeDef Online_struct = {0};
- RTC_TimeTypeDef SOS_struct = {0};
- RTC_TimeTypeDef IDLE_struct = {0};
- // 单独的RTC时间和日期设置函数
- void RTC_SetDateTime(RTC_HandleTypeDef *hrtc, uint8_t hours, uint8_t minutes, uint8_t seconds,
- uint8_t weekday, uint8_t month, uint8_t date, uint8_t year) {
- RTC_TimeTypeDef sTime = {0};
- RTC_DateTypeDef sDate = {0};
- // 设置时间
- sTime.Hours = hours;
- sTime.Minutes = minutes;
- sTime.Seconds = seconds;
- HAL_RTC_SetTime(hrtc, &sTime, RTC_FORMAT_BCD);
- // 设置日期
- sDate.WeekDay = weekday;
- sDate.Month = month;
- sDate.Date = date;
- sDate.Year = year;
- HAL_RTC_SetDate(hrtc, &sDate, RTC_FORMAT_BCD);
- }
- /**
- * @brief 设置指定秒数后的闹钟
- * @param delay_seconds 延迟秒数(最大支持 24*3600-1 秒,即一天内)
- */
- void Set_Alarm_After(uint32_t delay_seconds)
- {
- if (delay_seconds == 0 || delay_seconds >= 24*3600)
- {
- // 超过 RTC 最大范围,报错或截断
- printf("Error: delay_seconds must be 1 ~ 86399\r\n");
- return;
- }
- RTC_TimeTypeDef now;
- RTC_DateTypeDef date;
- // 读当前时间
- HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
- HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN); // 必须读 Date 解锁
- // 将当前时间转换为总秒数
- uint32_t now_seconds = now.Hours * 3600 + now.Minutes * 60 + now.Seconds;
- // 计算目标时间总秒数
- uint32_t alarm_seconds = now_seconds + delay_seconds;
- if (alarm_seconds >= 24*3600)
- alarm_seconds -= 24*3600; // 跨天处理
- // 分解为时分秒
- uint8_t hr = alarm_seconds / 3600;
- uint8_t min = (alarm_seconds % 3600) / 60;
- uint8_t sec = alarm_seconds % 60;
- // 设置闹钟
- RTC_AlarmTypeDef sAlarm = {0};
- sAlarm.AlarmTime.Hours = hr;
- sAlarm.AlarmTime.Minutes = min;
- sAlarm.AlarmTime.Seconds = sec;
- sAlarm.Alarm = RTC_ALARM_A;
- if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
- {
- Error_Handler();
- }
- // printf("Now : %02d:%02d:%02d\r\n", now.Hours, now.Minutes, now.Seconds);
- // printf("NextAlarm: %02d:%02d:%02d\r\n", hr, min, sec);
- // /* 进入 STANDBY 模式 */
- __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标志
- HAL_PWR_EnterSTANDBYMode(); // MCU 进入 STANDBY
- }
|