STM32H735xx HAL User Manual
stm32h7xx_ll_rtc.c
Go to the documentation of this file.
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