/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file rtc.c * @brief This file provides code for the configuration * of the RTC instances. ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "rtc.h" /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ RTC_HandleTypeDef hrtc; /* RTC init function */ void MX_RTC_Init(void) { /* USER CODE BEGIN RTC_Init 0 */ /* USER CODE END RTC_Init 0 */ /* USER CODE BEGIN RTC_Init 1 */ /* USER CODE END RTC_Init 1 */ /** Initialize RTC Only */ hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv = 127; hrtc.Init.SynchPrediv = 255; hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; if (HAL_RTC_Init(&hrtc) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN RTC_Init 2 */ /* USER CODE END RTC_Init 2 */ } void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle) { RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; if(rtcHandle->Instance==RTC) { /* USER CODE BEGIN RTC_MspInit 0 */ /* USER CODE END RTC_MspInit 0 */ /** Initializes the peripherals clock */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } /* RTC clock enable */ __HAL_RCC_RTC_ENABLE(); /* USER CODE BEGIN RTC_MspInit 1 */ /* USER CODE END RTC_MspInit 1 */ } } void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle) { if(rtcHandle->Instance==RTC) { /* USER CODE BEGIN RTC_MspDeInit 0 */ /* USER CODE END RTC_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_RTC_DISABLE(); /* USER CODE BEGIN RTC_MspDeInit 1 */ /* USER CODE END RTC_MspDeInit 1 */ } } /* USER CODE BEGIN 1 */ // 存储参考时间的时间戳(秒数) static uint32_t s_ReferenceTimestamp = 0; /** * @brief 设定参考时间:从现在开始计时 * 调用此函数后,计时器清零,重新开始 */ void SetReferenceTime(void) { RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; // 获取当前RTC时间 HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); // 转换为总秒数(简化计算,仅用于计时差) s_ReferenceTimestamp = (sDate.Year * 365 + sDate.Month * 31 + sDate.Date) * 24 * 3600 + sTime.Hours * 3600 + sTime.Minutes * 60 + sTime.Seconds; } /** * @brief 获取从参考时间到现在经过的时间(时:分:秒) * @param hours [out] 经过的小时数 * @param minutes [out] 经过的分钟数 * @param seconds [out] 经过的秒数 */ void GetElapsedTime_HMS(uint8_t *hours, uint8_t *minutes, uint8_t *seconds) { RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; uint32_t currentTimestamp, elapsed; // 获取当前时间并转为秒数 HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); uint32_t nowSeconds = (sDate.Year * 365 + sDate.Month * 31 + sDate.Date) * 24 * 3600 + sTime.Hours * 3600 + sTime.Minutes * 60 + sTime.Seconds; // 计算经过的秒数 elapsed = nowSeconds - s_ReferenceTimestamp; // 转换为 时:分:秒 *seconds = elapsed % 60; *minutes = (elapsed / 60) % 60; *hours = (elapsed / 3600); } /* USER CODE END 1 */