STM32H735xx HAL User Manual
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32h7xx_ll_rtc.c 00004 * @author MCD Application Team 00005 * @brief RTC LL module driver. 00006 ****************************************************************************** 00007 * @attention 00008 * 00009 * Copyright (c) 2017 STMicroelectronics. 00010 * All rights reserved. 00011 * 00012 * This software is licensed under terms that can be found in the LICENSE file 00013 * in the root directory of this software component. 00014 * If no LICENSE file comes with this software, it is provided AS-IS. 00015 * 00016 ****************************************************************************** 00017 */ 00018 #if defined(USE_FULL_LL_DRIVER) 00019 00020 /* Includes ------------------------------------------------------------------*/ 00021 #include "stm32h7xx_ll_rtc.h" 00022 #include "stm32h7xx_ll_cortex.h" 00023 #ifdef USE_FULL_ASSERT 00024 #include "stm32_assert.h" 00025 #else 00026 #define assert_param(expr) ((void)0U) 00027 #endif 00028 00029 /** @addtogroup STM32H7xx_LL_Driver 00030 * @{ 00031 */ 00032 00033 #if defined(RTC) 00034 00035 /** @addtogroup RTC_LL 00036 * @{ 00037 */ 00038 00039 /* Private types -------------------------------------------------------------*/ 00040 /* Private variables ---------------------------------------------------------*/ 00041 /* Private constants ---------------------------------------------------------*/ 00042 /** @addtogroup RTC_LL_Private_Constants 00043 * @{ 00044 */ 00045 /* Default values used for prescaler */ 00046 #define RTC_ASYNCH_PRESC_DEFAULT 0x0000007FU 00047 #define RTC_SYNCH_PRESC_DEFAULT 0x000000FFU 00048 00049 /* Values used for timeout */ 00050 #define RTC_INITMODE_TIMEOUT 1000U /* 1s when tick set to 1ms */ 00051 #define RTC_SYNCHRO_TIMEOUT 1000U /* 1s when tick set to 1ms */ 00052 /** 00053 * @} 00054 */ 00055 00056 /* Private macros ------------------------------------------------------------*/ 00057 /** @addtogroup RTC_LL_Private_Macros 00058 * @{ 00059 */ 00060 00061 #define IS_LL_RTC_HOURFORMAT(__VALUE__) (((__VALUE__) == LL_RTC_HOURFORMAT_24HOUR) \ 00062 || ((__VALUE__) == LL_RTC_HOURFORMAT_AMPM)) 00063 00064 #define IS_LL_RTC_ASYNCH_PREDIV(__VALUE__) ((__VALUE__) <= 0x7FU) 00065 00066 #define IS_LL_RTC_SYNCH_PREDIV(__VALUE__) ((__VALUE__) <= 0x7FFFU) 00067 00068 #define IS_LL_RTC_FORMAT(__VALUE__) (((__VALUE__) == LL_RTC_FORMAT_BIN) \ 00069 || ((__VALUE__) == LL_RTC_FORMAT_BCD)) 00070 00071 #define IS_LL_RTC_TIME_FORMAT(__VALUE__) (((__VALUE__) == LL_RTC_TIME_FORMAT_AM_OR_24) \ 00072 || ((__VALUE__) == LL_RTC_TIME_FORMAT_PM)) 00073 00074 #define IS_LL_RTC_HOUR12(__HOUR__) (((__HOUR__) > 0U) && ((__HOUR__) <= 12U)) 00075 #define IS_LL_RTC_HOUR24(__HOUR__) ((__HOUR__) <= 23U) 00076 #define IS_LL_RTC_MINUTES(__MINUTES__) ((__MINUTES__) <= 59U) 00077 #define IS_LL_RTC_SECONDS(__SECONDS__) ((__SECONDS__) <= 59U) 00078 00079 #define IS_LL_RTC_WEEKDAY(__VALUE__) (((__VALUE__) == LL_RTC_WEEKDAY_MONDAY) \ 00080 || ((__VALUE__) == LL_RTC_WEEKDAY_TUESDAY) \ 00081 || ((__VALUE__) == LL_RTC_WEEKDAY_WEDNESDAY) \ 00082 || ((__VALUE__) == LL_RTC_WEEKDAY_THURSDAY) \ 00083 || ((__VALUE__) == LL_RTC_WEEKDAY_FRIDAY) \ 00084 || ((__VALUE__) == LL_RTC_WEEKDAY_SATURDAY) \ 00085 || ((__VALUE__) == LL_RTC_WEEKDAY_SUNDAY)) 00086 00087 #define IS_LL_RTC_DAY(__DAY__) (((__DAY__) >= 1U) && ((__DAY__) <= 31U)) 00088 00089 #define IS_LL_RTC_MONTH(__MONTH__) (((__MONTH__) >= 1U) && ((__MONTH__) <= 12U)) 00090 00091 #define IS_LL_RTC_YEAR(__YEAR__) ((__YEAR__) <= 99U) 00092 00093 #define IS_LL_RTC_ALMA_MASK(__VALUE__) (((__VALUE__) == LL_RTC_ALMA_MASK_NONE) \ 00094 || ((__VALUE__) == LL_RTC_ALMA_MASK_DATEWEEKDAY) \ 00095 || ((__VALUE__) == LL_RTC_ALMA_MASK_HOURS) \ 00096 || ((__VALUE__) == LL_RTC_ALMA_MASK_MINUTES) \ 00097 || ((__VALUE__) == LL_RTC_ALMA_MASK_SECONDS) \ 00098 || ((__VALUE__) == LL_RTC_ALMA_MASK_ALL)) 00099 00100 #define IS_LL_RTC_ALMB_MASK(__VALUE__) (((__VALUE__) == LL_RTC_ALMB_MASK_NONE) \ 00101 || ((__VALUE__) == LL_RTC_ALMB_MASK_DATEWEEKDAY) \ 00102 || ((__VALUE__) == LL_RTC_ALMB_MASK_HOURS) \ 00103 || ((__VALUE__) == LL_RTC_ALMB_MASK_MINUTES) \ 00104 || ((__VALUE__) == LL_RTC_ALMB_MASK_SECONDS) \ 00105 || ((__VALUE__) == LL_RTC_ALMB_MASK_ALL)) 00106 00107 00108 #define IS_LL_RTC_ALMA_DATE_WEEKDAY_SEL(__SEL__) (((__SEL__) == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) || \ 00109 ((__SEL__) == LL_RTC_ALMA_DATEWEEKDAYSEL_WEEKDAY)) 00110 00111 #define IS_LL_RTC_ALMB_DATE_WEEKDAY_SEL(__SEL__) (((__SEL__) == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) || \ 00112 ((__SEL__) == LL_RTC_ALMB_DATEWEEKDAYSEL_WEEKDAY)) 00113 00114 00115 /** 00116 * @} 00117 */ 00118 /* Private function prototypes -----------------------------------------------*/ 00119 /* Exported functions --------------------------------------------------------*/ 00120 /** @addtogroup RTC_LL_Exported_Functions 00121 * @{ 00122 */ 00123 00124 /** @addtogroup RTC_LL_EF_Init 00125 * @{ 00126 */ 00127 00128 /** 00129 * @brief De-Initializes the RTC registers to their default reset values. 00130 * @note This function does not reset the RTC Clock source and RTC Backup Data 00131 * registers. 00132 * @param RTCx RTC Instance 00133 * @retval An ErrorStatus enumeration value: 00134 * - SUCCESS: RTC registers are de-initialized 00135 * - ERROR: RTC registers are not de-initialized 00136 */ 00137 ErrorStatus LL_RTC_DeInit(RTC_TypeDef *RTCx) 00138 { 00139 ErrorStatus status = ERROR; 00140 00141 /* Check the parameter */ 00142 assert_param(IS_RTC_ALL_INSTANCE(RTCx)); 00143 00144 /* Disable the write protection for RTC registers */ 00145 LL_RTC_DisableWriteProtection(RTCx); 00146 00147 /* Set Initialization mode */ 00148 if (LL_RTC_EnterInitMode(RTCx) != ERROR) 00149 { 00150 /* Reset TR, DR and CR registers */ 00151 LL_RTC_WriteReg(RTCx, TR, 0x00000000U); 00152 LL_RTC_WriteReg(RTCx, DR, (RTC_DR_WDU_0 | RTC_DR_MU_0 | RTC_DR_DU_0)); 00153 00154 /* Reset All CR bits except CR[2:0] */ 00155 LL_RTC_WriteReg(RTCx, CR, (LL_RTC_ReadReg(RTCx, CR) & RTC_CR_WUCKSEL)); 00156 00157 LL_RTC_WriteReg(RTCx, WUTR, RTC_WUTR_WUT); 00158 LL_RTC_WriteReg(RTCx, PRER, (RTC_PRER_PREDIV_A | RTC_SYNCH_PRESC_DEFAULT)); 00159 LL_RTC_WriteReg(RTCx, ALRMAR, 0x00000000U); 00160 LL_RTC_WriteReg(RTCx, ALRMBR, 0x00000000U); 00161 LL_RTC_WriteReg(RTCx, SHIFTR, 0x00000000U); 00162 LL_RTC_WriteReg(RTCx, CALR, 0x00000000U); 00163 LL_RTC_WriteReg(RTCx, ALRMASSR, 0x00000000U); 00164 LL_RTC_WriteReg(RTCx, ALRMBSSR, 0x00000000U); 00165 00166 #if defined(RTC_ICSR_ALRAWF) 00167 /* Reset ICSR register and exit initialization mode */ 00168 LL_RTC_WriteReg(RTCx, ICSR, 0x00000000U); 00169 #endif /* RTC_ICSR_ALRAWF */ 00170 #if defined(RTC_ISR_ALRAWF) 00171 /* Reset ISR register and exit initialization mode */ 00172 LL_RTC_WriteReg(RTCx, ISR, 0x00000000U); 00173 #endif /* RTC_ISR_ALRAWF */ 00174 00175 #if defined(RTC_TAMPCR_TAMP1E) 00176 /* Reset Tamper and alternate functions configuration register */ 00177 LL_RTC_WriteReg(RTCx, TAMPCR, 0x00000000U); 00178 #endif /* RTC_TAMPCR_TAMP1E */ 00179 00180 #if defined(RTC_OR_ALARMOUTTYPE) 00181 /* Reset Option register */ 00182 LL_RTC_WriteReg(RTCx, OR, 0x00000000U); 00183 #endif /* RTC_OR_ALARMOUTTYPE */ 00184 00185 /* Wait till the RTC RSF flag is set */ 00186 status = LL_RTC_WaitForSynchro(RTCx); 00187 } 00188 00189 /* Enable the write protection for RTC registers */ 00190 LL_RTC_EnableWriteProtection(RTCx); 00191 00192 #if defined (TAMP_CR1_TAMP1E) 00193 /* DeInitialization of the TAMP */ 00194 LL_RTC_WriteReg(TAMP, CR1, 0xFFFF0000U); 00195 LL_RTC_WriteReg(TAMP, FLTCR, 0x00000000U); 00196 LL_RTC_WriteReg(TAMP, ATCR1, 0x00000000U); 00197 LL_RTC_WriteReg(TAMP, IER, 0x00000000U); 00198 LL_RTC_WriteReg(TAMP, SCR, 0xFFFFFFFFU); 00199 #endif /* TAMP_CR1_TAMP1E */ 00200 00201 return status; 00202 } 00203 00204 /** 00205 * @brief Initializes the RTC registers according to the specified parameters 00206 * in RTC_InitStruct. 00207 * @param RTCx RTC Instance 00208 * @param RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure that contains 00209 * the configuration information for the RTC peripheral. 00210 * @note The RTC Prescaler register is write protected and can be written in 00211 * initialization mode only. 00212 * @retval An ErrorStatus enumeration value: 00213 * - SUCCESS: RTC registers are initialized 00214 * - ERROR: RTC registers are not initialized 00215 */ 00216 ErrorStatus LL_RTC_Init(RTC_TypeDef *RTCx, LL_RTC_InitTypeDef *RTC_InitStruct) 00217 { 00218 ErrorStatus status = ERROR; 00219 00220 /* Check the parameters */ 00221 assert_param(IS_RTC_ALL_INSTANCE(RTCx)); 00222 assert_param(IS_LL_RTC_HOURFORMAT(RTC_InitStruct->HourFormat)); 00223 assert_param(IS_LL_RTC_ASYNCH_PREDIV(RTC_InitStruct->AsynchPrescaler)); 00224 assert_param(IS_LL_RTC_SYNCH_PREDIV(RTC_InitStruct->SynchPrescaler)); 00225 00226 /* Disable the write protection for RTC registers */ 00227 LL_RTC_DisableWriteProtection(RTCx); 00228 00229 /* Set Initialization mode */ 00230 if (LL_RTC_EnterInitMode(RTCx) != ERROR) 00231 { 00232 /* Set Hour Format */ 00233 LL_RTC_SetHourFormat(RTCx, RTC_InitStruct->HourFormat); 00234 00235 /* Configure Synchronous and Asynchronous prescaler factor */ 00236 LL_RTC_SetSynchPrescaler(RTCx, RTC_InitStruct->SynchPrescaler); 00237 LL_RTC_SetAsynchPrescaler(RTCx, RTC_InitStruct->AsynchPrescaler); 00238 00239 /* Exit Initialization mode */ 00240 LL_RTC_DisableInitMode(RTCx); 00241 00242 status = SUCCESS; 00243 } 00244 /* Enable the write protection for RTC registers */ 00245 LL_RTC_EnableWriteProtection(RTCx); 00246 00247 return status; 00248 } 00249 00250 /** 00251 * @brief Set each @ref LL_RTC_InitTypeDef field to default value. 00252 * @param RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure which will be initialized. 00253 * @retval None 00254 */ 00255 void LL_RTC_StructInit(LL_RTC_InitTypeDef *RTC_InitStruct) 00256 { 00257 /* Set RTC_InitStruct fields to default values */ 00258 RTC_InitStruct->HourFormat = LL_RTC_HOURFORMAT_24HOUR; 00259 RTC_InitStruct->AsynchPrescaler = RTC_ASYNCH_PRESC_DEFAULT; 00260 RTC_InitStruct->SynchPrescaler = RTC_SYNCH_PRESC_DEFAULT; 00261 } 00262 00263 /** 00264 * @brief Set the RTC current time. 00265 * @param RTCx RTC Instance 00266 * @param RTC_Format This parameter can be one of the following values: 00267 * @arg @ref LL_RTC_FORMAT_BIN 00268 * @arg @ref LL_RTC_FORMAT_BCD 00269 * @param RTC_TimeStruct pointer to a RTC_TimeTypeDef structure that contains 00270 * the time configuration information for the RTC. 00271 * @retval An ErrorStatus enumeration value: 00272 * - SUCCESS: RTC Time register is configured 00273 * - ERROR: RTC Time register is not configured 00274 */ 00275 ErrorStatus LL_RTC_TIME_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_TimeTypeDef *RTC_TimeStruct) 00276 { 00277 ErrorStatus status = ERROR; 00278 00279 /* Check the parameters */ 00280 assert_param(IS_RTC_ALL_INSTANCE(RTCx)); 00281 assert_param(IS_LL_RTC_FORMAT(RTC_Format)); 00282 00283 if (RTC_Format == LL_RTC_FORMAT_BIN) 00284 { 00285 if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) 00286 { 00287 assert_param(IS_LL_RTC_HOUR12(RTC_TimeStruct->Hours)); 00288 assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat)); 00289 } 00290 else 00291 { 00292 RTC_TimeStruct->TimeFormat = 0x00U; 00293 assert_param(IS_LL_RTC_HOUR24(RTC_TimeStruct->Hours)); 00294 } 00295 assert_param(IS_LL_RTC_MINUTES(RTC_TimeStruct->Minutes)); 00296 assert_param(IS_LL_RTC_SECONDS(RTC_TimeStruct->Seconds)); 00297 } 00298 else 00299 { 00300 if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) 00301 { 00302 assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours))); 00303 assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat)); 00304 } 00305 else 00306 { 00307 RTC_TimeStruct->TimeFormat = 0x00U; 00308 assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours))); 00309 } 00310 assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Minutes))); 00311 assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Seconds))); 00312 } 00313 00314 /* Disable the write protection for RTC registers */ 00315 LL_RTC_DisableWriteProtection(RTCx); 00316 00317 /* Set Initialization mode */ 00318 if (LL_RTC_EnterInitMode(RTCx) != ERROR) 00319 { 00320 /* Check the input parameters format */ 00321 if (RTC_Format != LL_RTC_FORMAT_BIN) 00322 { 00323 LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, RTC_TimeStruct->Hours, 00324 RTC_TimeStruct->Minutes, RTC_TimeStruct->Seconds); 00325 } 00326 else 00327 { 00328 LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Hours), 00329 __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Minutes), 00330 __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Seconds)); 00331 } 00332 00333 /* Exit Initialization mode */ 00334 LL_RTC_DisableInitMode(RTCx); 00335 00336 /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */ 00337 if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U) 00338 { 00339 status = LL_RTC_WaitForSynchro(RTCx); 00340 } 00341 else 00342 { 00343 status = SUCCESS; 00344 } 00345 } 00346 /* Enable the write protection for RTC registers */ 00347 LL_RTC_EnableWriteProtection(RTCx); 00348 00349 return status; 00350 } 00351 00352 /** 00353 * @brief Set each @ref LL_RTC_TimeTypeDef field to default value (Time = 00h:00min:00sec). 00354 * @param RTC_TimeStruct pointer to a @ref LL_RTC_TimeTypeDef structure which will be initialized. 00355 * @retval None 00356 */ 00357 void LL_RTC_TIME_StructInit(LL_RTC_TimeTypeDef *RTC_TimeStruct) 00358 { 00359 /* Time = 00h:00min:00sec */ 00360 RTC_TimeStruct->TimeFormat = LL_RTC_TIME_FORMAT_AM_OR_24; 00361 RTC_TimeStruct->Hours = 0U; 00362 RTC_TimeStruct->Minutes = 0U; 00363 RTC_TimeStruct->Seconds = 0U; 00364 } 00365 00366 /** 00367 * @brief Set the RTC current date. 00368 * @param RTCx RTC Instance 00369 * @param RTC_Format This parameter can be one of the following values: 00370 * @arg @ref LL_RTC_FORMAT_BIN 00371 * @arg @ref LL_RTC_FORMAT_BCD 00372 * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that contains 00373 * the date configuration information for the RTC. 00374 * @retval An ErrorStatus enumeration value: 00375 * - SUCCESS: RTC Day register is configured 00376 * - ERROR: RTC Day register is not configured 00377 */ 00378 ErrorStatus LL_RTC_DATE_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_DateTypeDef *RTC_DateStruct) 00379 { 00380 ErrorStatus status = ERROR; 00381 00382 /* Check the parameters */ 00383 assert_param(IS_RTC_ALL_INSTANCE(RTCx)); 00384 assert_param(IS_LL_RTC_FORMAT(RTC_Format)); 00385 00386 if ((RTC_Format == LL_RTC_FORMAT_BIN) && ((RTC_DateStruct->Month & 0x10U) == 0x10U)) 00387 { 00388 RTC_DateStruct->Month = (uint8_t)((RTC_DateStruct->Month & (uint8_t)~(0x10U)) + 0x0AU); 00389 } 00390 if (RTC_Format == LL_RTC_FORMAT_BIN) 00391 { 00392 assert_param(IS_LL_RTC_YEAR(RTC_DateStruct->Year)); 00393 assert_param(IS_LL_RTC_MONTH(RTC_DateStruct->Month)); 00394 assert_param(IS_LL_RTC_DAY(RTC_DateStruct->Day)); 00395 } 00396 else 00397 { 00398 assert_param(IS_LL_RTC_YEAR(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Year))); 00399 assert_param(IS_LL_RTC_MONTH(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Month))); 00400 assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Day))); 00401 } 00402 assert_param(IS_LL_RTC_WEEKDAY(RTC_DateStruct->WeekDay)); 00403 00404 /* Disable the write protection for RTC registers */ 00405 LL_RTC_DisableWriteProtection(RTCx); 00406 00407 /* Set Initialization mode */ 00408 if (LL_RTC_EnterInitMode(RTCx) != ERROR) 00409 { 00410 /* Check the input parameters format */ 00411 if (RTC_Format != LL_RTC_FORMAT_BIN) 00412 { 00413 LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, RTC_DateStruct->Day, RTC_DateStruct->Month, RTC_DateStruct->Year); 00414 } 00415 else 00416 { 00417 LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Day), 00418 __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Month), __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Year)); 00419 } 00420 00421 /* Exit Initialization mode */ 00422 LL_RTC_DisableInitMode(RTCx); 00423 00424 /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */ 00425 if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U) 00426 { 00427 status = LL_RTC_WaitForSynchro(RTCx); 00428 } 00429 else 00430 { 00431 status = SUCCESS; 00432 } 00433 } 00434 /* Enable the write protection for RTC registers */ 00435 LL_RTC_EnableWriteProtection(RTCx); 00436 00437 return status; 00438 } 00439 00440 /** 00441 * @brief Set each @ref LL_RTC_DateTypeDef field to default value (date = Monday, January 01 xx00) 00442 * @param RTC_DateStruct pointer to a @ref LL_RTC_DateTypeDef structure which will be initialized. 00443 * @retval None 00444 */ 00445 void LL_RTC_DATE_StructInit(LL_RTC_DateTypeDef *RTC_DateStruct) 00446 { 00447 /* Monday, January 01 xx00 */ 00448 RTC_DateStruct->WeekDay = LL_RTC_WEEKDAY_MONDAY; 00449 RTC_DateStruct->Day = 1U; 00450 RTC_DateStruct->Month = LL_RTC_MONTH_JANUARY; 00451 RTC_DateStruct->Year = 0U; 00452 } 00453 00454 /** 00455 * @brief Set the RTC Alarm A. 00456 * @note The Alarm register can only be written when the corresponding Alarm 00457 * is disabled (Use @ref LL_RTC_ALMA_Disable function). 00458 * @param RTCx RTC Instance 00459 * @param RTC_Format This parameter can be one of the following values: 00460 * @arg @ref LL_RTC_FORMAT_BIN 00461 * @arg @ref LL_RTC_FORMAT_BCD 00462 * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that 00463 * contains the alarm configuration parameters. 00464 * @retval An ErrorStatus enumeration value: 00465 * - SUCCESS: ALARMA registers are configured 00466 * - ERROR: ALARMA registers are not configured 00467 */ 00468 ErrorStatus LL_RTC_ALMA_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct) 00469 { 00470 /* Check the parameters */ 00471 assert_param(IS_RTC_ALL_INSTANCE(RTCx)); 00472 assert_param(IS_LL_RTC_FORMAT(RTC_Format)); 00473 assert_param(IS_LL_RTC_ALMA_MASK(RTC_AlarmStruct->AlarmMask)); 00474 assert_param(IS_LL_RTC_ALMA_DATE_WEEKDAY_SEL(RTC_AlarmStruct->AlarmDateWeekDaySel)); 00475 00476 if (RTC_Format == LL_RTC_FORMAT_BIN) 00477 { 00478 if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) 00479 { 00480 assert_param(IS_LL_RTC_HOUR12(RTC_AlarmStruct->AlarmTime.Hours)); 00481 assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat)); 00482 } 00483 else 00484 { 00485 RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U; 00486 assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours)); 00487 } 00488 assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes)); 00489 assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds)); 00490 00491 if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) 00492 { 00493 assert_param(IS_LL_RTC_DAY(RTC_AlarmStruct->AlarmDateWeekDay)); 00494 } 00495 else 00496 { 00497 assert_param(IS_LL_RTC_WEEKDAY(RTC_AlarmStruct->AlarmDateWeekDay)); 00498 } 00499 } 00500 else 00501 { 00502 if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) 00503 { 00504 assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours))); 00505 assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat)); 00506 } 00507 else 00508 { 00509 RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U; 00510 assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours))); 00511 } 00512 00513 assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes))); 00514 assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds))); 00515 00516 if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) 00517 { 00518 assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay))); 00519 } 00520 else 00521 { 00522 assert_param(IS_LL_RTC_WEEKDAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay))); 00523 } 00524 } 00525 00526 /* Disable the write protection for RTC registers */ 00527 LL_RTC_DisableWriteProtection(RTCx); 00528 00529 /* Select weekday selection */ 00530 if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) 00531 { 00532 /* Set the date for ALARM */ 00533 LL_RTC_ALMA_DisableWeekday(RTCx); 00534 if (RTC_Format != LL_RTC_FORMAT_BIN) 00535 { 00536 LL_RTC_ALMA_SetDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay); 00537 } 00538 else 00539 { 00540 LL_RTC_ALMA_SetDay(RTCx, __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmDateWeekDay)); 00541 } 00542 } 00543 else 00544 { 00545 /* Set the week day for ALARM */ 00546 LL_RTC_ALMA_EnableWeekday(RTCx); 00547 LL_RTC_ALMA_SetWeekDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay); 00548 } 00549 00550 /* Configure the Alarm register */ 00551 if (RTC_Format != LL_RTC_FORMAT_BIN) 00552 { 00553 LL_RTC_ALMA_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, RTC_AlarmStruct->AlarmTime.Hours, 00554 RTC_AlarmStruct->AlarmTime.Minutes, RTC_AlarmStruct->AlarmTime.Seconds); 00555 } 00556 else 00557 { 00558 LL_RTC_ALMA_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, 00559 __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Hours), 00560 __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Minutes), 00561 __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Seconds)); 00562 } 00563 /* Set ALARM mask */ 00564 LL_RTC_ALMA_SetMask(RTCx, RTC_AlarmStruct->AlarmMask); 00565 00566 /* Enable the write protection for RTC registers */ 00567 LL_RTC_EnableWriteProtection(RTCx); 00568 00569 return SUCCESS; 00570 } 00571 00572 /** 00573 * @brief Set the RTC Alarm B. 00574 * @note The Alarm register can only be written when the corresponding Alarm 00575 * is disabled (@ref LL_RTC_ALMB_Disable function). 00576 * @param RTCx RTC Instance 00577 * @param RTC_Format This parameter can be one of the following values: 00578 * @arg @ref LL_RTC_FORMAT_BIN 00579 * @arg @ref LL_RTC_FORMAT_BCD 00580 * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that 00581 * contains the alarm configuration parameters. 00582 * @retval An ErrorStatus enumeration value: 00583 * - SUCCESS: ALARMB registers are configured 00584 * - ERROR: ALARMB registers are not configured 00585 */ 00586 ErrorStatus LL_RTC_ALMB_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct) 00587 { 00588 /* Check the parameters */ 00589 assert_param(IS_RTC_ALL_INSTANCE(RTCx)); 00590 assert_param(IS_LL_RTC_FORMAT(RTC_Format)); 00591 assert_param(IS_LL_RTC_ALMB_MASK(RTC_AlarmStruct->AlarmMask)); 00592 assert_param(IS_LL_RTC_ALMB_DATE_WEEKDAY_SEL(RTC_AlarmStruct->AlarmDateWeekDaySel)); 00593 00594 if (RTC_Format == LL_RTC_FORMAT_BIN) 00595 { 00596 if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) 00597 { 00598 assert_param(IS_LL_RTC_HOUR12(RTC_AlarmStruct->AlarmTime.Hours)); 00599 assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat)); 00600 } 00601 else 00602 { 00603 RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U; 00604 assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours)); 00605 } 00606 assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes)); 00607 assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds)); 00608 00609 if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) 00610 { 00611 assert_param(IS_LL_RTC_DAY(RTC_AlarmStruct->AlarmDateWeekDay)); 00612 } 00613 else 00614 { 00615 assert_param(IS_LL_RTC_WEEKDAY(RTC_AlarmStruct->AlarmDateWeekDay)); 00616 } 00617 } 00618 else 00619 { 00620 if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) 00621 { 00622 assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours))); 00623 assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat)); 00624 } 00625 else 00626 { 00627 RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U; 00628 assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours))); 00629 } 00630 00631 assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes))); 00632 assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds))); 00633 00634 if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) 00635 { 00636 assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay))); 00637 } 00638 else 00639 { 00640 assert_param(IS_LL_RTC_WEEKDAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay))); 00641 } 00642 } 00643 00644 /* Disable the write protection for RTC registers */ 00645 LL_RTC_DisableWriteProtection(RTCx); 00646 00647 /* Select weekday selection */ 00648 if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) 00649 { 00650 /* Set the date for ALARM */ 00651 LL_RTC_ALMB_DisableWeekday(RTCx); 00652 if (RTC_Format != LL_RTC_FORMAT_BIN) 00653 { 00654 LL_RTC_ALMB_SetDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay); 00655 } 00656 else 00657 { 00658 LL_RTC_ALMB_SetDay(RTCx, __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmDateWeekDay)); 00659 } 00660 } 00661 else 00662 { 00663 /* Set the week day for ALARM */ 00664 LL_RTC_ALMB_EnableWeekday(RTCx); 00665 LL_RTC_ALMB_SetWeekDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay); 00666 } 00667 00668 /* Configure the Alarm register */ 00669 if (RTC_Format != LL_RTC_FORMAT_BIN) 00670 { 00671 LL_RTC_ALMB_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, RTC_AlarmStruct->AlarmTime.Hours, 00672 RTC_AlarmStruct->AlarmTime.Minutes, RTC_AlarmStruct->AlarmTime.Seconds); 00673 } 00674 else 00675 { 00676 LL_RTC_ALMB_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, 00677 __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Hours), 00678 __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Minutes), 00679 __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Seconds)); 00680 } 00681 /* Set ALARM mask */ 00682 LL_RTC_ALMB_SetMask(RTCx, RTC_AlarmStruct->AlarmMask); 00683 00684 /* Enable the write protection for RTC registers */ 00685 LL_RTC_EnableWriteProtection(RTCx); 00686 00687 return SUCCESS; 00688 } 00689 00690 /** 00691 * @brief Set each @ref LL_RTC_AlarmTypeDef of ALARMA field to default value (Time = 00h:00mn:00sec / 00692 * Day = 1st day of the month/Mask = all fields are masked). 00693 * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized. 00694 * @retval None 00695 */ 00696 void LL_RTC_ALMA_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct) 00697 { 00698 /* Alarm Time Settings : Time = 00h:00mn:00sec */ 00699 RTC_AlarmStruct->AlarmTime.TimeFormat = LL_RTC_ALMA_TIME_FORMAT_AM; 00700 RTC_AlarmStruct->AlarmTime.Hours = 0U; 00701 RTC_AlarmStruct->AlarmTime.Minutes = 0U; 00702 RTC_AlarmStruct->AlarmTime.Seconds = 0U; 00703 00704 /* Alarm Day Settings : Day = 1st day of the month */ 00705 RTC_AlarmStruct->AlarmDateWeekDaySel = LL_RTC_ALMA_DATEWEEKDAYSEL_DATE; 00706 RTC_AlarmStruct->AlarmDateWeekDay = 1U; 00707 00708 /* Alarm Masks Settings : Mask = all fields are not masked */ 00709 RTC_AlarmStruct->AlarmMask = LL_RTC_ALMA_MASK_NONE; 00710 } 00711 00712 /** 00713 * @brief Set each @ref LL_RTC_AlarmTypeDef of ALARMA field to default value (Time = 00h:00mn:00sec / 00714 * Day = 1st day of the month/Mask = all fields are masked). 00715 * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized. 00716 * @retval None 00717 */ 00718 void LL_RTC_ALMB_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct) 00719 { 00720 /* Alarm Time Settings : Time = 00h:00mn:00sec */ 00721 RTC_AlarmStruct->AlarmTime.TimeFormat = LL_RTC_ALMB_TIME_FORMAT_AM; 00722 RTC_AlarmStruct->AlarmTime.Hours = 0U; 00723 RTC_AlarmStruct->AlarmTime.Minutes = 0U; 00724 RTC_AlarmStruct->AlarmTime.Seconds = 0U; 00725 00726 /* Alarm Day Settings : Day = 1st day of the month */ 00727 RTC_AlarmStruct->AlarmDateWeekDaySel = LL_RTC_ALMB_DATEWEEKDAYSEL_DATE; 00728 RTC_AlarmStruct->AlarmDateWeekDay = 1U; 00729 00730 /* Alarm Masks Settings : Mask = all fields are not masked */ 00731 RTC_AlarmStruct->AlarmMask = LL_RTC_ALMB_MASK_NONE; 00732 } 00733 00734 /** 00735 * @brief Enters the RTC Initialization mode. 00736 * @note The RTC Initialization mode is write protected, use the 00737 * @ref LL_RTC_DisableWriteProtection before calling this function. 00738 * @param RTCx RTC Instance 00739 * @retval An ErrorStatus enumeration value: 00740 * - SUCCESS: RTC is in Init mode 00741 * - ERROR: RTC is not in Init mode 00742 */ 00743 ErrorStatus LL_RTC_EnterInitMode(RTC_TypeDef *RTCx) 00744 { 00745 __IO uint32_t timeout = RTC_INITMODE_TIMEOUT; 00746 ErrorStatus status = SUCCESS; 00747 uint32_t tmp; 00748 00749 /* Check the parameter */ 00750 assert_param(IS_RTC_ALL_INSTANCE(RTCx)); 00751 00752 /* Check if the Initialization mode is set */ 00753 if (LL_RTC_IsActiveFlag_INIT(RTCx) == 0U) 00754 { 00755 /* Set the Initialization mode */ 00756 LL_RTC_EnableInitMode(RTCx); 00757 00758 /* Wait till RTC is in INIT state and if Time out is reached exit */ 00759 tmp = LL_RTC_IsActiveFlag_INIT(RTCx); 00760 while ((timeout != 0U) && (tmp != 1U)) 00761 { 00762 if (LL_SYSTICK_IsActiveCounterFlag() == 1U) 00763 { 00764 timeout --; 00765 } 00766 tmp = LL_RTC_IsActiveFlag_INIT(RTCx); 00767 if (timeout == 0U) 00768 { 00769 status = ERROR; 00770 } 00771 } 00772 } 00773 return status; 00774 } 00775 00776 /** 00777 * @brief Exit the RTC Initialization mode. 00778 * @note When the initialization sequence is complete, the calendar restarts 00779 * counting after 4 RTCCLK cycles. 00780 * @note The RTC Initialization mode is write protected, use the 00781 * @ref LL_RTC_DisableWriteProtection before calling this function. 00782 * @param RTCx RTC Instance 00783 * @retval An ErrorStatus enumeration value: 00784 * - SUCCESS: RTC exited from in Init mode 00785 * - ERROR: Not applicable 00786 */ 00787 ErrorStatus LL_RTC_ExitInitMode(RTC_TypeDef *RTCx) 00788 { 00789 /* Check the parameter */ 00790 assert_param(IS_RTC_ALL_INSTANCE(RTCx)); 00791 00792 /* Disable initialization mode */ 00793 LL_RTC_DisableInitMode(RTCx); 00794 00795 return SUCCESS; 00796 } 00797 00798 /** 00799 * @brief Waits until the RTC Time and Day registers (RTC_TR and RTC_DR) are 00800 * synchronized with RTC APB clock. 00801 * @note The RTC Resynchronization mode is write protected, use the 00802 * @ref LL_RTC_DisableWriteProtection before calling this function. 00803 * @note To read the calendar through the shadow registers after Calendar 00804 * initialization, calendar update or after wakeup from low power modes 00805 * the software must first clear the RSF flag. 00806 * The software must then wait until it is set again before reading 00807 * the calendar, which means that the calendar registers have been 00808 * correctly copied into the RTC_TR and RTC_DR shadow registers. 00809 * @param RTCx RTC Instance 00810 * @retval An ErrorStatus enumeration value: 00811 * - SUCCESS: RTC registers are synchronised 00812 * - ERROR: RTC registers are not synchronised 00813 */ 00814 ErrorStatus LL_RTC_WaitForSynchro(RTC_TypeDef *RTCx) 00815 { 00816 __IO uint32_t timeout = RTC_SYNCHRO_TIMEOUT; 00817 ErrorStatus status = SUCCESS; 00818 uint32_t tmp; 00819 00820 /* Check the parameter */ 00821 assert_param(IS_RTC_ALL_INSTANCE(RTCx)); 00822 00823 /* Clear RSF flag */ 00824 LL_RTC_ClearFlag_RS(RTCx); 00825 00826 /* Wait the registers to be synchronised */ 00827 tmp = LL_RTC_IsActiveFlag_RS(RTCx); 00828 while ((timeout != 0U) && (tmp != 0U)) 00829 { 00830 if (LL_SYSTICK_IsActiveCounterFlag() == 1U) 00831 { 00832 timeout--; 00833 } 00834 tmp = LL_RTC_IsActiveFlag_RS(RTCx); 00835 if (timeout == 0U) 00836 { 00837 status = ERROR; 00838 } 00839 } 00840 00841 if (status != ERROR) 00842 { 00843 timeout = RTC_SYNCHRO_TIMEOUT; 00844 tmp = LL_RTC_IsActiveFlag_RS(RTCx); 00845 while ((timeout != 0U) && (tmp != 1U)) 00846 { 00847 if (LL_SYSTICK_IsActiveCounterFlag() == 1U) 00848 { 00849 timeout--; 00850 } 00851 tmp = LL_RTC_IsActiveFlag_RS(RTCx); 00852 if (timeout == 0U) 00853 { 00854 status = ERROR; 00855 } 00856 } 00857 } 00858 00859 return (status); 00860 } 00861 00862 /** 00863 * @} 00864 */ 00865 00866 /** 00867 * @} 00868 */ 00869 00870 /** 00871 * @} 00872 */ 00873 00874 #endif /* defined(RTC) */ 00875 00876 /** 00877 * @} 00878 */ 00879 00880 #endif /* USE_FULL_LL_DRIVER */ 00881