Quellcode durchsuchen

转移定时睡眠函数位置

xuxinyi vor 1 Monat
Ursprung
Commit
85ebffa495
3 geänderte Dateien mit 92 neuen und 87 gelöschten Zeilen
  1. 2 0
      Core/Inc/RTC_SLEEP.h
  2. 88 33
      Core/Src/RTC_SLEEP.c
  3. 2 54
      Core/Src/main.c

+ 2 - 0
Core/Inc/RTC_SLEEP.h

@@ -43,4 +43,6 @@ extern RTC_TimeTypeDef IDLE_struct;
 //                      uint8_t weekday, uint8_t month, uint8_t date, uint8_t year);
 //
 // void RTC_Sleep_Enter_Fun(void);
+
+void Set_Alarm_After(uint32_t delay_seconds);
 #endif //RTC_SLEEP_H

+ 88 - 33
Core/Src/RTC_SLEEP.c

@@ -29,48 +29,103 @@ void RTC_SetDateTime(RTC_HandleTypeDef *hrtc, uint8_t hours, uint8_t minutes, ui
     HAL_RTC_SetDate(hrtc, &sDate, RTC_FORMAT_BCD);
 }
 
-// 读取RTC当前时间和日期
-void RTC_GetDateTime(RTC_HandleTypeDef *hrtc, RTC_DateTimeTypeDef *datetime) {
-    RTC_TimeTypeDef sTime = {0};
-    RTC_DateTypeDef sDate = {0};
+// // 读取RTC当前时间和日期
+// void RTC_GetDateTime(RTC_HandleTypeDef *hrtc, RTC_DateTimeTypeDef *datetime) {
+//     RTC_TimeTypeDef sTime = {0};
+//     RTC_DateTypeDef sDate = {0};
+//
+//     // 读取当前时间
+//     HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BCD);
+//     // 读取当前日期
+//     HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BCD);
+//
+//     // 存储到自定义结构体中
+//     datetime->hours = sTime.Hours;
+//     datetime->minutes = sTime.Minutes;
+//     datetime->seconds = sTime.Seconds;
+//     datetime->weekday = sDate.WeekDay;
+//     datetime->month = sDate.Month;
+//     datetime->date = sDate.Date;
+//     datetime->year = sDate.Year;
+// }
+//
+// void RTC_Sleep_Enter_Fun() {
+//     /* 调用独立的函数设置初始时间 */
+//     RTC_SetDateTime(&hrtc, 0x12, 0x00, 0x00,
+//                    RTC_WEEKDAY_MONDAY, RTC_MONTH_SEPTEMBER, 0x16, 0x25);
+//
+//     /* 获取当前时间用于设置闹钟 */
+//     RTC_TimeTypeDef currentTime = {0};
+//     HAL_RTC_GetTime(&hrtc, &currentTime, RTC_FORMAT_BCD);
+//
+//     /* 设置闹钟:50秒后触发 */
+//     RTC_AlarmTypeDef sAlarm = {0};
+//     sAlarm.AlarmTime.Hours = currentTime.Hours;
+//     sAlarm.AlarmTime.Minutes = currentTime.Minutes;
+//     sAlarm.AlarmTime.Seconds = (currentTime.Seconds + 50) % 60;
+//     sAlarm.Alarm = RTC_ALARM_A;
+//
+//     HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD);
+//
+//     /* 进入 STANDBY 模式 */
+//     __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);               // 清除唤醒标志
+//     HAL_PWR_EnterSTANDBYMode();                      // MCU 进入 STANDBY
+//
+//     // MCU 唤醒后会从 main() 重新开始运行
+// }
 
-    // 读取当前时间
-    HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BCD);
-    // 读取当前日期
-    HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BCD);
-
-    // 存储到自定义结构体中
-    datetime->hours = sTime.Hours;
-    datetime->minutes = sTime.Minutes;
-    datetime->seconds = sTime.Seconds;
-    datetime->weekday = sDate.WeekDay;
-    datetime->month = sDate.Month;
-    datetime->date = sDate.Date;
-    datetime->year = sDate.Year;
-}
 
-void RTC_Sleep_Enter_Fun() {
-    /* 调用独立的函数设置初始时间 */
-    RTC_SetDateTime(&hrtc, 0x12, 0x00, 0x00,
-                   RTC_WEEKDAY_MONDAY, RTC_MONTH_SEPTEMBER, 0x16, 0x25);
+/**
+ * @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;
 
-    /* 获取当前时间用于设置闹钟 */
-    RTC_TimeTypeDef currentTime = {0};
-    HAL_RTC_GetTime(&hrtc, &currentTime, RTC_FORMAT_BCD);
+    // 计算目标时间总秒数
+    uint32_t alarm_seconds = now_seconds + delay_seconds;
+    if (alarm_seconds >= 24*3600)
+        alarm_seconds -= 24*3600; // 跨天处理
 
-    /* 设置闹钟:50秒后触发 */
+    // 分解为时分秒
+    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 = currentTime.Hours;
-    sAlarm.AlarmTime.Minutes = currentTime.Minutes;
-    sAlarm.AlarmTime.Seconds = (currentTime.Seconds + 50) % 60;
+    sAlarm.AlarmTime.Hours   = hr;
+    sAlarm.AlarmTime.Minutes = min;
+    sAlarm.AlarmTime.Seconds = sec;
     sAlarm.Alarm = RTC_ALARM_A;
 
-    HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD);
+    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 模式 */
+    //     /* 进入 STANDBY 模式 */
     __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);               // 清除唤醒标志
     HAL_PWR_EnterSTANDBYMode();                      // MCU 进入 STANDBY
-
-    // MCU 唤醒后会从 main() 重新开始运行
 }
 
+

+ 2 - 54
Core/Src/main.c

@@ -231,55 +231,6 @@ int IsTimeElapsed(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *last, uint32_t inter
   return 0;         // 未超时
 }
 
-/**
- * @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);
-}
-
 
 
 
@@ -334,9 +285,6 @@ int main(void)
   Flash_Read_LoraAddr(&deviceInfo.loraDeviceAddress_H, &deviceInfo.loraDeviceAddress_L);
 
   printf("开始\r\n");
-  // HAL_Delay(10000);
-  int i = 0;
-  // HAL_Delay(10*1000);
   Set_Alarm_After(80);   // 50 秒后触发
 
   while (TRUE) {
@@ -470,7 +418,7 @@ int main(void)
           break;          //发送数据阶段
         case STEP_COMPLETE:
           deviceInfo.forwardBLAndLoraDataDuration = 0;
-          i = 0;
+          // i = 0;
           deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
           break;
 
@@ -478,7 +426,7 @@ int main(void)
           // 处理未知步骤
           receiveBlDataCount = 0;
           deviceInfo.forwardBLAndLoraDataDuration = 0;
-          i = 0;
+          // i = 0;
           deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
           break;
       }