@@ -153,9 +153,9 @@ __attribute__((used, naked)) void Reset_Handler(void) {
153
153
static RTC_HandleTypeDef _hrtc ;
154
154
155
155
#if BOARD_HAS_LOW_SPEED_CRYSTAL
156
- #define RTC_CLOCK_FREQUENCY LSE_VALUE
156
+ static uint32_t rtc_clock_frequency = LSE_VALUE ;
157
157
#else
158
- #define RTC_CLOCK_FREQUENCY LSI_VALUE
158
+ static uint32_t rtc_clock_frequency = LSI_VALUE ;
159
159
#endif
160
160
161
161
safe_mode_t port_init (void ) {
@@ -172,22 +172,36 @@ safe_mode_t port_init(void) {
172
172
HAL_PWR_EnableBkUpAccess ();
173
173
#if BOARD_HAS_LOW_SPEED_CRYSTAL
174
174
__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
+ }
176
186
#else
177
187
__HAL_RCC_LSI_ENABLE ();
178
188
#endif
179
189
#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
+ }
181
195
#else
182
196
__HAL_RCC_RTC_CONFIG (RCC_RTCCLKSOURCE_LSI );
183
197
#endif
184
198
__HAL_RCC_RTC_ENABLE ();
185
199
_hrtc .Instance = RTC ;
186
200
_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.
188
202
// This ensures our timing > 1 second is correct.
189
203
_hrtc .Init .AsynchPrediv = 0x0 ;
190
- _hrtc .Init .SynchPrediv = RTC_CLOCK_FREQUENCY - 1 ;
204
+ _hrtc .Init .SynchPrediv = rtc_clock_frequency - 1 ;
191
205
_hrtc .Init .OutPut = RTC_OUTPUT_DISABLE ;
192
206
193
207
HAL_RTC_Init (& _hrtc );
@@ -293,7 +307,7 @@ volatile uint32_t cached_date = 0;
293
307
volatile uint32_t seconds_to_minute = 0 ;
294
308
volatile uint32_t cached_hours_minutes = 0 ;
295
309
uint64_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 );
297
311
uint32_t time = (uint32_t )(RTC -> TR & RTC_TR_RESERVED_MASK );
298
312
uint32_t date = (uint32_t )(RTC -> DR & RTC_DR_RESERVED_MASK );
299
313
if (date != cached_date ) {
@@ -341,7 +355,7 @@ void RTC_Alarm_IRQHandler(void) {
341
355
342
356
// Enable 1/1024 second tick.
343
357
void 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 );
345
359
HAL_NVIC_SetPriority (RTC_WKUP_IRQn , 1 , 0U );
346
360
HAL_NVIC_EnableIRQ (RTC_WKUP_IRQn );
347
361
}
@@ -372,7 +386,7 @@ void port_interrupt_after_ticks(uint32_t ticks) {
372
386
alarm .AlarmMask = RTC_ALARMMASK_ALL ;
373
387
}
374
388
375
- alarm .AlarmTime .SubSeconds = RTC_CLOCK_FREQUENCY -
389
+ alarm .AlarmTime .SubSeconds = rtc_clock_frequency -
376
390
((raw_ticks % 1024 ) * 32 );
377
391
alarm .AlarmTime .DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;
378
392
alarm .AlarmTime .StoreOperation = RTC_STOREOPERATION_SET ;
0 commit comments