@@ -187,16 +187,20 @@ static void RTC_initClock(sourceClock_t source)
187187 if (source == LSE_CLOCK ) {
188188 /* Enable the clock if not already set by user */
189189 enableClock (LSE_CLOCK );
190-
190+ #if defined(RCC_PERIPHCLK_RTC_WDG_BLEWKUP )
191+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_RTC_WDG_BLEWKUP ;
192+ PeriphClkInit .RTCWDGBLEWKUPClockSelection = RCC_RTC_WDG_BLEWKUP_CLKSOURCE_LSE ;
193+ } else if (source == HSI_CLOCK ) {
194+ /* Enable the clock if not already set by user */
195+ enableClock (HSI_CLOCK );
196+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_RTC_WDG_BLEWKUP ;
197+ PeriphClkInit .RTCWDGBLEWKUPClockSelection = RCC_RTC_WDG_BLEWKUP_CLKSOURCE_HSI64M_DIV2048 ;
198+ #else
191199 PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_RTC ;
192200 PeriphClkInit .RTCClockSelection = RCC_RTCCLKSOURCE_LSE ;
193- if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
194- Error_Handler ();
195- }
196201 } else if (source == HSE_CLOCK ) {
197202 /* Enable the clock if not already set by user */
198203 enableClock (HSE_CLOCK );
199-
200204 /* HSE division factor for RTC clock must be set to ensure that
201205 * the clock supplied to the RTC is less than or equal to 1 MHz
202206 */
@@ -230,21 +234,27 @@ static void RTC_initClock(sourceClock_t source)
230234#else
231235#error "Could not define RTCClockSelection"
232236#endif /* STM32F1xx */
233- if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
234- Error_Handler ();
235- }
237+ #endif /* RCC_PERIPHCLK_RTC_WDG_BLEWKUP */
236238 } else if (source == LSI_CLOCK ) {
237239 /* Enable the clock if not already set by user */
238240 enableClock (LSI_CLOCK );
239-
241+ #if defined(RCC_PERIPHCLK_RTC_WDG_BLEWKUP )
242+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_RTC_WDG_BLEWKUP ;
243+ PeriphClkInit .RTCWDGBLEWKUPClockSelection = RCC_RTC_WDG_BLEWKUP_CLKSOURCE_LSI ;
244+ #else
240245 PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_RTC ;
241246 PeriphClkInit .RTCClockSelection = RCC_RTCCLKSOURCE_LSI ;
242- if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
243- Error_Handler ();
244- }
247+ #endif /* RCC_PERIPHCLK_RTC_WDG_BLEWKUP */
245248 } else {
249+ /* Invalid clock source */
250+ Error_Handler ();
251+ }
252+ if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
246253 Error_Handler ();
247254 }
255+ #if defined(__HAL_RCC_RTC_CLK_ENABLE )
256+ __HAL_RCC_RTC_CLK_ENABLE ();
257+ #endif
248258}
249259
250260/**
@@ -451,7 +461,9 @@ bool RTC_init(hourFormat_t format, binaryMode_t mode, sourceClock_t source, bool
451461 RtcHandle .Init .HourFormat = (format == HOUR_FORMAT_12 ) ? RTC_HOURFORMAT_12 : RTC_HOURFORMAT_24 ;
452462 RtcHandle .Init .OutPut = RTC_OUTPUT_DISABLE ;
453463 RtcHandle .Init .OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH ;
464+ #if defined(RTC_OUTPUT_TYPE_OPENDRAIN )
454465 RtcHandle .Init .OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN ;
466+ #endif
455467#if defined(RTC_OUTPUT_PULLUP_NONE )
456468 RtcHandle .Init .OutPutPullUp = RTC_OUTPUT_PULLUP_NONE ;
457469#endif
@@ -507,6 +519,14 @@ bool RTC_init(hourFormat_t format, binaryMode_t mode, sourceClock_t source, bool
507519 reinit = true;
508520 } else {
509521 // RTC is already initialized
522+ #if defined(__HAL_RCC_GET_RTC_WDG_BLEWKUP_CLK_CONFIG )
523+ uint32_t oldRtcClockSource = __HAL_RCC_GET_RTC_WDG_BLEWKUP_CLK_CONFIG ();
524+ oldRtcClockSource = ((oldRtcClockSource == RCC_RTC_WDG_BLEWKUP_CLKSOURCE_LSE ) ? LSE_CLOCK :
525+ (oldRtcClockSource == RCC_RTC_WDG_BLEWKUP_CLKSOURCE_LSI ) ? LSI_CLOCK :
526+ (oldRtcClockSource == RCC_RTC_WDG_BLEWKUP_CLKSOURCE_HSI64M_DIV2048 ) ? HSI_CLOCK :
527+ // default case corresponding to no clock source
528+ 0xFFFFFFFF );
529+ #else
510530 uint32_t oldRtcClockSource = __HAL_RCC_GET_RTC_SOURCE ();
511531 oldRtcClockSource = ((oldRtcClockSource == RCC_RTCCLKSOURCE_LSE ) ? LSE_CLOCK :
512532 (oldRtcClockSource == RCC_RTCCLKSOURCE_LSI ) ? LSI_CLOCK :
@@ -521,7 +541,7 @@ bool RTC_init(hourFormat_t format, binaryMode_t mode, sourceClock_t source, bool
521541#endif
522542 // default case corresponding to no clock source
523543 0xFFFFFFFF );
524-
544+ #endif
525545#if defined(STM32F1xx )
526546 if ((RtcHandle .DateToUpdate .WeekDay == 0 )
527547 && (RtcHandle .DateToUpdate .Month == 0 )
@@ -711,8 +731,8 @@ void RTC_SetTime(uint8_t hours, uint8_t minutes, uint8_t seconds, uint32_t subSe
711731 /*RTC_TimeStruct.SubSeconds = subSeconds;*/
712732 /*RTC_TimeStruct.SecondFraction = 0;*/
713733#endif /* RTC_SSR_SS */
714- RTC_TimeStruct .DayLightSaving = RTC_STOREOPERATION_RESET ;
715- RTC_TimeStruct .StoreOperation = RTC_DAYLIGHTSAVING_NONE ;
734+ RTC_TimeStruct .DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;
735+ RTC_TimeStruct .StoreOperation = RTC_STOREOPERATION_RESET ;
716736#else
717737 UNUSED (period );
718738#endif /* !STM32F1xx */
@@ -1192,7 +1212,8 @@ void RTC_Alarm_IRQHandler(void)
11921212 defined(STM32F091xC ) || defined(STM32F098xx ) || defined(STM32F070xB ) || \
11931213 defined(STM32F030xC ) || defined(STM32G0xx ) || defined(STM32H5xx ) || \
11941214 defined(STM32L0xx ) || defined(STM32L5xx ) || defined(STM32U0xx ) || \
1195- defined(STM32U3xx ) || defined(STM32U5xx ) || defined(STM32WBAxx )
1215+ defined(STM32U3xx ) || defined(STM32U5xx ) || defined(STM32WB0x ) || \
1216+ defined(STM32WBAxx )
11961217 // In some cases, the same vector is used to manage WakeupTimer,
11971218 // but with a dedicated HAL IRQHandler
11981219 HAL_RTCEx_WakeUpTimerIRQHandler (& RtcHandle );
0 commit comments