Selaa lähdekoodia

修改传参,理论支持24小时睡眠唤醒

xuxinyi 1 kuukausi sitten
vanhempi
commit
6689f1cf6f
1 muutettua tiedostoa jossa 27 lisäystä ja 14 poistoa
  1. 27 14
      Core/Src/main.c

+ 27 - 14
Core/Src/main.c

@@ -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) {