1 /**
2   ******************************************************************************
3   * @file    stm32l1xx_hal_rtc_ex.c
4   * @author  MCD Application Team
5   * @brief   Extended RTC HAL module driver.
6   *          This file provides firmware functions to manage the following
7   *          functionalities of the Real-Time Clock (RTC) Extended peripheral:
8   *           + RTC Timestamp functions
9   *           + RTC Tamper functions
10   *           + RTC Wakeup functions
11   *           + Extended Control functions
12   *           + Extended RTC features functions
13   *
14   ******************************************************************************
15   * @attention
16   *
17   * Copyright (c) 2016 STMicroelectronics.
18   * All rights reserved.
19   *
20   * This software is licensed under terms that can be found in the LICENSE file
21   * in the root directory of this software component.
22   * If no LICENSE file comes with this software, it is provided AS-IS.
23   *
24   ******************************************************************************
25   @verbatim
26   ==============================================================================
27                         ##### How to use this driver #####
28   ==============================================================================
29   [..]
30     (+) Enable the RTC domain access.
31     (+) Configure the RTC Prescaler (Asynchronous and Synchronous) and RTC hour
32         format using the HAL_RTC_Init() function.
33 
34   *** RTC Wakeup configuration ***
35   ================================
36   [..]
37     (+) To configure the RTC Wakeup Clock source and Counter use the
38         HAL_RTCEx_SetWakeUpTimer() function.
39         You can also configure the RTC Wakeup timer in interrupt mode using the
40         HAL_RTCEx_SetWakeUpTimer_IT() function.
41     (+) To read the RTC Wakeup Counter register, use the HAL_RTCEx_GetWakeUpTimer()
42         function.
43 
44   *** Timestamp configuration ***
45   ===============================
46   [..]
47     (+) To configure the RTC Timestamp use the HAL_RTCEx_SetTimeStamp() function.
48         You can also configure the RTC Timestamp with interrupt mode using the
49         HAL_RTCEx_SetTimeStamp_IT() function.
50     (+) To read the RTC Timestamp Time and Date register, use the
51         HAL_RTCEx_GetTimeStamp() function.
52     (+) The Timestamp alternate function is mapped to RTC_AF1 (PC13).
53 
54   *** Tamper configuration ***
55   ============================
56   [..]
57     (+) To Enable the RTC Tamper and configure the Tamper filter count, trigger
58         Edge or Level according to the Tamper filter value (if equal to 0 Edge
59         else Level), sampling frequency, precharge or discharge and Pull-UP use
60         the HAL_RTCEx_SetTamper() function.
61         You can configure RTC Tamper in interrupt mode using HAL_RTCEx_SetTamper_IT()
62         function.
63     (+) The TAMPER1 alternate function is mapped to RTC_AF1 (PC13).
64     (+) The TAMPER2 alternate function is mapped to RTC_AF2 (PA0).
65     (+) The TAMPER3 alternate function is mapped to RTC_AF3 (PE6).
66 
67   *** Backup Data Registers configuration ***
68   ===========================================
69   [..]
70     (+) To write to the RTC Backup Data registers, use the HAL_RTCEx_BKUPWrite()
71         function.
72     (+) To read the RTC Backup Data registers, use the HAL_RTCEx_BKUPRead()
73         function.
74 
75   *** Coarse Digital Calibration configuration ***
76   ================================================
77   [..]
78     (+) The Coarse Digital Calibration can be used to compensate crystal inaccuracy
79         by setting the DCS bit in RTC_CALIBR register.
80     (+) When positive calibration is enabled (DCS = ‘0’), 2 asynchronous prescaler
81         clock cycles are added every minute during 2xDC minutes.
82         This causes the calendar to be updated sooner, thereby adjusting the
83         effective RTC frequency to be a bit higher.
84     (+) When negative calibration is enabled (DCS = ‘1’), 1 asynchronous prescaler
85         clock cycle is removed every minute during 2xDC minutes.
86         This causes the calendar to be updated later, thereby adjusting the
87         effective RTC frequency to be a bit lower.
88     (+) DC is configured through bits DC[4:0] of RTC_CALIBR register. This number
89         ranges from 0 to 31 corresponding to a time interval (2xDC) ranging from
90         0 to 62.
91     (+) In order to measure the clock deviation, a 512 Hz clock is output for
92         calibration.
93     (+) The RTC Coarse Digital Calibration value and sign can be calibrated using
94         the HAL_RTCEx_SetCoarseCalib() function.
95 
96   *** Smooth Digital Calibration configuration ***
97   ================================================
98   [..]
99     (+) RTC frequency can be digitally calibrated with a resolution of about
100         0.954 ppm with a range from -487.1 ppm to +488.5 ppm.
101         The correction of the frequency is performed using a series of small
102         adjustments (adding and/or subtracting individual RTCCLK pulses).
103     (+) The smooth digital calibration is performed during a cycle of about 2^20
104         RTCCLK pulses (or 32 seconds) when the input frequency is 32,768 Hz.
105         This cycle is maintained by a 20-bit counter clocked by RTCCLK.
106     (+) The smooth calibration register (RTC_CALR) specifies the number of RTCCLK
107         clock cycles to be masked during the 32-second cycle.
108     (+) The RTC Smooth Digital Calibration value and the corresponding calibration
109         cycle period (32s, 16s, or 8s) can be calibrated using the
110         HAL_RTCEx_SetSmoothCalib() function.
111 
112   @endverbatim
113   ******************************************************************************
114   */
115 
116 /* Includes ------------------------------------------------------------------*/
117 #include "stm32l1xx_hal.h"
118 
119 /** @addtogroup STM32L1xx_HAL_Driver
120   * @{
121   */
122 
123 /** @defgroup RTCEx RTCEx
124   * @brief    RTC Extended HAL module driver
125   * @{
126   */
127 
128 #ifdef HAL_RTC_MODULE_ENABLED
129 
130 /* Private typedef -----------------------------------------------------------*/
131 /* Private define ------------------------------------------------------------*/
132 /* Private macro -------------------------------------------------------------*/
133 /* Private variables ---------------------------------------------------------*/
134 /* Private function prototypes -----------------------------------------------*/
135 /* Exported functions --------------------------------------------------------*/
136 
137 /** @defgroup RTCEx_Exported_Functions RTCEx Exported Functions
138   * @{
139   */
140 
141 /** @defgroup RTCEx_Exported_Functions_Group1 RTC Timestamp and Tamper functions
142   * @brief    RTC Timestamp and Tamper functions
143   *
144 @verbatim
145  ===============================================================================
146                  ##### RTC Timestamp and Tamper functions #####
147  ===============================================================================
148 
149  [..] This section provides functions allowing to configure Timestamp feature
150 
151 @endverbatim
152   * @{
153   */
154 
155 /**
156   * @brief  Sets Timestamp.
157   * @note   This API must be called before enabling the Timestamp feature.
158   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
159   *                the configuration information for RTC.
160   * @param  RTC_TimeStampEdge Specifies the pin edge on which the Timestamp is
161   *         activated.
162   *          This parameter can be one of the following values:
163   *             @arg RTC_TIMESTAMPEDGE_RISING: the Timestamp event occurs on
164   *                                        the rising edge of the related pin.
165   *             @arg RTC_TIMESTAMPEDGE_FALLING: the Timestamp event occurs on
166   *                                        the falling edge of the related pin.
167   * @retval HAL status
168   */
HAL_RTCEx_SetTimeStamp(RTC_HandleTypeDef * hrtc,uint32_t RTC_TimeStampEdge)169 HAL_StatusTypeDef HAL_RTCEx_SetTimeStamp(RTC_HandleTypeDef *hrtc, uint32_t RTC_TimeStampEdge)
170 {
171   uint32_t tmpreg = 0U;
172 
173   /* Check the parameters */
174   assert_param(IS_TIMESTAMP_EDGE(RTC_TimeStampEdge));
175 
176   /* Process Locked */
177   __HAL_LOCK(hrtc);
178 
179   /* Change RTC state to BUSY */
180   hrtc->State = HAL_RTC_STATE_BUSY;
181 
182   /* Get the RTC_CR register and clear the bits to be configured */
183   tmpreg = (uint32_t)(hrtc->Instance->CR & (uint32_t)~(RTC_CR_TSEDGE | RTC_CR_TSE));
184 
185   /* Configure the Timestamp TSEDGE bit */
186   tmpreg |= RTC_TimeStampEdge;
187 
188   /* Disable the write protection for RTC registers */
189   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
190 
191   /* Copy the desired configuration into the CR register */
192   hrtc->Instance->CR = (uint32_t)tmpreg;
193 
194   /* Clear RTC Timestamp flag */
195   __HAL_RTC_TIMESTAMP_CLEAR_FLAG(hrtc, RTC_FLAG_TSF);
196 
197   /* Clear RTC Timestamp overrun Flag */
198   __HAL_RTC_TIMESTAMP_CLEAR_FLAG(hrtc, RTC_FLAG_TSOVF);
199 
200   /* Enable the Timestamp saving */
201   __HAL_RTC_TIMESTAMP_ENABLE(hrtc);
202 
203   /* Enable the write protection for RTC registers */
204   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
205 
206   /* Change RTC state back to READY */
207   hrtc->State = HAL_RTC_STATE_READY;
208 
209   /* Process Unlocked */
210   __HAL_UNLOCK(hrtc);
211 
212   return HAL_OK;
213 }
214 
215 /**
216   * @brief  Sets Timestamp with Interrupt.
217   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
218   *                the configuration information for RTC.
219   * @note   This API must be called before enabling the Timestamp feature.
220   * @param  RTC_TimeStampEdge Specifies the pin edge on which the Timestamp is
221   *         activated.
222   *          This parameter can be one of the following values:
223   *             @arg RTC_TIMESTAMPEDGE_RISING: the Timestamp event occurs on
224   *                                        the rising edge of the related pin.
225   *             @arg RTC_TIMESTAMPEDGE_FALLING: the Timestamp event occurs on
226   *                                        the falling edge of the related pin.
227   * @retval HAL status
228   */
HAL_RTCEx_SetTimeStamp_IT(RTC_HandleTypeDef * hrtc,uint32_t RTC_TimeStampEdge)229 HAL_StatusTypeDef HAL_RTCEx_SetTimeStamp_IT(RTC_HandleTypeDef *hrtc, uint32_t RTC_TimeStampEdge)
230 {
231   uint32_t tmpreg = 0U;
232 
233   /* Check the parameters */
234   assert_param(IS_TIMESTAMP_EDGE(RTC_TimeStampEdge));
235 
236   /* Process Locked */
237   __HAL_LOCK(hrtc);
238 
239   /* Change RTC state to BUSY */
240   hrtc->State = HAL_RTC_STATE_BUSY;
241 
242   /* Get the RTC_CR register and clear the bits to be configured */
243   tmpreg = (uint32_t)(hrtc->Instance->CR & (uint32_t)~(RTC_CR_TSEDGE | RTC_CR_TSE));
244 
245   /* Configure the Timestamp TSEDGE bit */
246   tmpreg |= RTC_TimeStampEdge;
247 
248   /* Disable the write protection for RTC registers */
249   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
250 
251   /* Copy the desired configuration into the CR register */
252   hrtc->Instance->CR = (uint32_t)tmpreg;
253 
254   /* Clear RTC Timestamp flag */
255   __HAL_RTC_TIMESTAMP_CLEAR_FLAG(hrtc, RTC_FLAG_TSF);
256 
257   /* Clear RTC Timestamp overrun Flag */
258   __HAL_RTC_TIMESTAMP_CLEAR_FLAG(hrtc, RTC_FLAG_TSOVF);
259 
260   /* Enable the Timestamp saving */
261   __HAL_RTC_TIMESTAMP_ENABLE(hrtc);
262 
263   /* Enable IT Timestamp */
264   __HAL_RTC_TIMESTAMP_ENABLE_IT(hrtc, RTC_IT_TS);
265 
266   /* Enable the write protection for RTC registers */
267   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
268 
269   /* RTC Timestamp Interrupt Configuration: EXTI configuration */
270   __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_IT();
271   __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_RISING_EDGE();
272 
273   /* Change RTC state back to READY */
274   hrtc->State = HAL_RTC_STATE_READY;
275 
276   /* Process Unlocked */
277   __HAL_UNLOCK(hrtc);
278 
279   return HAL_OK;
280 }
281 
282 /**
283   * @brief  Deactivates Timestamp.
284   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
285   *                the configuration information for RTC.
286   * @retval HAL status
287   */
HAL_RTCEx_DeactivateTimeStamp(RTC_HandleTypeDef * hrtc)288 HAL_StatusTypeDef HAL_RTCEx_DeactivateTimeStamp(RTC_HandleTypeDef *hrtc)
289 {
290   uint32_t tmpreg = 0U;
291 
292   /* Process Locked */
293   __HAL_LOCK(hrtc);
294 
295   hrtc->State = HAL_RTC_STATE_BUSY;
296 
297   /* Disable the write protection for RTC registers */
298   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
299 
300   /* In case of interrupt mode is used, the interrupt source must disabled */
301   __HAL_RTC_TIMESTAMP_DISABLE_IT(hrtc, RTC_IT_TS);
302 
303   /* Get the RTC_CR register and clear the bits to be configured */
304   tmpreg = (uint32_t)(hrtc->Instance->CR & (uint32_t)~(RTC_CR_TSEDGE | RTC_CR_TSE));
305 
306   /* Configure the Timestamp TSEDGE and Enable bits */
307   hrtc->Instance->CR = (uint32_t)tmpreg;
308 
309   /* Enable the write protection for RTC registers */
310   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
311 
312   hrtc->State = HAL_RTC_STATE_READY;
313 
314   /* Process Unlocked */
315   __HAL_UNLOCK(hrtc);
316 
317   return HAL_OK;
318 }
319 
320 /**
321   * @brief  Gets the RTC Timestamp value.
322   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
323   *                the configuration information for RTC.
324   * @param  sTimeStamp Pointer to Time structure
325   * @param  sTimeStampDate Pointer to Date structure
326   * @param  Format specifies the format of the entered parameters.
327   *          This parameter can be one of the following values:
328   *             @arg RTC_FORMAT_BIN: Binary data format
329   *             @arg RTC_FORMAT_BCD: BCD data format
330   * @retval HAL status
331   */
HAL_RTCEx_GetTimeStamp(RTC_HandleTypeDef * hrtc,RTC_TimeTypeDef * sTimeStamp,RTC_DateTypeDef * sTimeStampDate,uint32_t Format)332 HAL_StatusTypeDef HAL_RTCEx_GetTimeStamp(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTimeStamp, RTC_DateTypeDef *sTimeStampDate, uint32_t Format)
333 {
334   uint32_t tmptime = 0U;
335   uint32_t tmpdate = 0U;
336 
337   /* Check the parameters */
338   assert_param(IS_RTC_FORMAT(Format));
339 
340   /* Get the Timestamp time and date registers values */
341   tmptime = (uint32_t)(hrtc->Instance->TSTR & RTC_TR_RESERVED_MASK);
342   tmpdate = (uint32_t)(hrtc->Instance->TSDR & RTC_DR_RESERVED_MASK);
343 
344   /* Fill the Time structure fields with the read parameters */
345   sTimeStamp->Hours      = (uint8_t)((tmptime & (RTC_TSTR_HT  | RTC_TSTR_HU))  >> RTC_TSTR_HU_Pos);
346   sTimeStamp->Minutes    = (uint8_t)((tmptime & (RTC_TSTR_MNT | RTC_TSTR_MNU)) >> RTC_TSTR_MNU_Pos);
347   sTimeStamp->Seconds    = (uint8_t)((tmptime & (RTC_TSTR_ST  | RTC_TSTR_SU))  >> RTC_TSTR_SU_Pos);
348   sTimeStamp->TimeFormat = (uint8_t)((tmptime & (RTC_TSTR_PM))                 >> RTC_TSTR_PM_Pos);
349 #if defined(RTC_SUBSECOND_SUPPORT)
350   sTimeStamp->SubSeconds = (uint32_t) hrtc->Instance->TSSSR;
351 #endif /* RTC_SUBSECOND_SUPPORT */
352 
353   /* Fill the Date structure fields with the read parameters */
354   sTimeStampDate->Year    = 0U;
355   sTimeStampDate->Month   = (uint8_t)((tmpdate & (RTC_TSDR_MT | RTC_TSDR_MU)) >> RTC_TSDR_MU_Pos);
356   sTimeStampDate->Date    = (uint8_t)((tmpdate & (RTC_TSDR_DT | RTC_TSDR_DU)) >> RTC_TSDR_DU_Pos);
357   sTimeStampDate->WeekDay = (uint8_t)((tmpdate & (RTC_TSDR_WDU))              >> RTC_TSDR_WDU_Pos);
358 
359   /* Check the input parameters format */
360   if (Format == RTC_FORMAT_BIN)
361   {
362     /* Convert the Timestamp structure parameters to Binary format */
363     sTimeStamp->Hours   = (uint8_t)RTC_Bcd2ToByte(sTimeStamp->Hours);
364     sTimeStamp->Minutes = (uint8_t)RTC_Bcd2ToByte(sTimeStamp->Minutes);
365     sTimeStamp->Seconds = (uint8_t)RTC_Bcd2ToByte(sTimeStamp->Seconds);
366 
367     /* Convert the DateTimeStamp structure parameters to Binary format */
368     sTimeStampDate->Month   = (uint8_t)RTC_Bcd2ToByte(sTimeStampDate->Month);
369     sTimeStampDate->Date    = (uint8_t)RTC_Bcd2ToByte(sTimeStampDate->Date);
370     sTimeStampDate->WeekDay = (uint8_t)RTC_Bcd2ToByte(sTimeStampDate->WeekDay);
371   }
372 
373   /* Clear the Timestamp Flag */
374   __HAL_RTC_TIMESTAMP_CLEAR_FLAG(hrtc, RTC_FLAG_TSF);
375 
376   return HAL_OK;
377 }
378 
379 /**
380   * @brief  Sets Tamper.
381   * @note   By calling this API the tamper global interrupt will be disabled.
382   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
383   *                the configuration information for RTC.
384   * @param  sTamper Pointer to Tamper Structure.
385   * @retval HAL status
386   */
HAL_RTCEx_SetTamper(RTC_HandleTypeDef * hrtc,RTC_TamperTypeDef * sTamper)387 HAL_StatusTypeDef HAL_RTCEx_SetTamper(RTC_HandleTypeDef *hrtc, RTC_TamperTypeDef *sTamper)
388 {
389   uint32_t tmpreg = 0U;
390 
391   /* Check the parameters */
392   assert_param(IS_RTC_TAMPER(sTamper->Tamper));
393   assert_param(IS_RTC_TAMPER_TRIGGER(sTamper->Trigger));
394 #if defined(RTC_TAFCR_TAMPFLT)
395   assert_param(IS_RTC_TAMPER_FILTER(sTamper->Filter));
396   assert_param(IS_RTC_TAMPER_FILTER_CONFIG_CORRECT(sTamper->Filter, sTamper->Trigger));
397   assert_param(IS_RTC_TAMPER_SAMPLING_FREQ(sTamper->SamplingFrequency));
398   assert_param(IS_RTC_TAMPER_PRECHARGE_DURATION(sTamper->PrechargeDuration));
399   assert_param(IS_RTC_TAMPER_PULLUP_STATE(sTamper->TamperPullUp));
400 #endif /* RTC_TAFCR_TAMPFLT */
401 #if defined(RTC_TAFCR_TAMPTS)
402   assert_param(IS_RTC_TAMPER_TIMESTAMPONTAMPER_DETECTION(sTamper->TimeStampOnTamperDetection));
403 #endif /* RTC_TAFCR_TAMPTS */
404 
405   /* Process Locked */
406   __HAL_LOCK(hrtc);
407 
408   hrtc->State = HAL_RTC_STATE_BUSY;
409 
410   /* Copy control register into temporary variable */
411   tmpreg = hrtc->Instance->TAFCR;
412 
413   /* Enable selected tamper */
414   tmpreg |= (sTamper->Tamper);
415 
416   /* Configure the tamper trigger bit (this bit is just on the right of the
417        tamper enable bit, hence the one-time right shift before updating it) */
418   if (sTamper->Trigger == RTC_TAMPERTRIGGER_FALLINGEDGE)
419   {
420     /* Set the tamper trigger bit (case of falling edge or high level) */
421     tmpreg |= (uint32_t)(sTamper->Tamper << 1U);
422   }
423   else
424   {
425     /* Clear the tamper trigger bit (case of rising edge or low level) */
426     tmpreg &= (uint32_t)~(sTamper->Tamper << 1U);
427   }
428 
429 #if (defined(RTC_TAFCR_TAMPFLT)  && defined(RTC_TAFCR_TAMPTS) )
430   /* Clear remaining fields before setting them */
431   tmpreg &= ~(RTC_TAMPERFILTER_MASK              | \
432               RTC_TAMPERSAMPLINGFREQ_RTCCLK_MASK | \
433               RTC_TAMPERPRECHARGEDURATION_MASK   | \
434               RTC_TAMPER_PULLUP_MASK             | \
435               RTC_TIMESTAMPONTAMPERDETECTION_MASK);
436 
437   /* Set remaining parameters of desired configuration into temporary variable */
438   tmpreg |= ((uint32_t)sTamper->Filter            | \
439              (uint32_t)sTamper->SamplingFrequency | \
440              (uint32_t)sTamper->PrechargeDuration | \
441              (uint32_t)sTamper->TamperPullUp      | \
442              (uint32_t)sTamper->TimeStampOnTamperDetection);
443 #endif /* RTC_TAFCR_TAMPFLT && RTC_TAFCR_TAMPTS */
444 
445   /* Disable tamper global interrupt in case it is enabled */
446   tmpreg &= (uint32_t)~RTC_TAFCR_TAMPIE;
447 
448   /* Copy desired configuration into configuration register */
449   hrtc->Instance->TAFCR = tmpreg;
450 
451   hrtc->State = HAL_RTC_STATE_READY;
452 
453   /* Process Unlocked */
454   __HAL_UNLOCK(hrtc);
455 
456   return HAL_OK;
457 }
458 
459 /**
460   * @brief  Sets Tamper with interrupt.
461   * @note   By calling this API the tamper global interrupt will be enabled.
462   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
463   *                the configuration information for RTC.
464   * @param  sTamper Pointer to RTC Tamper.
465   * @retval HAL status
466   */
HAL_RTCEx_SetTamper_IT(RTC_HandleTypeDef * hrtc,RTC_TamperTypeDef * sTamper)467 HAL_StatusTypeDef HAL_RTCEx_SetTamper_IT(RTC_HandleTypeDef *hrtc, RTC_TamperTypeDef *sTamper)
468 {
469   uint32_t tmpreg = 0U;
470 
471   /* Check the parameters */
472   assert_param(IS_RTC_TAMPER(sTamper->Tamper));
473   assert_param(IS_RTC_TAMPER_TRIGGER(sTamper->Trigger));
474 #if defined(RTC_TAFCR_TAMPFLT)
475   assert_param(IS_RTC_TAMPER_FILTER(sTamper->Filter));
476   assert_param(IS_RTC_TAMPER_FILTER_CONFIG_CORRECT(sTamper->Filter, sTamper->Trigger));
477   assert_param(IS_RTC_TAMPER_SAMPLING_FREQ(sTamper->SamplingFrequency));
478   assert_param(IS_RTC_TAMPER_PRECHARGE_DURATION(sTamper->PrechargeDuration));
479   assert_param(IS_RTC_TAMPER_PULLUP_STATE(sTamper->TamperPullUp));
480 #endif /* RTC_TAFCR_TAMPFLT */
481 #if defined(RTC_TAFCR_TAMPTS)
482   assert_param(IS_RTC_TAMPER_TIMESTAMPONTAMPER_DETECTION(sTamper->TimeStampOnTamperDetection));
483 #endif /* RTC_TAFCR_TAMPTS */
484 
485   /* Process Locked */
486   __HAL_LOCK(hrtc);
487 
488   hrtc->State = HAL_RTC_STATE_BUSY;
489 
490   /* Copy control register into temporary variable */
491   tmpreg = hrtc->Instance->TAFCR;
492 
493   /* Enable selected tamper */
494   tmpreg |= (sTamper->Tamper);
495 
496   /* Configure the tamper trigger bit (this bit is just on the right of the
497        tamper enable bit, hence the one-time right shift before updating it) */
498   if (sTamper->Trigger == RTC_TAMPERTRIGGER_FALLINGEDGE)
499   {
500     /* Set the tamper trigger bit (case of falling edge or high level) */
501     tmpreg |= (uint32_t)(sTamper->Tamper << 1U);
502   }
503   else
504   {
505     /* Clear the tamper trigger bit (case of rising edge or low level) */
506     tmpreg &= (uint32_t)~(sTamper->Tamper << 1U);
507   }
508 
509 #if (defined(RTC_TAFCR_TAMPFLT)  && defined(RTC_TAFCR_TAMPTS) )
510   /* Clear remaining fields before setting them */
511   tmpreg &= ~(RTC_TAMPERFILTER_MASK              | \
512               RTC_TAMPERSAMPLINGFREQ_RTCCLK_MASK | \
513               RTC_TAMPERPRECHARGEDURATION_MASK   | \
514               RTC_TAMPER_PULLUP_MASK             | \
515               RTC_TIMESTAMPONTAMPERDETECTION_MASK);
516 
517   /* Set remaining parameters of desired configuration into temporary variable */
518   tmpreg |= ((uint32_t)sTamper->Filter            | \
519              (uint32_t)sTamper->SamplingFrequency | \
520              (uint32_t)sTamper->PrechargeDuration | \
521              (uint32_t)sTamper->TamperPullUp      | \
522              (uint32_t)sTamper->TimeStampOnTamperDetection);
523 #endif /* RTC_TAFCR_TAMPFLT && RTC_TAFCR_TAMPTS */
524 
525   /* Enable global tamper interrupt */
526   tmpreg |= (uint32_t)RTC_TAFCR_TAMPIE;
527 
528   /* Copy desired configuration into configuration register */
529   hrtc->Instance->TAFCR = tmpreg;
530 
531   /* RTC Tamper Interrupt Configuration: EXTI configuration */
532   __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_IT();
533   __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_RISING_EDGE();
534 
535   hrtc->State = HAL_RTC_STATE_READY;
536 
537   /* Process Unlocked */
538   __HAL_UNLOCK(hrtc);
539 
540   return HAL_OK;
541 }
542 
543 /**
544   * @brief  Deactivates Tamper.
545   * @note   The tamper global interrupt bit will remain unchanged.
546   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
547   *                the configuration information for RTC.
548   * @param  Tamper Selected tamper pin.
549   *          This parameter can be any combination of the following values:
550   *            @arg RTC_TAMPER_1:  Tamper 1
551   *            @arg RTC_TAMPER_2:  Tamper 2
552   *            @arg RTC_TAMPER_3:  Tamper 3
553   * @note   RTC_TAMPER_2 is not applicable to all devices.
554   * @note   RTC_TAMPER_3 is not applicable to all devices.
555   * @retval HAL status
556   */
HAL_RTCEx_DeactivateTamper(RTC_HandleTypeDef * hrtc,uint32_t Tamper)557 HAL_StatusTypeDef HAL_RTCEx_DeactivateTamper(RTC_HandleTypeDef *hrtc, uint32_t Tamper)
558 {
559   assert_param(IS_RTC_TAMPER(Tamper));
560 
561   /* Process Locked */
562   __HAL_LOCK(hrtc);
563 
564   hrtc->State = HAL_RTC_STATE_BUSY;
565 
566   /* Disable the selected Tamper pin */
567   hrtc->Instance->TAFCR &= (uint32_t)~Tamper;
568 
569   hrtc->State = HAL_RTC_STATE_READY;
570 
571   /* Process Unlocked */
572   __HAL_UNLOCK(hrtc);
573 
574   return HAL_OK;
575 }
576 
577 /**
578   * @brief  Handles Timestamp and Tamper interrupt request.
579   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
580   *                the configuration information for RTC.
581   * @retval None
582   */
HAL_RTCEx_TamperTimeStampIRQHandler(RTC_HandleTypeDef * hrtc)583 void HAL_RTCEx_TamperTimeStampIRQHandler(RTC_HandleTypeDef *hrtc)
584 {
585   /* Clear the EXTI's Flag for RTC Timestamp and Tamper */
586   __HAL_RTC_TAMPER_TIMESTAMP_EXTI_CLEAR_FLAG();
587 
588   /* Get the Timestamp interrupt source enable status */
589   if (__HAL_RTC_TIMESTAMP_GET_IT_SOURCE(hrtc, RTC_IT_TS) != 0U)
590   {
591     /* Get the pending status of the Timestamp Interrupt */
592     if (__HAL_RTC_TIMESTAMP_GET_FLAG(hrtc, RTC_FLAG_TSF) != 0U)
593     {
594       /* Timestamp callback */
595 #if (USE_HAL_RTC_REGISTER_CALLBACKS == 1)
596       hrtc->TimeStampEventCallback(hrtc);
597 #else
598       HAL_RTCEx_TimeStampEventCallback(hrtc);
599 #endif /* USE_HAL_RTC_REGISTER_CALLBACKS */
600 
601       /* Clear the Timestamp interrupt pending bit after returning from callback
602          as RTC_TSTR and RTC_TSDR registers are cleared when TSF bit is reset */
603       __HAL_RTC_TIMESTAMP_CLEAR_FLAG(hrtc, RTC_FLAG_TSF);
604     }
605   }
606 
607   /* Get the Tamper 1 interrupt source enable status */
608   if (__HAL_RTC_TAMPER_GET_IT_SOURCE(hrtc, RTC_IT_TAMP) != 0U)
609   {
610     /* Get the pending status of the Tamper 1 Interrupt */
611     if (__HAL_RTC_TAMPER_GET_FLAG(hrtc, RTC_FLAG_TAMP1F) != 0U)
612     {
613       /* Clear the Tamper interrupt pending bit */
614       __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc, RTC_FLAG_TAMP1F);
615 
616       /* Tamper callback */
617 #if (USE_HAL_RTC_REGISTER_CALLBACKS == 1)
618       hrtc->Tamper1EventCallback(hrtc);
619 #else
620       HAL_RTCEx_Tamper1EventCallback(hrtc);
621 #endif /* USE_HAL_RTC_REGISTER_CALLBACKS */
622     }
623   }
624 
625 #if defined(RTC_TAMPER2_SUPPORT)
626   /* Get the Tamper 2 interrupt source enable status */
627   if (__HAL_RTC_TAMPER_GET_IT_SOURCE(hrtc, RTC_IT_TAMP) != 0U)
628   {
629     /* Get the pending status of the Tamper 2 Interrupt */
630     if (__HAL_RTC_TAMPER_GET_FLAG(hrtc, RTC_FLAG_TAMP2F) != 0U)
631     {
632       /* Clear the Tamper interrupt pending bit */
633       __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc, RTC_FLAG_TAMP2F);
634 
635       /* Tamper callback */
636 #if (USE_HAL_RTC_REGISTER_CALLBACKS == 1)
637       hrtc->Tamper2EventCallback(hrtc);
638 #else
639       HAL_RTCEx_Tamper2EventCallback(hrtc);
640 #endif /* USE_HAL_RTC_REGISTER_CALLBACKS */
641     }
642   }
643 #endif /* RTC_TAMPER2_SUPPORT */
644 
645 #if defined(RTC_TAMPER3_SUPPORT)
646   /* Get the Tamper 3 interrupt source enable status */
647   if (__HAL_RTC_TAMPER_GET_IT_SOURCE(hrtc, RTC_IT_TAMP) != 0U)
648   {
649     /* Get the pending status of the Tamper 3 Interrupt */
650     if (__HAL_RTC_TAMPER_GET_FLAG(hrtc, RTC_FLAG_TAMP3F) != 0U)
651     {
652       /* Clear the Tamper interrupt pending bit */
653       __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc, RTC_FLAG_TAMP3F);
654 
655       /* Tamper callback */
656 #if (USE_HAL_RTC_REGISTER_CALLBACKS == 1)
657       hrtc->Tamper3EventCallback(hrtc);
658 #else
659       HAL_RTCEx_Tamper3EventCallback(hrtc);
660 #endif /* USE_HAL_RTC_REGISTER_CALLBACKS */
661     }
662   }
663 #endif /* RTC_TAMPER3_SUPPORT */
664 
665   /* Change RTC state */
666   hrtc->State = HAL_RTC_STATE_READY;
667 }
668 
669 /**
670   * @brief  Timestamp callback.
671   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
672   *                the configuration information for RTC.
673   * @retval None
674   */
HAL_RTCEx_TimeStampEventCallback(RTC_HandleTypeDef * hrtc)675 __weak void HAL_RTCEx_TimeStampEventCallback(RTC_HandleTypeDef *hrtc)
676 {
677   /* Prevent unused argument(s) compilation warning */
678   UNUSED(hrtc);
679 
680   /* NOTE: This function should not be modified, when the callback is needed,
681            the HAL_RTCEx_TimeStampEventCallback could be implemented in the user file
682   */
683 }
684 
685 /**
686   * @brief  Tamper 1 callback.
687   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
688   *                the configuration information for RTC.
689   * @retval None
690   */
HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef * hrtc)691 __weak void HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc)
692 {
693   /* Prevent unused argument(s) compilation warning */
694   UNUSED(hrtc);
695 
696   /* NOTE: This function should not be modified, when the callback is needed,
697            the HAL_RTCEx_Tamper1EventCallback could be implemented in the user file
698    */
699 }
700 
701 #if defined(RTC_TAMPER2_SUPPORT)
702 /**
703   * @brief  Tamper 2 callback.
704   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
705   *                the configuration information for RTC.
706   * @retval None
707   */
HAL_RTCEx_Tamper2EventCallback(RTC_HandleTypeDef * hrtc)708 __weak void HAL_RTCEx_Tamper2EventCallback(RTC_HandleTypeDef *hrtc)
709 {
710   /* Prevent unused argument(s) compilation warning */
711   UNUSED(hrtc);
712 
713   /* NOTE: This function should not be modified, when the callback is needed,
714            the HAL_RTCEx_Tamper2EventCallback could be implemented in the user file
715    */
716 }
717 #endif /* RTC_TAMPER2_SUPPORT */
718 
719 #if defined(RTC_TAMPER3_SUPPORT)
720 /**
721   * @brief  Tamper 3 callback.
722   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
723   *                the configuration information for RTC.
724   * @retval None
725   */
HAL_RTCEx_Tamper3EventCallback(RTC_HandleTypeDef * hrtc)726 __weak void HAL_RTCEx_Tamper3EventCallback(RTC_HandleTypeDef *hrtc)
727 {
728   /* Prevent unused argument(s) compilation warning */
729   UNUSED(hrtc);
730 
731   /* NOTE: This function should not be modified, when the callback is needed,
732            the HAL_RTCEx_Tamper3EventCallback could be implemented in the user file
733    */
734 }
735 #endif /* RTC_TAMPER3_SUPPORT */
736 
737 /**
738   * @brief  Handles Timestamp polling request.
739   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
740   *                the configuration information for RTC.
741   * @param  Timeout Timeout duration
742   * @retval HAL status
743   */
HAL_RTCEx_PollForTimeStampEvent(RTC_HandleTypeDef * hrtc,uint32_t Timeout)744 HAL_StatusTypeDef HAL_RTCEx_PollForTimeStampEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout)
745 {
746   uint32_t tickstart = 0U;
747 
748   /* Get tick */
749   tickstart = HAL_GetTick();
750 
751   while (__HAL_RTC_TIMESTAMP_GET_FLAG(hrtc, RTC_FLAG_TSF) == 0U)
752   {
753     if (Timeout != HAL_MAX_DELAY)
754     {
755       if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout))
756       {
757         hrtc->State = HAL_RTC_STATE_TIMEOUT;
758         return HAL_TIMEOUT;
759       }
760     }
761 
762     if (__HAL_RTC_TIMESTAMP_GET_FLAG(hrtc, RTC_FLAG_TSOVF) != 0U)
763     {
764       /* Clear the Timestamp Overrun Flag */
765       __HAL_RTC_TIMESTAMP_CLEAR_FLAG(hrtc, RTC_FLAG_TSOVF);
766 
767       /* Change Timestamp state */
768       hrtc->State = HAL_RTC_STATE_ERROR;
769 
770       return HAL_ERROR;
771     }
772   }
773 
774   /* Change RTC state */
775   hrtc->State = HAL_RTC_STATE_READY;
776 
777   return HAL_OK;
778 }
779 
780 /**
781   * @brief  Handles Tamper 1 Polling.
782   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
783   *                the configuration information for RTC.
784   * @param  Timeout Timeout duration
785   * @retval HAL status
786   */
HAL_RTCEx_PollForTamper1Event(RTC_HandleTypeDef * hrtc,uint32_t Timeout)787 HAL_StatusTypeDef HAL_RTCEx_PollForTamper1Event(RTC_HandleTypeDef *hrtc, uint32_t Timeout)
788 {
789   uint32_t tickstart = 0U;
790 
791   /* Get tick */
792   tickstart = HAL_GetTick();
793 
794   /* Get the status of the Interrupt */
795   while (__HAL_RTC_TAMPER_GET_FLAG(hrtc, RTC_FLAG_TAMP1F) == 0U)
796   {
797     if (Timeout != HAL_MAX_DELAY)
798     {
799       if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout))
800       {
801         hrtc->State = HAL_RTC_STATE_TIMEOUT;
802         return HAL_TIMEOUT;
803       }
804     }
805   }
806 
807   /* Clear the Tamper Flag */
808   __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc, RTC_FLAG_TAMP1F);
809 
810   /* Change RTC state */
811   hrtc->State = HAL_RTC_STATE_READY;
812 
813   return HAL_OK;
814 }
815 
816 #if defined(RTC_TAMPER2_SUPPORT)
817 /**
818   * @brief  Handles Tamper 2 Polling.
819   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
820   *                the configuration information for RTC.
821   * @param  Timeout Timeout duration
822   * @retval HAL status
823   */
HAL_RTCEx_PollForTamper2Event(RTC_HandleTypeDef * hrtc,uint32_t Timeout)824 HAL_StatusTypeDef HAL_RTCEx_PollForTamper2Event(RTC_HandleTypeDef *hrtc, uint32_t Timeout)
825 {
826   uint32_t tickstart = 0U;
827 
828   /* Get tick */
829   tickstart = HAL_GetTick();
830 
831   /* Get the status of the Interrupt */
832   while (__HAL_RTC_TAMPER_GET_FLAG(hrtc, RTC_FLAG_TAMP2F) == 0U)
833   {
834     if (Timeout != HAL_MAX_DELAY)
835     {
836       if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout))
837       {
838         hrtc->State = HAL_RTC_STATE_TIMEOUT;
839         return HAL_TIMEOUT;
840       }
841     }
842   }
843 
844   /* Clear the Tamper Flag */
845   __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc, RTC_FLAG_TAMP2F);
846 
847   /* Change RTC state */
848   hrtc->State = HAL_RTC_STATE_READY;
849 
850   return HAL_OK;
851 }
852 #endif /* RTC_TAMPER2_SUPPORT */
853 
854 #if defined(RTC_TAMPER3_SUPPORT)
855 /**
856   * @brief  Handles Tamper 3 Polling.
857   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
858   *                the configuration information for RTC.
859   * @param  Timeout Timeout duration
860   * @retval HAL status
861   */
HAL_RTCEx_PollForTamper3Event(RTC_HandleTypeDef * hrtc,uint32_t Timeout)862 HAL_StatusTypeDef HAL_RTCEx_PollForTamper3Event(RTC_HandleTypeDef *hrtc, uint32_t Timeout)
863 {
864   uint32_t tickstart = HAL_GetTick();
865 
866   /* Get the status of the Interrupt */
867   while (__HAL_RTC_TAMPER_GET_FLAG(hrtc, RTC_FLAG_TAMP3F) == 0U)
868   {
869     if (Timeout != HAL_MAX_DELAY)
870     {
871       if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout))
872       {
873         hrtc->State = HAL_RTC_STATE_TIMEOUT;
874         return HAL_TIMEOUT;
875       }
876     }
877   }
878 
879   /* Clear the Tamper Flag */
880   __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc, RTC_FLAG_TAMP3F);
881 
882   /* Change RTC state */
883   hrtc->State = HAL_RTC_STATE_READY;
884 
885   return HAL_OK;
886 }
887 #endif /* RTC_TAMPER3_SUPPORT */
888 
889 /**
890   * @}
891   */
892 
893 /** @defgroup RTCEx_Exported_Functions_Group2 RTC Wakeup functions
894   * @brief    RTC Wakeup functions
895   *
896 @verbatim
897  ===============================================================================
898                         ##### RTC Wakeup functions #####
899  ===============================================================================
900 
901  [..] This section provides functions allowing to configure Wakeup feature
902 
903 @endverbatim
904   * @{
905   */
906 
907 /**
908   * @brief  Sets wakeup timer.
909   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
910   *                the configuration information for RTC.
911   * @param  WakeUpCounter Wakeup counter
912   * @param  WakeUpClock Wakeup clock
913   * @retval HAL status
914   */
HAL_RTCEx_SetWakeUpTimer(RTC_HandleTypeDef * hrtc,uint32_t WakeUpCounter,uint32_t WakeUpClock)915 HAL_StatusTypeDef HAL_RTCEx_SetWakeUpTimer(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock)
916 {
917   uint32_t tickstart = 0U;
918 
919   /* Check the parameters */
920   assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock));
921   assert_param(IS_RTC_WAKEUP_COUNTER(WakeUpCounter));
922 
923   /* Process Locked */
924   __HAL_LOCK(hrtc);
925 
926   hrtc->State = HAL_RTC_STATE_BUSY;
927 
928   /* Disable the write protection for RTC registers */
929   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
930 
931   /* Check RTC WUTWF flag is reset only when wakeup timer enabled*/
932   if ((hrtc->Instance->CR & RTC_CR_WUTE) != 0U)
933   {
934     tickstart = HAL_GetTick();
935 
936     /* Wait till RTC WUTWF flag is reset and if timeout is reached exit */
937     while (__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTWF) != 0U)
938     {
939       if ((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE)
940       {
941         /* Enable the write protection for RTC registers */
942         __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
943 
944         hrtc->State = HAL_RTC_STATE_TIMEOUT;
945 
946         /* Process Unlocked */
947         __HAL_UNLOCK(hrtc);
948 
949         return HAL_TIMEOUT;
950       }
951     }
952   }
953 
954   /* Disable the Wakeup timer */
955   __HAL_RTC_WAKEUPTIMER_DISABLE(hrtc);
956 
957   /* Clear the Wakeup flag */
958   __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(hrtc, RTC_FLAG_WUTF);
959 
960   /* Get tick */
961   tickstart = HAL_GetTick();
962 
963   /* Wait till RTC WUTWF flag is set and if timeout is reached exit */
964   while (__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTWF) == 0U)
965   {
966     if ((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE)
967     {
968       /* Enable the write protection for RTC registers */
969       __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
970 
971       hrtc->State = HAL_RTC_STATE_TIMEOUT;
972 
973       /* Process Unlocked */
974       __HAL_UNLOCK(hrtc);
975 
976       return HAL_TIMEOUT;
977     }
978   }
979 
980   /* Clear the Wakeup Timer clock source bits in CR register */
981   hrtc->Instance->CR &= (uint32_t)~RTC_CR_WUCKSEL;
982 
983   /* Configure the clock source */
984   hrtc->Instance->CR |= (uint32_t)WakeUpClock;
985 
986   /* Configure the Wakeup Timer counter */
987   hrtc->Instance->WUTR = (uint32_t)WakeUpCounter;
988 
989   /* Enable the Wakeup Timer */
990   __HAL_RTC_WAKEUPTIMER_ENABLE(hrtc);
991 
992   /* Enable the write protection for RTC registers */
993   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
994 
995   hrtc->State = HAL_RTC_STATE_READY;
996 
997   /* Process Unlocked */
998   __HAL_UNLOCK(hrtc);
999 
1000   return HAL_OK;
1001 }
1002 
1003 /**
1004   * @brief  Sets wakeup timer with interrupt.
1005   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1006   *                the configuration information for RTC.
1007   * @param  WakeUpCounter Wakeup counter
1008   * @param  WakeUpClock Wakeup clock
1009   * @retval HAL status
1010   */
HAL_RTCEx_SetWakeUpTimer_IT(RTC_HandleTypeDef * hrtc,uint32_t WakeUpCounter,uint32_t WakeUpClock)1011 HAL_StatusTypeDef HAL_RTCEx_SetWakeUpTimer_IT(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock)
1012 {
1013   __IO uint32_t count  = RTC_TIMEOUT_VALUE * (SystemCoreClock / 32U / 1000U);
1014 
1015   /* Check the parameters */
1016   assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock));
1017   assert_param(IS_RTC_WAKEUP_COUNTER(WakeUpCounter));
1018 
1019   /* Process Locked */
1020   __HAL_LOCK(hrtc);
1021 
1022   hrtc->State = HAL_RTC_STATE_BUSY;
1023 
1024   /* Disable the write protection for RTC registers */
1025   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
1026 
1027   /* Check RTC WUTWF flag is reset only when wakeup timer enabled */
1028   if ((hrtc->Instance->CR & RTC_CR_WUTE) != 0U)
1029   {
1030     /* Wait till RTC WUTWF flag is reset and if timeout is reached exit */
1031     do
1032     {
1033       count = count - 1U;
1034       if (count == 0U)
1035       {
1036         /* Enable the write protection for RTC registers */
1037         __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1038 
1039         hrtc->State = HAL_RTC_STATE_TIMEOUT;
1040 
1041         /* Process Unlocked */
1042         __HAL_UNLOCK(hrtc);
1043 
1044         return HAL_TIMEOUT;
1045       }
1046     } while (__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTWF) != 0U);
1047   }
1048 
1049   /* Disable the Wakeup timer */
1050   __HAL_RTC_WAKEUPTIMER_DISABLE(hrtc);
1051 
1052   /* Clear the Wakeup flag */
1053   __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(hrtc, RTC_FLAG_WUTF);
1054 
1055   /* Reload the counter */
1056   count = RTC_TIMEOUT_VALUE * (SystemCoreClock / 32U / 1000U);
1057 
1058   /* Wait till RTC WUTWF flag is set and if timeout is reached exit */
1059   do
1060   {
1061     count = count - 1U;
1062     if (count == 0U)
1063     {
1064       /* Enable the write protection for RTC registers */
1065       __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1066 
1067       hrtc->State = HAL_RTC_STATE_TIMEOUT;
1068 
1069       /* Process Unlocked */
1070       __HAL_UNLOCK(hrtc);
1071 
1072       return HAL_TIMEOUT;
1073     }
1074   } while (__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTWF) == 0U);
1075 
1076   /* Clear the Wakeup Timer clock source bits in CR register */
1077   hrtc->Instance->CR &= (uint32_t)~RTC_CR_WUCKSEL;
1078 
1079   /* Configure the clock source */
1080   hrtc->Instance->CR |= (uint32_t)WakeUpClock;
1081 
1082   /* Configure the Wakeup Timer counter */
1083   hrtc->Instance->WUTR = (uint32_t)WakeUpCounter;
1084 
1085   /* RTC wakeup timer Interrupt Configuration: EXTI configuration */
1086   __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT();
1087   __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_RISING_EDGE();
1088 
1089   /* Configure the interrupt in the RTC_CR register */
1090   __HAL_RTC_WAKEUPTIMER_ENABLE_IT(hrtc, RTC_IT_WUT);
1091 
1092   /* Enable the Wakeup Timer */
1093   __HAL_RTC_WAKEUPTIMER_ENABLE(hrtc);
1094 
1095   /* Enable the write protection for RTC registers */
1096   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1097 
1098   hrtc->State = HAL_RTC_STATE_READY;
1099 
1100   /* Process Unlocked */
1101   __HAL_UNLOCK(hrtc);
1102 
1103   return HAL_OK;
1104 }
1105 
1106 /**
1107   * @brief  Deactivates wakeup timer counter.
1108   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1109   *                the configuration information for RTC.
1110   * @retval HAL status
1111   */
HAL_RTCEx_DeactivateWakeUpTimer(RTC_HandleTypeDef * hrtc)1112 HAL_StatusTypeDef HAL_RTCEx_DeactivateWakeUpTimer(RTC_HandleTypeDef *hrtc)
1113 {
1114   uint32_t tickstart = 0U;
1115 
1116   /* Process Locked */
1117   __HAL_LOCK(hrtc);
1118 
1119   hrtc->State = HAL_RTC_STATE_BUSY;
1120 
1121   /* Disable the write protection for RTC registers */
1122   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
1123 
1124   /* Disable the Wakeup Timer */
1125   __HAL_RTC_WAKEUPTIMER_DISABLE(hrtc);
1126 
1127   /* In case of interrupt mode is used, the interrupt source must disabled */
1128   __HAL_RTC_WAKEUPTIMER_DISABLE_IT(hrtc, RTC_IT_WUT);
1129 
1130   /* Get tick */
1131   tickstart = HAL_GetTick();
1132 
1133   /* Wait till RTC WUTWF flag is set and if timeout is reached exit */
1134   while (__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTWF) == 0U)
1135   {
1136     if ((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE)
1137     {
1138       /* Enable the write protection for RTC registers */
1139       __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1140 
1141       hrtc->State = HAL_RTC_STATE_TIMEOUT;
1142 
1143       /* Process Unlocked */
1144       __HAL_UNLOCK(hrtc);
1145 
1146       return HAL_TIMEOUT;
1147     }
1148   }
1149 
1150   /* Enable the write protection for RTC registers */
1151   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1152 
1153   hrtc->State = HAL_RTC_STATE_READY;
1154 
1155   /* Process Unlocked */
1156   __HAL_UNLOCK(hrtc);
1157 
1158   return HAL_OK;
1159 }
1160 
1161 /**
1162   * @brief  Gets wakeup timer counter.
1163   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1164   *                the configuration information for RTC.
1165   * @retval Counter value
1166   */
HAL_RTCEx_GetWakeUpTimer(RTC_HandleTypeDef * hrtc)1167 uint32_t HAL_RTCEx_GetWakeUpTimer(RTC_HandleTypeDef *hrtc)
1168 {
1169   /* Get the counter value */
1170   return ((uint32_t)(hrtc->Instance->WUTR & RTC_WUTR_WUT));
1171 }
1172 
1173 /**
1174   * @brief  Handles Wakeup Timer interrupt request.
1175   * @note   Unlike alarm interrupt line (shared by Alarms A and B) or tamper
1176   *         interrupt line (shared by timestamp and tampers) wakeup timer
1177   *         interrupt line is exclusive to the wakeup timer.
1178   *         There is no need in this case to check on the interrupt enable
1179   *         status via __HAL_RTC_WAKEUPTIMER_GET_IT_SOURCE().
1180   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1181   *                the configuration information for RTC.
1182   * @retval None
1183   */
HAL_RTCEx_WakeUpTimerIRQHandler(RTC_HandleTypeDef * hrtc)1184 void HAL_RTCEx_WakeUpTimerIRQHandler(RTC_HandleTypeDef *hrtc)
1185 {
1186   /* Clear the EXTI's line Flag for RTC WakeUpTimer */
1187   __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG();
1188 
1189   /* Get the pending status of the Wakeup timer Interrupt */
1190   if (__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTF) != 0U)
1191   {
1192     /* Clear the Wakeup timer interrupt pending bit */
1193     __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(hrtc, RTC_FLAG_WUTF);
1194 
1195     /* Wakeup timer callback */
1196 #if (USE_HAL_RTC_REGISTER_CALLBACKS == 1)
1197     hrtc->WakeUpTimerEventCallback(hrtc);
1198 #else
1199     HAL_RTCEx_WakeUpTimerEventCallback(hrtc);
1200 #endif /* USE_HAL_RTC_REGISTER_CALLBACKS */
1201   }
1202 
1203   /* Change RTC state */
1204   hrtc->State = HAL_RTC_STATE_READY;
1205 }
1206 
1207 /**
1208   * @brief  Wakeup Timer callback.
1209   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1210   *                the configuration information for RTC.
1211   * @retval None
1212   */
HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef * hrtc)1213 __weak void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
1214 {
1215   /* Prevent unused argument(s) compilation warning */
1216   UNUSED(hrtc);
1217 
1218   /* NOTE: This function should not be modified, when the callback is needed,
1219            the HAL_RTCEx_WakeUpTimerEventCallback could be implemented in the user file
1220    */
1221 }
1222 
1223 /**
1224   * @brief  Handles Wakeup Timer Polling.
1225   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1226   *                the configuration information for RTC.
1227   * @param  Timeout Timeout duration
1228   * @retval HAL status
1229   */
HAL_RTCEx_PollForWakeUpTimerEvent(RTC_HandleTypeDef * hrtc,uint32_t Timeout)1230 HAL_StatusTypeDef HAL_RTCEx_PollForWakeUpTimerEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout)
1231 {
1232   uint32_t tickstart = 0U;
1233 
1234   /* Get tick */
1235   tickstart = HAL_GetTick();
1236 
1237   while (__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTF) == 0U)
1238   {
1239     if (Timeout != HAL_MAX_DELAY)
1240     {
1241       if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout))
1242       {
1243         hrtc->State = HAL_RTC_STATE_TIMEOUT;
1244         return HAL_TIMEOUT;
1245       }
1246     }
1247   }
1248 
1249   /* Clear the Wakeup timer Flag */
1250   __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(hrtc, RTC_FLAG_WUTF);
1251 
1252   /* Change RTC state */
1253   hrtc->State = HAL_RTC_STATE_READY;
1254 
1255   return HAL_OK;
1256 }
1257 
1258 /**
1259   * @}
1260   */
1261 
1262 /** @defgroup RTCEx_Exported_Functions_Group3 Extended Peripheral Control functions
1263   * @brief    Extended Peripheral Control functions
1264   *
1265 @verbatim
1266  ===============================================================================
1267               ##### Extended Peripheral Control functions #####
1268  ===============================================================================
1269     [..]
1270     This subsection provides functions allowing to
1271       (+) Write a data in a specified RTC Backup data register
1272       (+) Read a data in a specified RTC Backup data register
1273       (+) Set the Coarse calibration parameters.
1274       (+) Deactivate the Coarse calibration parameters
1275       (+) Set the Smooth calibration parameters.
1276       (+) Configure the Synchronization Shift Control Settings.
1277       (+) Configure the Calibration Pinout (RTC_CALIB) Selection (1Hz or 512Hz).
1278       (+) Deactivate the Calibration Pinout (RTC_CALIB) Selection (1Hz or 512Hz).
1279       (+) Enable the RTC reference clock detection.
1280       (+) Disable the RTC reference clock detection.
1281       (+) Enable the Bypass Shadow feature.
1282       (+) Disable the Bypass Shadow feature.
1283 
1284 @endverbatim
1285   * @{
1286   */
1287 
1288 /**
1289   * @brief  Writes a data in a specified RTC Backup data register.
1290   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1291   *                the configuration information for RTC.
1292   * @param  BackupRegister RTC Backup data Register number.
1293   *          This parameter can be: RTC_BKP_DRx (where x can be from 0 to 31)
1294   *                                 to specify the register.
1295   * @note   The range of values possible for parameter BackupRegister depends on
1296   *         the total number of Backup data Registers. This total number is not
1297   *         the same on all devices.
1298   * @param  Data Data to be written in the specified RTC Backup data register.
1299   * @retval None
1300   */
HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef * hrtc,uint32_t BackupRegister,uint32_t Data)1301 void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
1302 {
1303   uint32_t tmp = 0U;
1304 
1305   /* Check the parameters */
1306   assert_param(IS_RTC_BKP(BackupRegister));
1307 
1308   tmp = (uint32_t) & (hrtc->Instance->BKP0R);
1309   tmp += (BackupRegister * 4U);
1310 
1311   /* Write the specified register */
1312   *(__IO uint32_t *)tmp = (uint32_t)Data;
1313 }
1314 
1315 /**
1316   * @brief  Reads data from the specified RTC Backup data Register.
1317   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1318   *                the configuration information for RTC.
1319   * @param  BackupRegister RTC Backup data Register number.
1320   *          This parameter can be: RTC_BKP_DRx (where x can be from 0 to 31)
1321   *                                 to specify the register.
1322   * @note   The range of values possible for parameter BackupRegister depends on
1323   *         the total number of Backup data Registers. This total number is not
1324   *         the same on all devices.
1325   * @retval Read value
1326   */
HAL_RTCEx_BKUPRead(RTC_HandleTypeDef * hrtc,uint32_t BackupRegister)1327 uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister)
1328 {
1329   uint32_t tmp = 0U;
1330 
1331   /* Check the parameters */
1332   assert_param(IS_RTC_BKP(BackupRegister));
1333 
1334   tmp = (uint32_t) & (hrtc->Instance->BKP0R);
1335   tmp += (BackupRegister * 4U);
1336 
1337   /* Read the specified register */
1338   return (*(__IO uint32_t *)tmp);
1339 }
1340 
1341 /**
1342   * @brief  Sets the Coarse calibration parameters.
1343   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1344   *                the configuration information for RTC.
1345   * @param  CalibSign Specifies the sign of the coarse calibration value.
1346   *          This parameter can be  one of the following values:
1347   *             @arg RTC_CALIBSIGN_POSITIVE: The value sign is positive
1348   *             @arg RTC_CALIBSIGN_NEGATIVE: The value sign is negative
1349   * @param  Value value of coarse calibration expressed in ppm (coded on 5 bits).
1350   *
1351   * @note   This Calibration value should be between 0 and 63 when using negative
1352   *         sign with a 2-ppm step.
1353   *
1354   * @note   This Calibration value should be between 0 and 126 when using positive
1355   *         sign with a 4-ppm step.
1356   * @retval HAL status
1357   */
HAL_RTCEx_SetCoarseCalib(RTC_HandleTypeDef * hrtc,uint32_t CalibSign,uint32_t Value)1358 HAL_StatusTypeDef HAL_RTCEx_SetCoarseCalib(RTC_HandleTypeDef *hrtc, uint32_t CalibSign, uint32_t Value)
1359 {
1360   HAL_StatusTypeDef status;
1361 
1362   /* Check the parameters */
1363   assert_param(IS_RTC_CALIB_SIGN(CalibSign));
1364   assert_param(IS_RTC_CALIB_VALUE(Value));
1365 
1366   /* Process Locked */
1367   __HAL_LOCK(hrtc);
1368 
1369   hrtc->State = HAL_RTC_STATE_BUSY;
1370 
1371   /* Disable the write protection for RTC registers */
1372   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
1373 
1374   /* Enter Initialization mode */
1375   status = RTC_EnterInitMode(hrtc);
1376 
1377   if (status == HAL_OK)
1378   {
1379     /* Enable the Coarse Calibration */
1380     __HAL_RTC_COARSE_CALIB_ENABLE(hrtc);
1381 
1382     /* Set the coarse calibration value */
1383     hrtc->Instance->CALIBR = (uint32_t)(CalibSign | Value);
1384 
1385     /* Exit Initialization mode */
1386     status = RTC_ExitInitMode(hrtc);
1387   }
1388 
1389   if (status == HAL_OK)
1390   {
1391     hrtc->State = HAL_RTC_STATE_READY;
1392   }
1393 
1394   /* Enable the write protection for RTC registers */
1395   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1396 
1397   /* Process Unlocked */
1398   __HAL_UNLOCK(hrtc);
1399 
1400   return status;
1401 }
1402 
1403 /**
1404   * @brief  Deactivates the Coarse calibration parameters.
1405   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1406   *                the configuration information for RTC.
1407   * @retval HAL status
1408   */
HAL_RTCEx_DeactivateCoarseCalib(RTC_HandleTypeDef * hrtc)1409 HAL_StatusTypeDef HAL_RTCEx_DeactivateCoarseCalib(RTC_HandleTypeDef *hrtc)
1410 {
1411   HAL_StatusTypeDef status;
1412 
1413   /* Process Locked */
1414   __HAL_LOCK(hrtc);
1415 
1416   hrtc->State = HAL_RTC_STATE_BUSY;
1417 
1418   /* Disable the write protection for RTC registers */
1419   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
1420 
1421   /* Enter Initialization mode */
1422   status = RTC_EnterInitMode(hrtc);
1423 
1424   if (status == HAL_OK)
1425   {
1426     /* Disable the Coarse Calibration */
1427     __HAL_RTC_COARSE_CALIB_DISABLE(hrtc);
1428 
1429     /* Exit Initialization mode */
1430     status = RTC_ExitInitMode(hrtc);
1431   }
1432 
1433   if (status == HAL_OK)
1434   {
1435     hrtc->State = HAL_RTC_STATE_READY;
1436   }
1437 
1438   /* Enable the write protection for RTC registers */
1439   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1440 
1441   /* Process Unlocked */
1442   __HAL_UNLOCK(hrtc);
1443 
1444   return status;
1445 }
1446 
1447 #if defined(RTC_SMOOTHCALIB_SUPPORT)
1448 /**
1449   * @brief  Sets the Smooth calibration parameters.
1450   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1451   *                the configuration information for RTC.
1452   * @param  SmoothCalibPeriod Select the Smooth Calibration Period.
1453   *          This parameter can be can be one of the following values:
1454   *             @arg RTC_SMOOTHCALIB_PERIOD_32SEC: The smooth calibration period is 32s.
1455   *             @arg RTC_SMOOTHCALIB_PERIOD_16SEC: The smooth calibration period is 16s.
1456   *             @arg RTC_SMOOTHCALIB_PERIOD_8SEC: The smooth calibration period is 8s.
1457   * @param  SmoothCalibPlusPulses Select to Set or reset the CALP bit.
1458   *          This parameter can be one of the following values:
1459   *             @arg RTC_SMOOTHCALIB_PLUSPULSES_SET: Add one RTCCLK pulse every 2*11 pulses.
1460   *             @arg RTC_SMOOTHCALIB_PLUSPULSES_RESET: No RTCCLK pulses are added.
1461   * @param  SmoothCalibMinusPulsesValue Select the value of CALM[8:0] bits.
1462   *          This parameter can be one any value from 0 to 0x000001FF.
1463   * @note   To deactivate the smooth calibration, the field SmoothCalibPlusPulses
1464   *         must be equal to SMOOTHCALIB_PLUSPULSES_RESET and the field
1465   *         SmoothCalibMinusPulsesValue must be equal to 0.
1466   * @retval HAL status
1467   */
HAL_RTCEx_SetSmoothCalib(RTC_HandleTypeDef * hrtc,uint32_t SmoothCalibPeriod,uint32_t SmoothCalibPlusPulses,uint32_t SmoothCalibMinusPulsesValue)1468 HAL_StatusTypeDef HAL_RTCEx_SetSmoothCalib(RTC_HandleTypeDef *hrtc, uint32_t SmoothCalibPeriod, uint32_t SmoothCalibPlusPulses, uint32_t SmoothCalibMinusPulsesValue)
1469 {
1470   uint32_t tickstart = 0U;
1471 
1472   /* Check the parameters */
1473   assert_param(IS_RTC_SMOOTH_CALIB_PERIOD(SmoothCalibPeriod));
1474   assert_param(IS_RTC_SMOOTH_CALIB_PLUS(SmoothCalibPlusPulses));
1475   assert_param(IS_RTC_SMOOTH_CALIB_MINUS(SmoothCalibMinusPulsesValue));
1476 
1477   /* Process Locked */
1478   __HAL_LOCK(hrtc);
1479 
1480   hrtc->State = HAL_RTC_STATE_BUSY;
1481 
1482   /* Disable the write protection for RTC registers */
1483   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
1484 
1485   /* check if a calibration is pending*/
1486   if ((hrtc->Instance->ISR & RTC_ISR_RECALPF) != 0U)
1487   {
1488     /* Get tick */
1489     tickstart = HAL_GetTick();
1490 
1491     /* check if a calibration is pending*/
1492     while ((hrtc->Instance->ISR & RTC_ISR_RECALPF) != 0U)
1493     {
1494       if ((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE)
1495       {
1496         /* Enable the write protection for RTC registers */
1497         __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1498 
1499         /* Change RTC state */
1500         hrtc->State = HAL_RTC_STATE_TIMEOUT;
1501 
1502         /* Process Unlocked */
1503         __HAL_UNLOCK(hrtc);
1504 
1505         return HAL_TIMEOUT;
1506       }
1507     }
1508   }
1509 
1510   /* Configure the Smooth calibration settings */
1511   hrtc->Instance->CALR = (uint32_t)((uint32_t)SmoothCalibPeriod     | \
1512                                     (uint32_t)SmoothCalibPlusPulses | \
1513                                     (uint32_t)SmoothCalibMinusPulsesValue);
1514 
1515   /* Enable the write protection for RTC registers */
1516   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1517 
1518   /* Change RTC state */
1519   hrtc->State = HAL_RTC_STATE_READY;
1520 
1521   /* Process Unlocked */
1522   __HAL_UNLOCK(hrtc);
1523 
1524   return HAL_OK;
1525 }
1526 #endif /* RTC_SMOOTHCALIB_SUPPORT */
1527 
1528 #if defined(RTC_SUBSECOND_SUPPORT)
1529 /**
1530   * @brief  Configures the Synchronization Shift Control Settings.
1531   * @note   When REFCKON is set, firmware must not write to Shift control register.
1532   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1533   *                the configuration information for RTC.
1534   * @param  ShiftAdd1S Select to add or not 1 second to the time calendar.
1535   *          This parameter can be one of the following values:
1536   *             @arg RTC_SHIFTADD1S_SET: Add one second to the clock calendar.
1537   *             @arg RTC_SHIFTADD1S_RESET: No effect.
1538   * @param  ShiftSubFS Select the number of Second Fractions to substitute.
1539   *          This parameter can be one any value from 0 to 0x7FFF.
1540   * @retval HAL status
1541   */
HAL_RTCEx_SetSynchroShift(RTC_HandleTypeDef * hrtc,uint32_t ShiftAdd1S,uint32_t ShiftSubFS)1542 HAL_StatusTypeDef HAL_RTCEx_SetSynchroShift(RTC_HandleTypeDef *hrtc, uint32_t ShiftAdd1S, uint32_t ShiftSubFS)
1543 {
1544   uint32_t tickstart = 0U;
1545 
1546   /* Check the parameters */
1547   assert_param(IS_RTC_SHIFT_ADD1S(ShiftAdd1S));
1548   assert_param(IS_RTC_SHIFT_SUBFS(ShiftSubFS));
1549 
1550   /* Process Locked */
1551   __HAL_LOCK(hrtc);
1552 
1553   hrtc->State = HAL_RTC_STATE_BUSY;
1554 
1555   /* Disable the write protection for RTC registers */
1556   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
1557 
1558   /* Get tick */
1559   tickstart = HAL_GetTick();
1560 
1561   /* Wait until the shift is completed */
1562   while ((hrtc->Instance->ISR & RTC_ISR_SHPF) != 0U)
1563   {
1564     if ((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE)
1565     {
1566       /* Enable the write protection for RTC registers */
1567       __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1568 
1569       hrtc->State = HAL_RTC_STATE_TIMEOUT;
1570 
1571       /* Process Unlocked */
1572       __HAL_UNLOCK(hrtc);
1573 
1574       return HAL_TIMEOUT;
1575     }
1576   }
1577 
1578   /* Check if the reference clock detection is disabled */
1579   if ((hrtc->Instance->CR & RTC_CR_REFCKON) == 0U)
1580   {
1581     /* Configure the Shift settings */
1582     hrtc->Instance->SHIFTR = (uint32_t)(uint32_t)(ShiftSubFS) | (uint32_t)(ShiftAdd1S);
1583 
1584     /* If  RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
1585     if ((hrtc->Instance->CR & RTC_CR_BYPSHAD) == 0U)
1586     {
1587       if (HAL_RTC_WaitForSynchro(hrtc) != HAL_OK)
1588       {
1589         /* Enable the write protection for RTC registers */
1590         __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1591 
1592         hrtc->State = HAL_RTC_STATE_ERROR;
1593 
1594         /* Process Unlocked */
1595         __HAL_UNLOCK(hrtc);
1596 
1597         return HAL_ERROR;
1598       }
1599     }
1600   }
1601   else
1602   {
1603     /* Enable the write protection for RTC registers */
1604     __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1605 
1606     /* Change RTC state */
1607     hrtc->State = HAL_RTC_STATE_ERROR;
1608 
1609     /* Process Unlocked */
1610     __HAL_UNLOCK(hrtc);
1611 
1612     return HAL_ERROR;
1613   }
1614 
1615   /* Enable the write protection for RTC registers */
1616   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1617 
1618   /* Change RTC state */
1619   hrtc->State = HAL_RTC_STATE_READY;
1620 
1621   /* Process Unlocked */
1622   __HAL_UNLOCK(hrtc);
1623 
1624   return HAL_OK;
1625 }
1626 #endif /* RTC_SUBSECOND_SUPPORT */
1627 
1628 /**
1629   * @brief  Configures the Calibration Pinout (RTC_CALIB) Selection (1Hz or 512Hz).
1630   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1631   *                the configuration information for RTC.
1632   * @param  CalibOutput Select the Calibration output Selection.
1633   *          This parameter can be one of the following values:
1634   *             @arg RTC_CALIBOUTPUT_512HZ: A signal has a regular waveform at 512Hz.
1635   *             @arg RTC_CALIBOUTPUT_1HZ: A signal has a regular waveform at 1Hz.
1636   * @note   Calibration output Selection is not applicable to all devices.
1637   * @retval HAL status
1638   */
1639 #if defined(RTC_CR_COSEL)
HAL_RTCEx_SetCalibrationOutPut(RTC_HandleTypeDef * hrtc,uint32_t CalibOutput)1640 HAL_StatusTypeDef HAL_RTCEx_SetCalibrationOutPut(RTC_HandleTypeDef *hrtc, uint32_t CalibOutput)
1641 {
1642   /* Check the parameters */
1643   assert_param(IS_RTC_CALIB_OUTPUT(CalibOutput));
1644 
1645 #else /* RTC_CR_COSEL */
1646 HAL_StatusTypeDef HAL_RTCEx_SetCalibrationOutPut(RTC_HandleTypeDef *hrtc)
1647 {
1648 #endif /* RTC_CR_COSEL */
1649   /* Process Locked */
1650   __HAL_LOCK(hrtc);
1651 
1652   hrtc->State = HAL_RTC_STATE_BUSY;
1653 
1654   /* Disable the write protection for RTC registers */
1655   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
1656 
1657 #if defined(RTC_CR_COSEL)
1658   /* Clear flags before config */
1659   hrtc->Instance->CR &= (uint32_t)~RTC_CR_COSEL;
1660 
1661   /* Configure the RTC_CR register */
1662   hrtc->Instance->CR |= (uint32_t)CalibOutput;
1663 #endif /* RTC_CR_COSEL */
1664 
1665   __HAL_RTC_CALIBRATION_OUTPUT_ENABLE(hrtc);
1666 
1667   /* Enable the write protection for RTC registers */
1668   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1669 
1670   /* Change RTC state */
1671   hrtc->State = HAL_RTC_STATE_READY;
1672 
1673   /* Process Unlocked */
1674   __HAL_UNLOCK(hrtc);
1675 
1676   return HAL_OK;
1677 }
1678 
1679 /**
1680   * @brief  Deactivates the Calibration Pinout (RTC_CALIB) Selection (1Hz or 512Hz).
1681   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1682   *                the configuration information for RTC.
1683   * @retval HAL status
1684   */
1685 HAL_StatusTypeDef HAL_RTCEx_DeactivateCalibrationOutPut(RTC_HandleTypeDef *hrtc)
1686 {
1687   /* Process Locked */
1688   __HAL_LOCK(hrtc);
1689 
1690   hrtc->State = HAL_RTC_STATE_BUSY;
1691 
1692   /* Disable the write protection for RTC registers */
1693   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
1694 
1695   __HAL_RTC_CALIBRATION_OUTPUT_DISABLE(hrtc);
1696 
1697   /* Enable the write protection for RTC registers */
1698   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1699 
1700   /* Change RTC state */
1701   hrtc->State = HAL_RTC_STATE_READY;
1702 
1703   /* Process Unlocked */
1704   __HAL_UNLOCK(hrtc);
1705 
1706   return HAL_OK;
1707 }
1708 
1709 /**
1710   * @brief  Enables the RTC reference clock detection.
1711   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1712   *                the configuration information for RTC.
1713   * @retval HAL status
1714   */
1715 HAL_StatusTypeDef HAL_RTCEx_SetRefClock(RTC_HandleTypeDef *hrtc)
1716 {
1717   HAL_StatusTypeDef status;
1718 
1719   /* Process Locked */
1720   __HAL_LOCK(hrtc);
1721 
1722   hrtc->State = HAL_RTC_STATE_BUSY;
1723 
1724   /* Disable the write protection for RTC registers */
1725   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
1726 
1727   /* Enter Initialization mode */
1728   status = RTC_EnterInitMode(hrtc);
1729 
1730   if (status == HAL_OK)
1731   {
1732     /* Enable the reference clock detection */
1733     __HAL_RTC_CLOCKREF_DETECTION_ENABLE(hrtc);
1734 
1735     /* Exit Initialization mode */
1736     status = RTC_ExitInitMode(hrtc);
1737   }
1738 
1739   if (status == HAL_OK)
1740   {
1741     hrtc->State = HAL_RTC_STATE_READY;
1742   }
1743 
1744   /* Enable the write protection for RTC registers */
1745   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1746 
1747   /* Process Unlocked */
1748   __HAL_UNLOCK(hrtc);
1749 
1750   return status;
1751 }
1752 
1753 /**
1754   * @brief  Disable the RTC reference clock detection.
1755   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1756   *                the configuration information for RTC.
1757   * @retval HAL status
1758   */
1759 HAL_StatusTypeDef HAL_RTCEx_DeactivateRefClock(RTC_HandleTypeDef *hrtc)
1760 {
1761   HAL_StatusTypeDef status;
1762 
1763   /* Process Locked */
1764   __HAL_LOCK(hrtc);
1765 
1766   hrtc->State = HAL_RTC_STATE_BUSY;
1767 
1768   /* Disable the write protection for RTC registers */
1769   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
1770 
1771   /* Enter Initialization mode */
1772   status = RTC_EnterInitMode(hrtc);
1773 
1774   if (status == HAL_OK)
1775   {
1776     /* Disable the reference clock detection */
1777     __HAL_RTC_CLOCKREF_DETECTION_DISABLE(hrtc);
1778 
1779     /* Exit Initialization mode */
1780     status = RTC_ExitInitMode(hrtc);
1781   }
1782 
1783   if (status == HAL_OK)
1784   {
1785     hrtc->State = HAL_RTC_STATE_READY;
1786   }
1787 
1788   /* Enable the write protection for RTC registers */
1789   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1790 
1791   /* Process Unlocked */
1792   __HAL_UNLOCK(hrtc);
1793 
1794   return status;
1795 }
1796 
1797 #if defined(RTC_CR_BYPSHAD)
1798 /**
1799   * @brief  Enables the Bypass Shadow feature.
1800   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1801   *                the configuration information for RTC.
1802   * @note   When the Bypass Shadow is enabled the calendar value are taken
1803   *         directly from the Calendar counter.
1804   * @retval HAL status
1805   */
1806 HAL_StatusTypeDef HAL_RTCEx_EnableBypassShadow(RTC_HandleTypeDef *hrtc)
1807 {
1808   /* Process Locked */
1809   __HAL_LOCK(hrtc);
1810 
1811   hrtc->State = HAL_RTC_STATE_BUSY;
1812 
1813   /* Disable the write protection for RTC registers */
1814   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
1815 
1816   /* Set the BYPSHAD bit */
1817   hrtc->Instance->CR |= (uint8_t)RTC_CR_BYPSHAD;
1818 
1819   /* Enable the write protection for RTC registers */
1820   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1821 
1822   /* Change RTC state */
1823   hrtc->State = HAL_RTC_STATE_READY;
1824 
1825   /* Process Unlocked */
1826   __HAL_UNLOCK(hrtc);
1827 
1828   return HAL_OK;
1829 }
1830 
1831 /**
1832   * @brief  Disables the Bypass Shadow feature.
1833   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1834   *                the configuration information for RTC.
1835   * @note   When the Bypass Shadow is enabled the calendar value are taken
1836   *         directly from the Calendar counter.
1837   * @retval HAL status
1838   */
1839 HAL_StatusTypeDef HAL_RTCEx_DisableBypassShadow(RTC_HandleTypeDef *hrtc)
1840 {
1841   /* Process Locked */
1842   __HAL_LOCK(hrtc);
1843 
1844   hrtc->State = HAL_RTC_STATE_BUSY;
1845 
1846   /* Disable the write protection for RTC registers */
1847   __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
1848 
1849   /* Reset the BYPSHAD bit */
1850   hrtc->Instance->CR &= (uint8_t)~RTC_CR_BYPSHAD;
1851 
1852   /* Enable the write protection for RTC registers */
1853   __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
1854 
1855   /* Change RTC state */
1856   hrtc->State = HAL_RTC_STATE_READY;
1857 
1858   /* Process Unlocked */
1859   __HAL_UNLOCK(hrtc);
1860 
1861   return HAL_OK;
1862 }
1863 #endif /* RTC_CR_BYPSHAD */
1864 
1865 /**
1866   * @}
1867   */
1868 
1869 /** @defgroup RTCEx_Exported_Functions_Group4 Extended features functions
1870   * @brief    Extended features functions
1871   *
1872 @verbatim
1873  ===============================================================================
1874                  ##### Extended features functions #####
1875  ===============================================================================
1876     [..]  This section provides functions allowing to:
1877       (+) RTC Alarm B callback
1878       (+) RTC Poll for Alarm B request
1879 
1880 @endverbatim
1881   * @{
1882   */
1883 
1884 /**
1885   * @brief  Alarm B callback.
1886   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1887   *                the configuration information for RTC.
1888   * @retval None
1889   */
1890 __weak void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)
1891 {
1892   /* Prevent unused argument(s) compilation warning */
1893   UNUSED(hrtc);
1894 
1895   /* NOTE: This function should not be modified, when the callback is needed,
1896            the HAL_RTCEx_AlarmBEventCallback could be implemented in the user file
1897    */
1898 }
1899 
1900 /**
1901   * @brief  Handles Alarm B Polling request.
1902   * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
1903   *                the configuration information for RTC.
1904   * @param  Timeout Timeout duration
1905   * @retval HAL status
1906   */
1907 HAL_StatusTypeDef HAL_RTCEx_PollForAlarmBEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout)
1908 {
1909   uint32_t tickstart = 0U;
1910 
1911   /* Get tick */
1912   tickstart = HAL_GetTick();
1913 
1914   /* Wait till RTC ALRBF flag is set and if timeout is reached exit */
1915   while (__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRBF) == 0U)
1916   {
1917     if (Timeout != HAL_MAX_DELAY)
1918     {
1919       if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout))
1920       {
1921         hrtc->State = HAL_RTC_STATE_TIMEOUT;
1922         return HAL_TIMEOUT;
1923       }
1924     }
1925   }
1926 
1927   /* Clear the Alarm flag */
1928   __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRBF);
1929 
1930   /* Change RTC state */
1931   hrtc->State = HAL_RTC_STATE_READY;
1932 
1933   return HAL_OK;
1934 }
1935 
1936 /**
1937   * @}
1938   */
1939 
1940 /**
1941   * @}
1942   */
1943 
1944 #endif /* HAL_RTC_MODULE_ENABLED */
1945 /**
1946   * @}
1947   */
1948 
1949 /**
1950   * @}
1951   */
1952