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