Skip to content

Commit 5249a7b

Browse files
committed
Add timeout and adjustment to LSI
1 parent 241ef52 commit 5249a7b

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

ports/stm/supervisor/port.c

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,9 @@ __attribute__((used, naked)) void Reset_Handler(void) {
153153
static 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

161161
safe_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;
293307
volatile uint32_t seconds_to_minute = 0;
294308
volatile uint32_t cached_hours_minutes = 0;
295309
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);
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.
343357
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);
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

Comments
 (0)