1 /**
2   ******************************************************************************
3   * @file    stm32l0xx_ll_rtc.c
4   * @author  MCD Application Team
5   * @brief   RTC LL module driver.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2016 STMicroelectronics.
10   * All rights reserved.
11   *
12   * This software is licensed under terms that can be found in the LICENSE file
13   * in the root directory of this software component.
14   * If no LICENSE file comes with this software, it is provided AS-IS.
15   *
16   ******************************************************************************
17   */
18 #if defined(USE_FULL_LL_DRIVER)
19 
20 /* Includes ------------------------------------------------------------------*/
21 #include "stm32l0xx_ll_rtc.h"
22 #include "stm32l0xx_ll_cortex.h"
23 #ifdef  USE_FULL_ASSERT
24 #include "stm32_assert.h"
25 #else
26 #define assert_param(expr) ((void)0U)
27 #endif
28 
29 /** @addtogroup STM32L0xx_LL_Driver
30   * @{
31   */
32 
33 #if defined(RTC)
34 
35 /** @addtogroup RTC_LL
36   * @{
37   */
38 
39 /* Private types -------------------------------------------------------------*/
40 /* Private variables ---------------------------------------------------------*/
41 /* Private constants ---------------------------------------------------------*/
42 /** @addtogroup RTC_LL_Private_Constants
43   * @{
44   */
45 /* Default values used for prescaler */
46 #define RTC_ASYNCH_PRESC_DEFAULT     0x0000007FU
47 #define RTC_SYNCH_PRESC_DEFAULT      0x000000FFU
48 
49 /* Values used for timeout */
50 #define RTC_INITMODE_TIMEOUT         1000U /* 1s when tick set to 1ms */
51 #define RTC_SYNCHRO_TIMEOUT          1000U /* 1s when tick set to 1ms */
52 /**
53   * @}
54   */
55 
56 /* Private macros ------------------------------------------------------------*/
57 /** @addtogroup RTC_LL_Private_Macros
58   * @{
59   */
60 
61 #define IS_LL_RTC_HOURFORMAT(__VALUE__) (((__VALUE__) == LL_RTC_HOURFORMAT_24HOUR) \
62                                       || ((__VALUE__) == LL_RTC_HOURFORMAT_AMPM))
63 
64 #define IS_LL_RTC_ASYNCH_PREDIV(__VALUE__)   ((__VALUE__) <= 0x7FU)
65 
66 #define IS_LL_RTC_SYNCH_PREDIV(__VALUE__)    ((__VALUE__) <= 0x7FFFU)
67 
68 #define IS_LL_RTC_FORMAT(__VALUE__) (((__VALUE__) == LL_RTC_FORMAT_BIN) \
69                                   || ((__VALUE__) == LL_RTC_FORMAT_BCD))
70 
71 #define IS_LL_RTC_TIME_FORMAT(__VALUE__) (((__VALUE__) == LL_RTC_TIME_FORMAT_AM_OR_24) \
72                                        || ((__VALUE__) == LL_RTC_TIME_FORMAT_PM))
73 
74 #define IS_LL_RTC_HOUR12(__HOUR__)            (((__HOUR__) > 0U) && ((__HOUR__) <= 12U))
75 #define IS_LL_RTC_HOUR24(__HOUR__)            ((__HOUR__) <= 23U)
76 #define IS_LL_RTC_MINUTES(__MINUTES__)        ((__MINUTES__) <= 59U)
77 #define IS_LL_RTC_SECONDS(__SECONDS__)        ((__SECONDS__) <= 59U)
78 
79 #define IS_LL_RTC_WEEKDAY(__VALUE__) (((__VALUE__) == LL_RTC_WEEKDAY_MONDAY) \
80                                    || ((__VALUE__) == LL_RTC_WEEKDAY_TUESDAY) \
81                                    || ((__VALUE__) == LL_RTC_WEEKDAY_WEDNESDAY) \
82                                    || ((__VALUE__) == LL_RTC_WEEKDAY_THURSDAY) \
83                                    || ((__VALUE__) == LL_RTC_WEEKDAY_FRIDAY) \
84                                    || ((__VALUE__) == LL_RTC_WEEKDAY_SATURDAY) \
85                                    || ((__VALUE__) == LL_RTC_WEEKDAY_SUNDAY))
86 
87 #define IS_LL_RTC_DAY(__DAY__)     (((__DAY__) >= 1U) && ((__DAY__) <= 31U))
88 
89 #define IS_LL_RTC_MONTH(__MONTH__) (((__MONTH__) >= 1U) && ((__MONTH__) <= 12U))
90 
91 #define IS_LL_RTC_YEAR(__YEAR__)   ((__YEAR__) <= 99U)
92 
93 #define IS_LL_RTC_ALMA_MASK(__VALUE__) (((__VALUE__) == LL_RTC_ALMA_MASK_NONE) \
94                                      || ((__VALUE__) == LL_RTC_ALMA_MASK_DATEWEEKDAY) \
95                                      || ((__VALUE__) == LL_RTC_ALMA_MASK_HOURS) \
96                                      || ((__VALUE__) == LL_RTC_ALMA_MASK_MINUTES) \
97                                      || ((__VALUE__) == LL_RTC_ALMA_MASK_SECONDS) \
98                                      || ((__VALUE__) == LL_RTC_ALMA_MASK_ALL))
99 
100 #define IS_LL_RTC_ALMB_MASK(__VALUE__) (((__VALUE__) == LL_RTC_ALMB_MASK_NONE) \
101                                      || ((__VALUE__) == LL_RTC_ALMB_MASK_DATEWEEKDAY) \
102                                      || ((__VALUE__) == LL_RTC_ALMB_MASK_HOURS) \
103                                      || ((__VALUE__) == LL_RTC_ALMB_MASK_MINUTES) \
104                                      || ((__VALUE__) == LL_RTC_ALMB_MASK_SECONDS) \
105                                      || ((__VALUE__) == LL_RTC_ALMB_MASK_ALL))
106 
107 #define IS_LL_RTC_ALMA_DATE_WEEKDAY_SEL(__SEL__) (((__SEL__) == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) || \
108                                                   ((__SEL__) == LL_RTC_ALMA_DATEWEEKDAYSEL_WEEKDAY))
109 
110 #define IS_LL_RTC_ALMB_DATE_WEEKDAY_SEL(__SEL__) (((__SEL__) == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) || \
111                                                   ((__SEL__) == LL_RTC_ALMB_DATEWEEKDAYSEL_WEEKDAY))
112 
113 /**
114   * @}
115   */
116 /* Private function prototypes -----------------------------------------------*/
117 /* Exported functions --------------------------------------------------------*/
118 /** @addtogroup RTC_LL_Exported_Functions
119   * @{
120   */
121 
122 /** @addtogroup RTC_LL_EF_Init
123   * @{
124   */
125 
126 /**
127   * @brief  De-Initializes the RTC registers to their default reset values.
128   * @note   This function does not reset the RTC Clock source and RTC Backup Data
129   *         registers.
130   * @param  RTCx RTC Instance
131   * @retval An ErrorStatus enumeration value:
132   *          - SUCCESS: RTC registers are de-initialized
133   *          - ERROR: RTC registers are not de-initialized
134   */
LL_RTC_DeInit(RTC_TypeDef * RTCx)135 ErrorStatus LL_RTC_DeInit(RTC_TypeDef *RTCx)
136 {
137   ErrorStatus status = ERROR;
138 
139   /* Check the parameter */
140   assert_param(IS_RTC_ALL_INSTANCE(RTCx));
141 
142   /* Disable the write protection for RTC registers */
143   LL_RTC_DisableWriteProtection(RTCx);
144 
145   /* Set Initialization mode */
146   if (LL_RTC_EnterInitMode(RTCx) != ERROR)
147   {
148     /* Reset TR, DR and CR registers */
149     LL_RTC_WriteReg(RTCx, TR,       0x00000000U);
150     LL_RTC_WriteReg(RTCx, WUTR,     RTC_WUTR_WUT);
151     LL_RTC_WriteReg(RTCx, DR,      (RTC_DR_WDU_0 | RTC_DR_MU_0 | RTC_DR_DU_0));
152 
153     /* Reset All CR bits except CR[2:0] */
154     LL_RTC_WriteReg(RTCx, CR, (LL_RTC_ReadReg(RTCx, CR) & RTC_CR_WUCKSEL));
155 
156     LL_RTC_WriteReg(RTCx, PRER,    (RTC_PRER_PREDIV_A | RTC_SYNCH_PRESC_DEFAULT));
157     LL_RTC_WriteReg(RTCx, ALRMAR,   0x00000000U);
158     LL_RTC_WriteReg(RTCx, ALRMBR,   0x00000000U);
159     LL_RTC_WriteReg(RTCx, CALR,     0x00000000U);
160     LL_RTC_WriteReg(RTCx, SHIFTR,   0x00000000U);
161     LL_RTC_WriteReg(RTCx, ALRMASSR, 0x00000000U);
162     LL_RTC_WriteReg(RTCx, ALRMBSSR, 0x00000000U);
163 
164     /* Reset ISR register and exit initialization mode */
165     LL_RTC_WriteReg(RTCx, ISR,      0x00000000U);
166 
167     /* Reset Tamper and alternate functions configuration register */
168     LL_RTC_WriteReg(RTCx, TAMPCR, 0x00000000U);
169 
170     /* Reset Option register */
171     LL_RTC_WriteReg(RTCx, OR, 0x00000000U);
172 
173     /* Wait till the RTC RSF flag is set */
174     status = LL_RTC_WaitForSynchro(RTCx);
175   }
176 
177   /* Enable the write protection for RTC registers */
178   LL_RTC_EnableWriteProtection(RTCx);
179 
180   return status;
181 }
182 
183 /**
184   * @brief  Initializes the RTC registers according to the specified parameters
185   *         in RTC_InitStruct.
186   * @param  RTCx RTC Instance
187   * @param  RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure that contains
188   *         the configuration information for the RTC peripheral.
189   * @note   The RTC Prescaler register is write protected and can be written in
190   *         initialization mode only.
191   * @retval An ErrorStatus enumeration value:
192   *          - SUCCESS: RTC registers are initialized
193   *          - ERROR: RTC registers are not initialized
194   */
LL_RTC_Init(RTC_TypeDef * RTCx,LL_RTC_InitTypeDef * RTC_InitStruct)195 ErrorStatus LL_RTC_Init(RTC_TypeDef *RTCx, LL_RTC_InitTypeDef *RTC_InitStruct)
196 {
197   ErrorStatus status = ERROR;
198 
199   /* Check the parameters */
200   assert_param(IS_RTC_ALL_INSTANCE(RTCx));
201   assert_param(IS_LL_RTC_HOURFORMAT(RTC_InitStruct->HourFormat));
202   assert_param(IS_LL_RTC_ASYNCH_PREDIV(RTC_InitStruct->AsynchPrescaler));
203   assert_param(IS_LL_RTC_SYNCH_PREDIV(RTC_InitStruct->SynchPrescaler));
204 
205   /* Disable the write protection for RTC registers */
206   LL_RTC_DisableWriteProtection(RTCx);
207 
208   /* Set Initialization mode */
209   if (LL_RTC_EnterInitMode(RTCx) != ERROR)
210   {
211     /* Set Hour Format */
212     LL_RTC_SetHourFormat(RTCx, RTC_InitStruct->HourFormat);
213 
214     /* Configure Synchronous and Asynchronous prescaler factor */
215     LL_RTC_SetSynchPrescaler(RTCx, RTC_InitStruct->SynchPrescaler);
216     LL_RTC_SetAsynchPrescaler(RTCx, RTC_InitStruct->AsynchPrescaler);
217 
218     /* Exit Initialization mode */
219     LL_RTC_DisableInitMode(RTCx);
220 
221     status = SUCCESS;
222   }
223   /* Enable the write protection for RTC registers */
224   LL_RTC_EnableWriteProtection(RTCx);
225 
226   return status;
227 }
228 
229 /**
230   * @brief  Set each @ref LL_RTC_InitTypeDef field to default value.
231   * @param  RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure which will be initialized.
232   * @retval None
233   */
LL_RTC_StructInit(LL_RTC_InitTypeDef * RTC_InitStruct)234 void LL_RTC_StructInit(LL_RTC_InitTypeDef *RTC_InitStruct)
235 {
236   /* Set RTC_InitStruct fields to default values */
237   RTC_InitStruct->HourFormat      = LL_RTC_HOURFORMAT_24HOUR;
238   RTC_InitStruct->AsynchPrescaler = RTC_ASYNCH_PRESC_DEFAULT;
239   RTC_InitStruct->SynchPrescaler  = RTC_SYNCH_PRESC_DEFAULT;
240 }
241 
242 /**
243   * @brief  Set the RTC current time.
244   * @param  RTCx RTC Instance
245   * @param  RTC_Format This parameter can be one of the following values:
246   *         @arg @ref LL_RTC_FORMAT_BIN
247   *         @arg @ref LL_RTC_FORMAT_BCD
248   * @param  RTC_TimeStruct pointer to a RTC_TimeTypeDef structure that contains
249   *                        the time configuration information for the RTC.
250   * @retval An ErrorStatus enumeration value:
251   *          - SUCCESS: RTC Time register is configured
252   *          - ERROR: RTC Time register is not configured
253   */
LL_RTC_TIME_Init(RTC_TypeDef * RTCx,uint32_t RTC_Format,LL_RTC_TimeTypeDef * RTC_TimeStruct)254 ErrorStatus LL_RTC_TIME_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_TimeTypeDef *RTC_TimeStruct)
255 {
256   ErrorStatus status = ERROR;
257 
258   /* Check the parameters */
259   assert_param(IS_RTC_ALL_INSTANCE(RTCx));
260   assert_param(IS_LL_RTC_FORMAT(RTC_Format));
261 
262   if (RTC_Format == LL_RTC_FORMAT_BIN)
263   {
264     if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
265     {
266       assert_param(IS_LL_RTC_HOUR12(RTC_TimeStruct->Hours));
267       assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat));
268     }
269     else
270     {
271       RTC_TimeStruct->TimeFormat = 0x00U;
272       assert_param(IS_LL_RTC_HOUR24(RTC_TimeStruct->Hours));
273     }
274     assert_param(IS_LL_RTC_MINUTES(RTC_TimeStruct->Minutes));
275     assert_param(IS_LL_RTC_SECONDS(RTC_TimeStruct->Seconds));
276   }
277   else
278   {
279     if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
280     {
281       assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours)));
282       assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat));
283     }
284     else
285     {
286       RTC_TimeStruct->TimeFormat = 0x00U;
287       assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours)));
288     }
289     assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Minutes)));
290     assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Seconds)));
291   }
292 
293   /* Disable the write protection for RTC registers */
294   LL_RTC_DisableWriteProtection(RTCx);
295 
296   /* Set Initialization mode */
297   if (LL_RTC_EnterInitMode(RTCx) != ERROR)
298   {
299     /* Check the input parameters format */
300     if (RTC_Format != LL_RTC_FORMAT_BIN)
301     {
302       LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, RTC_TimeStruct->Hours,
303                          RTC_TimeStruct->Minutes, RTC_TimeStruct->Seconds);
304     }
305     else
306     {
307       LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Hours),
308                          __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Minutes),
309                          __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Seconds));
310     }
311 
312     /* Exit Initialization mode */
313     LL_RTC_DisableInitMode(RTCx);
314 
315     /* If  RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
316     if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U)
317     {
318       status = LL_RTC_WaitForSynchro(RTCx);
319     }
320     else
321     {
322       status = SUCCESS;
323     }
324   }
325   /* Enable the write protection for RTC registers */
326   LL_RTC_EnableWriteProtection(RTCx);
327 
328   return status;
329 }
330 
331 /**
332   * @brief  Set each @ref LL_RTC_TimeTypeDef field to default value (Time = 00h:00min:00sec).
333   * @param  RTC_TimeStruct pointer to a @ref LL_RTC_TimeTypeDef structure which will be initialized.
334   * @retval None
335   */
LL_RTC_TIME_StructInit(LL_RTC_TimeTypeDef * RTC_TimeStruct)336 void LL_RTC_TIME_StructInit(LL_RTC_TimeTypeDef *RTC_TimeStruct)
337 {
338   /* Time = 00h:00min:00sec */
339   RTC_TimeStruct->TimeFormat = LL_RTC_TIME_FORMAT_AM_OR_24;
340   RTC_TimeStruct->Hours      = 0U;
341   RTC_TimeStruct->Minutes    = 0U;
342   RTC_TimeStruct->Seconds    = 0U;
343 }
344 
345 /**
346   * @brief  Set the RTC current date.
347   * @param  RTCx RTC Instance
348   * @param  RTC_Format This parameter can be one of the following values:
349   *         @arg @ref LL_RTC_FORMAT_BIN
350   *         @arg @ref LL_RTC_FORMAT_BCD
351   * @param  RTC_DateStruct pointer to a RTC_DateTypeDef structure that contains
352   *                         the date configuration information for the RTC.
353   * @retval An ErrorStatus enumeration value:
354   *          - SUCCESS: RTC Day register is configured
355   *          - ERROR: RTC Day register is not configured
356   */
LL_RTC_DATE_Init(RTC_TypeDef * RTCx,uint32_t RTC_Format,LL_RTC_DateTypeDef * RTC_DateStruct)357 ErrorStatus LL_RTC_DATE_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_DateTypeDef *RTC_DateStruct)
358 {
359   ErrorStatus status = ERROR;
360 
361   /* Check the parameters */
362   assert_param(IS_RTC_ALL_INSTANCE(RTCx));
363   assert_param(IS_LL_RTC_FORMAT(RTC_Format));
364 
365   if ((RTC_Format == LL_RTC_FORMAT_BIN) && ((RTC_DateStruct->Month & 0x10U) == 0x10U))
366   {
367     RTC_DateStruct->Month = (uint8_t)(RTC_DateStruct->Month & (uint8_t)~(0x10U)) + 0x0AU;
368   }
369   if (RTC_Format == LL_RTC_FORMAT_BIN)
370   {
371     assert_param(IS_LL_RTC_YEAR(RTC_DateStruct->Year));
372     assert_param(IS_LL_RTC_MONTH(RTC_DateStruct->Month));
373     assert_param(IS_LL_RTC_DAY(RTC_DateStruct->Day));
374   }
375   else
376   {
377     assert_param(IS_LL_RTC_YEAR(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Year)));
378     assert_param(IS_LL_RTC_MONTH(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Month)));
379     assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Day)));
380   }
381   assert_param(IS_LL_RTC_WEEKDAY(RTC_DateStruct->WeekDay));
382 
383   /* Disable the write protection for RTC registers */
384   LL_RTC_DisableWriteProtection(RTCx);
385 
386   /* Set Initialization mode */
387   if (LL_RTC_EnterInitMode(RTCx) != ERROR)
388   {
389     /* Check the input parameters format */
390     if (RTC_Format != LL_RTC_FORMAT_BIN)
391     {
392       LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, RTC_DateStruct->Day, RTC_DateStruct->Month, RTC_DateStruct->Year);
393     }
394     else
395     {
396       LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Day),
397                          __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Month), __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Year));
398     }
399 
400     /* Exit Initialization mode */
401     LL_RTC_DisableInitMode(RTCx);
402 
403     /* If  RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
404     if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U)
405     {
406       status = LL_RTC_WaitForSynchro(RTCx);
407     }
408     else
409     {
410       status = SUCCESS;
411     }
412   }
413   /* Enable the write protection for RTC registers */
414   LL_RTC_EnableWriteProtection(RTCx);
415 
416   return status;
417 }
418 
419 /**
420   * @brief  Set each @ref LL_RTC_DateTypeDef field to default value (date = Monday, January 01 xx00)
421   * @param  RTC_DateStruct pointer to a @ref LL_RTC_DateTypeDef structure which will be initialized.
422   * @retval None
423   */
LL_RTC_DATE_StructInit(LL_RTC_DateTypeDef * RTC_DateStruct)424 void LL_RTC_DATE_StructInit(LL_RTC_DateTypeDef *RTC_DateStruct)
425 {
426   /* Monday, January 01 xx00 */
427   RTC_DateStruct->WeekDay = LL_RTC_WEEKDAY_MONDAY;
428   RTC_DateStruct->Day     = 1U;
429   RTC_DateStruct->Month   = LL_RTC_MONTH_JANUARY;
430   RTC_DateStruct->Year    = 0U;
431 }
432 
433 /**
434   * @brief  Set the RTC Alarm A.
435   * @note   The Alarm register can only be written when the corresponding Alarm
436   *         is disabled (Use @ref LL_RTC_ALMA_Disable function).
437   * @param  RTCx RTC Instance
438   * @param  RTC_Format This parameter can be one of the following values:
439   *         @arg @ref LL_RTC_FORMAT_BIN
440   *         @arg @ref LL_RTC_FORMAT_BCD
441   * @param  RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that
442   *                         contains the alarm configuration parameters.
443   * @retval An ErrorStatus enumeration value:
444   *          - SUCCESS: ALARMA registers are configured
445   *          - ERROR: ALARMA registers are not configured
446   */
LL_RTC_ALMA_Init(RTC_TypeDef * RTCx,uint32_t RTC_Format,LL_RTC_AlarmTypeDef * RTC_AlarmStruct)447 ErrorStatus LL_RTC_ALMA_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
448 {
449   /* Check the parameters */
450   assert_param(IS_RTC_ALL_INSTANCE(RTCx));
451   assert_param(IS_LL_RTC_FORMAT(RTC_Format));
452   assert_param(IS_LL_RTC_ALMA_MASK(RTC_AlarmStruct->AlarmMask));
453   assert_param(IS_LL_RTC_ALMA_DATE_WEEKDAY_SEL(RTC_AlarmStruct->AlarmDateWeekDaySel));
454 
455   if (RTC_Format == LL_RTC_FORMAT_BIN)
456   {
457     if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
458     {
459       assert_param(IS_LL_RTC_HOUR12(RTC_AlarmStruct->AlarmTime.Hours));
460       assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat));
461     }
462     else
463     {
464       RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U;
465       assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours));
466     }
467     assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes));
468     assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds));
469 
470     if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE)
471     {
472       assert_param(IS_LL_RTC_DAY(RTC_AlarmStruct->AlarmDateWeekDay));
473     }
474     else
475     {
476       assert_param(IS_LL_RTC_WEEKDAY(RTC_AlarmStruct->AlarmDateWeekDay));
477     }
478   }
479   else
480   {
481     if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
482     {
483       assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
484       assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat));
485     }
486     else
487     {
488       RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U;
489       assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
490     }
491 
492     assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes)));
493     assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds)));
494 
495     if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE)
496     {
497       assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay)));
498     }
499     else
500     {
501       assert_param(IS_LL_RTC_WEEKDAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay)));
502     }
503   }
504 
505   /* Disable the write protection for RTC registers */
506   LL_RTC_DisableWriteProtection(RTCx);
507 
508   /* Select weekday selection */
509   if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE)
510   {
511     /* Set the date for ALARM */
512     LL_RTC_ALMA_DisableWeekday(RTCx);
513     if (RTC_Format != LL_RTC_FORMAT_BIN)
514     {
515       LL_RTC_ALMA_SetDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay);
516     }
517     else
518     {
519       LL_RTC_ALMA_SetDay(RTCx, __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmDateWeekDay));
520     }
521   }
522   else
523   {
524     /* Set the week day for ALARM */
525     LL_RTC_ALMA_EnableWeekday(RTCx);
526     LL_RTC_ALMA_SetWeekDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay);
527   }
528 
529   /* Configure the Alarm register */
530   if (RTC_Format != LL_RTC_FORMAT_BIN)
531   {
532     LL_RTC_ALMA_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, RTC_AlarmStruct->AlarmTime.Hours,
533                            RTC_AlarmStruct->AlarmTime.Minutes, RTC_AlarmStruct->AlarmTime.Seconds);
534   }
535   else
536   {
537     LL_RTC_ALMA_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat,
538                            __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Hours),
539                            __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Minutes),
540                            __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Seconds));
541   }
542   /* Set ALARM mask */
543   LL_RTC_ALMA_SetMask(RTCx, RTC_AlarmStruct->AlarmMask);
544 
545   /* Enable the write protection for RTC registers */
546   LL_RTC_EnableWriteProtection(RTCx);
547 
548   return SUCCESS;
549 }
550 
551 /**
552   * @brief  Set the RTC Alarm B.
553   * @note   The Alarm register can only be written when the corresponding Alarm
554   *         is disabled (@ref LL_RTC_ALMB_Disable function).
555   * @param  RTCx RTC Instance
556   * @param  RTC_Format This parameter can be one of the following values:
557   *         @arg @ref LL_RTC_FORMAT_BIN
558   *         @arg @ref LL_RTC_FORMAT_BCD
559   * @param  RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that
560   *                         contains the alarm configuration parameters.
561   * @retval An ErrorStatus enumeration value:
562   *          - SUCCESS: ALARMB registers are configured
563   *          - ERROR: ALARMB registers are not configured
564   */
LL_RTC_ALMB_Init(RTC_TypeDef * RTCx,uint32_t RTC_Format,LL_RTC_AlarmTypeDef * RTC_AlarmStruct)565 ErrorStatus LL_RTC_ALMB_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
566 {
567   /* Check the parameters */
568   assert_param(IS_RTC_ALL_INSTANCE(RTCx));
569   assert_param(IS_LL_RTC_FORMAT(RTC_Format));
570   assert_param(IS_LL_RTC_ALMB_MASK(RTC_AlarmStruct->AlarmMask));
571   assert_param(IS_LL_RTC_ALMB_DATE_WEEKDAY_SEL(RTC_AlarmStruct->AlarmDateWeekDaySel));
572 
573   if (RTC_Format == LL_RTC_FORMAT_BIN)
574   {
575     if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
576     {
577       assert_param(IS_LL_RTC_HOUR12(RTC_AlarmStruct->AlarmTime.Hours));
578       assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat));
579     }
580     else
581     {
582       RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U;
583       assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours));
584     }
585     assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes));
586     assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds));
587 
588     if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE)
589     {
590       assert_param(IS_LL_RTC_DAY(RTC_AlarmStruct->AlarmDateWeekDay));
591     }
592     else
593     {
594       assert_param(IS_LL_RTC_WEEKDAY(RTC_AlarmStruct->AlarmDateWeekDay));
595     }
596   }
597   else
598   {
599     if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
600     {
601       assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
602       assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat));
603     }
604     else
605     {
606       RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U;
607       assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
608     }
609 
610     assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes)));
611     assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds)));
612 
613     if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE)
614     {
615       assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay)));
616     }
617     else
618     {
619       assert_param(IS_LL_RTC_WEEKDAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay)));
620     }
621   }
622 
623   /* Disable the write protection for RTC registers */
624   LL_RTC_DisableWriteProtection(RTCx);
625 
626   /* Select weekday selection */
627   if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE)
628   {
629     /* Set the date for ALARM */
630     LL_RTC_ALMB_DisableWeekday(RTCx);
631     if (RTC_Format != LL_RTC_FORMAT_BIN)
632     {
633       LL_RTC_ALMB_SetDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay);
634     }
635     else
636     {
637       LL_RTC_ALMB_SetDay(RTCx, __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmDateWeekDay));
638     }
639   }
640   else
641   {
642     /* Set the week day for ALARM */
643     LL_RTC_ALMB_EnableWeekday(RTCx);
644     LL_RTC_ALMB_SetWeekDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay);
645   }
646 
647   /* Configure the Alarm register */
648   if (RTC_Format != LL_RTC_FORMAT_BIN)
649   {
650     LL_RTC_ALMB_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, RTC_AlarmStruct->AlarmTime.Hours,
651                            RTC_AlarmStruct->AlarmTime.Minutes, RTC_AlarmStruct->AlarmTime.Seconds);
652   }
653   else
654   {
655     LL_RTC_ALMB_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat,
656                            __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Hours),
657                            __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Minutes),
658                            __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Seconds));
659   }
660   /* Set ALARM mask */
661   LL_RTC_ALMB_SetMask(RTCx, RTC_AlarmStruct->AlarmMask);
662 
663   /* Enable the write protection for RTC registers */
664   LL_RTC_EnableWriteProtection(RTCx);
665 
666   return SUCCESS;
667 }
668 
669 /**
670   * @brief  Set each @ref LL_RTC_AlarmTypeDef of ALARMA field to default value (Time = 00h:00mn:00sec /
671   *         Day = 1st day of the month/Mask = all fields are masked).
672   * @param  RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized.
673   * @retval None
674   */
LL_RTC_ALMA_StructInit(LL_RTC_AlarmTypeDef * RTC_AlarmStruct)675 void LL_RTC_ALMA_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
676 {
677   /* Alarm Time Settings : Time = 00h:00mn:00sec */
678   RTC_AlarmStruct->AlarmTime.TimeFormat = LL_RTC_ALMA_TIME_FORMAT_AM;
679   RTC_AlarmStruct->AlarmTime.Hours      = 0U;
680   RTC_AlarmStruct->AlarmTime.Minutes    = 0U;
681   RTC_AlarmStruct->AlarmTime.Seconds    = 0U;
682 
683   /* Alarm Day Settings : Day = 1st day of the month */
684   RTC_AlarmStruct->AlarmDateWeekDaySel = LL_RTC_ALMA_DATEWEEKDAYSEL_DATE;
685   RTC_AlarmStruct->AlarmDateWeekDay    = 1U;
686 
687   /* Alarm Masks Settings : Mask =  all fields are not masked */
688   RTC_AlarmStruct->AlarmMask           = LL_RTC_ALMA_MASK_NONE;
689 }
690 
691 /**
692   * @brief  Set each @ref LL_RTC_AlarmTypeDef of ALARMA field to default value (Time = 00h:00mn:00sec /
693   *         Day = 1st day of the month/Mask = all fields are masked).
694   * @param  RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized.
695   * @retval None
696   */
LL_RTC_ALMB_StructInit(LL_RTC_AlarmTypeDef * RTC_AlarmStruct)697 void LL_RTC_ALMB_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
698 {
699   /* Alarm Time Settings : Time = 00h:00mn:00sec */
700   RTC_AlarmStruct->AlarmTime.TimeFormat = LL_RTC_ALMB_TIME_FORMAT_AM;
701   RTC_AlarmStruct->AlarmTime.Hours      = 0U;
702   RTC_AlarmStruct->AlarmTime.Minutes    = 0U;
703   RTC_AlarmStruct->AlarmTime.Seconds    = 0U;
704 
705   /* Alarm Day Settings : Day = 1st day of the month */
706   RTC_AlarmStruct->AlarmDateWeekDaySel = LL_RTC_ALMB_DATEWEEKDAYSEL_DATE;
707   RTC_AlarmStruct->AlarmDateWeekDay    = 1U;
708 
709   /* Alarm Masks Settings : Mask =  all fields are not masked */
710   RTC_AlarmStruct->AlarmMask           = LL_RTC_ALMB_MASK_NONE;
711 }
712 
713 /**
714   * @brief  Enters the RTC Initialization mode.
715   * @note   The RTC Initialization mode is write protected, use the
716   *         @ref LL_RTC_DisableWriteProtection before calling this function.
717   * @param  RTCx RTC Instance
718   * @retval An ErrorStatus enumeration value:
719   *          - SUCCESS: RTC is in Init mode
720   *          - ERROR: RTC is not in Init mode
721   */
LL_RTC_EnterInitMode(RTC_TypeDef * RTCx)722 ErrorStatus LL_RTC_EnterInitMode(RTC_TypeDef *RTCx)
723 {
724   __IO uint32_t timeout = RTC_INITMODE_TIMEOUT;
725   ErrorStatus status = SUCCESS;
726   uint32_t tmp = 0U;
727 
728   /* Check the parameter */
729   assert_param(IS_RTC_ALL_INSTANCE(RTCx));
730 
731   /* Check if the Initialization mode is set */
732   if (LL_RTC_IsActiveFlag_INIT(RTCx) == 0U)
733   {
734     /* Set the Initialization mode */
735     LL_RTC_EnableInitMode(RTCx);
736 
737     /* Wait till RTC is in INIT state and if Time out is reached exit */
738     tmp = LL_RTC_IsActiveFlag_INIT(RTCx);
739     while ((timeout != 0U) && (tmp != 1U))
740     {
741       if (LL_SYSTICK_IsActiveCounterFlag() == 1U)
742       {
743         timeout --;
744       }
745       tmp = LL_RTC_IsActiveFlag_INIT(RTCx);
746       if (timeout == 0U)
747       {
748         status = ERROR;
749       }
750     }
751   }
752   return status;
753 }
754 
755 /**
756   * @brief  Exit the RTC Initialization mode.
757   * @note   When the initialization sequence is complete, the calendar restarts
758   *         counting after 4 RTCCLK cycles.
759   * @note   The RTC Initialization mode is write protected, use the
760   *         @ref LL_RTC_DisableWriteProtection before calling this function.
761   * @param  RTCx RTC Instance
762   * @retval An ErrorStatus enumeration value:
763   *          - SUCCESS: RTC exited from in Init mode
764   *          - ERROR: Not applicable
765   */
LL_RTC_ExitInitMode(RTC_TypeDef * RTCx)766 ErrorStatus LL_RTC_ExitInitMode(RTC_TypeDef *RTCx)
767 {
768   /* Check the parameter */
769   assert_param(IS_RTC_ALL_INSTANCE(RTCx));
770 
771   /* Disable initialization mode */
772   LL_RTC_DisableInitMode(RTCx);
773 
774   return SUCCESS;
775 }
776 
777 /**
778   * @brief  Waits until the RTC Time and Day registers (RTC_TR and RTC_DR) are
779   *         synchronized with RTC APB clock.
780   * @note   The RTC Resynchronization mode is write protected, use the
781   *         @ref LL_RTC_DisableWriteProtection before calling this function.
782   * @note   To read the calendar through the shadow registers after calendar
783   *         initialization, calendar update or after wakeup from low power modes
784   *         the software must first clear the RSF flag.
785   *         The software must then wait until it is set again before reading
786   *         the calendar, which means that the calendar registers have been
787   *         correctly copied into the RTC_TR and RTC_DR shadow registers.
788   * @param  RTCx RTC Instance
789   * @retval An ErrorStatus enumeration value:
790   *          - SUCCESS: RTC registers are synchronised
791   *          - ERROR: RTC registers are not synchronised
792   */
LL_RTC_WaitForSynchro(RTC_TypeDef * RTCx)793 ErrorStatus LL_RTC_WaitForSynchro(RTC_TypeDef *RTCx)
794 {
795   __IO uint32_t timeout = RTC_SYNCHRO_TIMEOUT;
796   ErrorStatus status = SUCCESS;
797   uint32_t tmp = 0U;
798 
799   /* Check the parameter */
800   assert_param(IS_RTC_ALL_INSTANCE(RTCx));
801 
802   /* Clear RSF flag */
803   LL_RTC_ClearFlag_RS(RTCx);
804 
805   /* Wait the registers to be synchronised */
806   tmp = LL_RTC_IsActiveFlag_RS(RTCx);
807   while ((timeout != 0U) && (tmp != 1U))
808   {
809     if (LL_SYSTICK_IsActiveCounterFlag() == 1U)
810     {
811       timeout--;
812     }
813     tmp = LL_RTC_IsActiveFlag_RS(RTCx);
814     if (timeout == 0U)
815     {
816       status = ERROR;
817     }
818   }
819 
820   return (status);
821 }
822 
823 /**
824   * @}
825   */
826 
827 /**
828   * @}
829   */
830 
831 /**
832   * @}
833   */
834 
835 #endif /* defined(RTC) */
836 
837 /**
838   * @}
839   */
840 
841 #endif /* USE_FULL_LL_DRIVER */
842