@@ -153,9 +153,9 @@ __attribute__((used, naked)) void Reset_Handler(void) {
153153static RTC_HandleTypeDef _hrtc ;
154154
155155#if BOARD_HAS_LOW_SPEED_CRYSTAL
156- #define RTC_CLOCK_FREQUENCY LSE_VALUE
156+ static uint32_t rtc_clock_frequency = LSE_VALUE ;
157157#else
158- #define RTC_CLOCK_FREQUENCY LSI_VALUE
158+ static uint32_t rtc_clock_frequency = LSI_VALUE ;
159159#endif
160160
161161safe_mode_t port_init (void ) {
@@ -172,22 +172,36 @@ safe_mode_t port_init(void) {
172172 HAL_PWR_EnableBkUpAccess ();
173173 #if BOARD_HAS_LOW_SPEED_CRYSTAL
174174 __HAL_RCC_LSE_CONFIG (RCC_LSE_ON );
175- while (__HAL_RCC_GET_FLAG (RCC_FLAG_LSERDY ) == RESET ) {}
175+ bool lse_setupsuccess = true;
176+ uint32_t i = 0 ;
177+ while (__HAL_RCC_GET_FLAG (RCC_FLAG_LSERDY ) == RESET ) {
178+ if ( ++ i > 1000000 )
179+ {
180+ lse_setupsuccess = false;
181+ __HAL_RCC_LSE_CONFIG (RCC_LSE_OFF );
182+ __HAL_RCC_LSI_ENABLE ();
183+ rtc_clock_frequency = LSI_VALUE ;
184+ }
185+ }
176186 #else
177187 __HAL_RCC_LSI_ENABLE ();
178188 #endif
179189 #if BOARD_HAS_LOW_SPEED_CRYSTAL
180- __HAL_RCC_RTC_CONFIG (RCC_RTCCLKSOURCE_LSE );
190+ if (lse_setupsuccess ) {
191+ __HAL_RCC_RTC_CONFIG (RCC_RTCCLKSOURCE_LSE );
192+ } else {
193+ __HAL_RCC_RTC_CONFIG (RCC_RTCCLKSOURCE_LSI );
194+ }
181195 #else
182196 __HAL_RCC_RTC_CONFIG (RCC_RTCCLKSOURCE_LSI );
183197 #endif
184198 __HAL_RCC_RTC_ENABLE ();
185199 _hrtc .Instance = RTC ;
186200 _hrtc .Init .HourFormat = RTC_HOURFORMAT_24 ;
187- // Divide async as little as possible so that we have RTC_CLOCK_FREQUENCY count in subseconds.
201+ // Divide async as little as possible so that we have rtc_clock_frequency count in subseconds.
188202 // This ensures our timing > 1 second is correct.
189203 _hrtc .Init .AsynchPrediv = 0x0 ;
190- _hrtc .Init .SynchPrediv = RTC_CLOCK_FREQUENCY - 1 ;
204+ _hrtc .Init .SynchPrediv = rtc_clock_frequency - 1 ;
191205 _hrtc .Init .OutPut = RTC_OUTPUT_DISABLE ;
192206
193207 HAL_RTC_Init (& _hrtc );
@@ -293,7 +307,7 @@ volatile uint32_t cached_date = 0;
293307volatile uint32_t seconds_to_minute = 0 ;
294308volatile uint32_t cached_hours_minutes = 0 ;
295309uint64_t port_get_raw_ticks (uint8_t * subticks ) {
296- uint32_t subseconds = RTC_CLOCK_FREQUENCY - (uint32_t )(RTC -> SSR );
310+ uint32_t subseconds = rtc_clock_frequency - (uint32_t )(RTC -> SSR );
297311 uint32_t time = (uint32_t )(RTC -> TR & RTC_TR_RESERVED_MASK );
298312 uint32_t date = (uint32_t )(RTC -> DR & RTC_DR_RESERVED_MASK );
299313 if (date != cached_date ) {
@@ -341,7 +355,7 @@ void RTC_Alarm_IRQHandler(void) {
341355
342356// Enable 1/1024 second tick.
343357void port_enable_tick (void ) {
344- HAL_RTCEx_SetWakeUpTimer_IT (& _hrtc , RTC_CLOCK_FREQUENCY / 1024 / 2 , RTC_WAKEUPCLOCK_RTCCLK_DIV2 );
358+ HAL_RTCEx_SetWakeUpTimer_IT (& _hrtc , rtc_clock_frequency / 1024 / 2 , RTC_WAKEUPCLOCK_RTCCLK_DIV2 );
345359 HAL_NVIC_SetPriority (RTC_WKUP_IRQn , 1 , 0U );
346360 HAL_NVIC_EnableIRQ (RTC_WKUP_IRQn );
347361}
@@ -372,7 +386,7 @@ void port_interrupt_after_ticks(uint32_t ticks) {
372386 alarm .AlarmMask = RTC_ALARMMASK_ALL ;
373387 }
374388
375- alarm .AlarmTime .SubSeconds = RTC_CLOCK_FREQUENCY -
389+ alarm .AlarmTime .SubSeconds = rtc_clock_frequency -
376390 ((raw_ticks % 1024 ) * 32 );
377391 alarm .AlarmTime .DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;
378392 alarm .AlarmTime .StoreOperation = RTC_STOREOPERATION_SET ;
0 commit comments