/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file rtc.c * @brief This file provides code for the configuration * of the RTC instances. ****************************************************************************** * @attention * * Copyright (c) 2023 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 init function */ void MX_RTC_Init(void) { /* USER CODE BEGIN RTC_Init 0 */ /* USER CODE END RTC_Init 0 */ LL_RTC_InitTypeDef RTC_InitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /** Initializes the peripherals clock */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } /* Peripheral clock enable */ LL_RCC_EnableRTC(); /* USER CODE BEGIN RTC_Init 1 */ /* USER CODE END RTC_Init 1 */ RTC_InitStruct.HourFormat = LL_RTC_HOURFORMAT_24HOUR; RTC_InitStruct.AsynchPrescaler = 127; RTC_InitStruct.SynchPrescaler = 255; LL_RTC_Init(RTC, &RTC_InitStruct); /* USER CODE BEGIN RTC_Init 2 */ /* USER CODE END RTC_Init 2 */ } /* USER CODE BEGIN 1 */ LL_RTC_TimeTypeDef RTC_TimeStruct = {0}; LL_RTC_DateTypeDef RTC_DateStruct = {0}; void RTC_Config(void) { LL_RTC_InitTypeDef RTC_InitStruct = {0}; LL_RTC_WaitForSynchro(RTC); RTC_InitStruct.HourFormat = LL_RTC_HOURFORMAT_24HOUR; RTC_InitStruct.AsynchPrescaler = 127; RTC_InitStruct.SynchPrescaler = 255; LL_RTC_Init(RTC, &RTC_InitStruct); RTC_TimeStruct.TimeFormat = LL_RTC_HOURFORMAT_24HOUR; RTC_TimeStruct.Hours = 0x10; RTC_TimeStruct.Minutes = 0x25; RTC_TimeStruct.Seconds = 0x02; LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_TimeStruct); RTC_DateStruct.Year = 0x24; RTC_DateStruct.Month = LL_RTC_MONTH_NOVEMBER; RTC_DateStruct.Day = 0x05; RTC_DateStruct.WeekDay = LL_RTC_WEEKDAY_TUESDAY; LL_RTC_DATE_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_DateStruct); LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, 0x32F2); } void RTC_TimeShow(void) { /* Get the current Time */ RTC_TimeStruct.Hours = LL_RTC_TIME_GetHour(RTC); RTC_TimeStruct.Minutes = LL_RTC_TIME_GetMinute(RTC); RTC_TimeStruct.Seconds = LL_RTC_TIME_GetSecond(RTC); RTC_DateStruct.Year = LL_RTC_DATE_GetYear(RTC); RTC_DateStruct.Month = LL_RTC_DATE_GetMonth(RTC); RTC_DateStruct.Day = LL_RTC_DATE_GetDay(RTC); RTC_DateStruct.WeekDay = LL_RTC_DATE_GetWeekDay(RTC); SystemDataTimeUpdata( RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Day, RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds ); } void rtc_init() { if(0x32F2 != (LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR0))) { RTC_Config(); RTC_TimeShow(); } else { RTC_TimeShow(); } } void RTC_DataTimeSet(unsigned char aY, unsigned char aM, unsigned char aD, unsigned char aH, unsigned char aMin, unsigned char aSec, unsigned char aWk) { if((!aY)||(!aM)||(!aD))return; LL_RTC_WaitForSynchro(RTC); RTC_TimeStruct.Hours = aH; RTC_TimeStruct.Minutes = aMin; RTC_TimeStruct.Seconds = aSec; RTC_DateStruct.Year = aY; RTC_DateStruct.Month = aM; RTC_DateStruct.Day = aD; RTC_DateStruct.WeekDay = aWk; LL_RTC_DATE_Init(RTC,LL_RTC_FORMAT_BCD, &RTC_DateStruct); LL_RTC_TIME_Init(RTC,LL_RTC_FORMAT_BCD, &RTC_TimeStruct); LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, 0x32F2); } /* USER CODE END 1 */