|
@@ -231,11 +231,19 @@ int IsTimeElapsed(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *last, uint32_t inter
|
|
|
return 0; // 未超时
|
|
return 0; // 未超时
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-#include "stdio.h"
|
|
|
|
|
-
|
|
|
|
|
-void Set_Alarm_After_20s(void)
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * @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_TimeTypeDef now;
|
|
|
RTC_DateTypeDef date;
|
|
RTC_DateTypeDef date;
|
|
|
|
|
|
|
@@ -243,23 +251,27 @@ void Set_Alarm_After_20s(void)
|
|
|
HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
|
|
HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
|
|
|
HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN); // 必须读 Date 解锁
|
|
HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN); // 必须读 Date 解锁
|
|
|
|
|
|
|
|
- // 计算目标时间
|
|
|
|
|
- uint8_t sec = now.Seconds + 50;
|
|
|
|
|
- uint8_t min = now.Minutes;
|
|
|
|
|
- uint8_t hr = now.Hours;
|
|
|
|
|
|
|
+ // 将当前时间转换为总秒数
|
|
|
|
|
+ uint32_t now_seconds = now.Hours * 3600 + now.Minutes * 60 + now.Seconds;
|
|
|
|
|
|
|
|
- if (sec >= 60) { sec -= 60; min++; }
|
|
|
|
|
- if (min >= 60) { min -= 60; hr++; }
|
|
|
|
|
- if (hr >= 24) { hr = 0; }
|
|
|
|
|
|
|
+ // 计算目标时间总秒数
|
|
|
|
|
+ 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};
|
|
RTC_AlarmTypeDef sAlarm = {0};
|
|
|
sAlarm.AlarmTime.Hours = hr;
|
|
sAlarm.AlarmTime.Hours = hr;
|
|
|
sAlarm.AlarmTime.Minutes = min;
|
|
sAlarm.AlarmTime.Minutes = min;
|
|
|
sAlarm.AlarmTime.Seconds = sec;
|
|
sAlarm.AlarmTime.Seconds = sec;
|
|
|
sAlarm.Alarm = RTC_ALARM_A;
|
|
sAlarm.Alarm = RTC_ALARM_A;
|
|
|
|
|
|
|
|
- // 设置闹钟中断
|
|
|
|
|
- if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
|
|
|
|
|
|
|
+ if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
|
|
|
{
|
|
{
|
|
|
Error_Handler();
|
|
Error_Handler();
|
|
|
}
|
|
}
|
|
@@ -272,6 +284,7 @@ void Set_Alarm_After_20s(void)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
|
/* USER CODE END 0 */
|
|
/* USER CODE END 0 */
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -324,7 +337,7 @@ int main(void)
|
|
|
// HAL_Delay(10000);
|
|
// HAL_Delay(10000);
|
|
|
int i = 0;
|
|
int i = 0;
|
|
|
// HAL_Delay(10*1000);
|
|
// HAL_Delay(10*1000);
|
|
|
- Set_Alarm_After_20s();
|
|
|
|
|
|
|
+ Set_Alarm_After(80); // 50 秒后触发
|
|
|
|
|
|
|
|
while (TRUE) {
|
|
while (TRUE) {
|
|
|
|
|
|