From e0f463743764afe7c2bce14e154832b8a57c43ba Mon Sep 17 00:00:00 2001 From: Filip Jagodzinski Date: Fri, 14 Sep 2018 14:20:54 +0200 Subject: [PATCH] STM: Fix us_ticker timestamp after deep sleep Use the `mbed_sdk_inited` flag to correct the `HAL_GetTick()` behavior after waking up from deep sleep mode. `ticker_read_us()` must not be used to read us_ticker timestamp after waking up until the us_ticker context is restored. More detailed description in issue #8117. Fixes #8117 --- targets/TARGET_STM/sleep.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/targets/TARGET_STM/sleep.c b/targets/TARGET_STM/sleep.c index 50759eb74b5..631e2839151 100644 --- a/targets/TARGET_STM/sleep.c +++ b/targets/TARGET_STM/sleep.c @@ -158,6 +158,7 @@ void hal_sleep(void) } extern int serial_is_tx_ongoing(void); +extern int mbed_sdk_inited; void hal_deepsleep(void) { @@ -200,6 +201,10 @@ void hal_deepsleep(void) HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); #endif /* TARGET_STM32L4 */ + /* Prevent HAL_GetTick() from using ticker_read_us() to read the + * us_ticker timestamp until the us_ticker context is restored. */ + mbed_sdk_inited = 0; + // Verify Clock Out of Deep Sleep ForceClockOutofDeepSleep(); @@ -214,6 +219,10 @@ void hal_deepsleep(void) restore_timer_ctx(); + /* us_ticker context restored, allow HAL_GetTick() to read the us_ticker + * timestamp via ticker_read_us() again. */ + mbed_sdk_inited = 1; + // Enable IRQs core_util_critical_section_exit(); }