From f6a66ff7e2494f5e9ec6c93d7eaa91d7f638f5dc Mon Sep 17 00:00:00 2001 From: jhokajar Date: Mon, 9 Nov 2015 13:07:02 +0200 Subject: [PATCH] SiLabs: Correct low power timer setup When the requested timeout was not a integer multiple of the LF clock tick the timestamp was set too short due to rounding, sometimes causing the ticker event to be missed. --- .../hal/TARGET_Silicon_Labs/TARGET_EFM32/lp_ticker.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/lp_ticker.c b/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/lp_ticker.c index 7c83ca9a06..d9b718f6e4 100644 --- a/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/lp_ticker.c +++ b/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/lp_ticker.c @@ -155,6 +155,12 @@ void lp_ticker_set_interrupt(timestamp_t timestamp) /* map offset to RTC value */ // ticks = offset * RTC frequency div 1000000 timestamp_ticks = ((uint64_t)offset * (LOW_ENERGY_CLOCK_FREQUENCY / RTC_CLOCKDIV_INT)) / 1000000; + // checking the rounding. If timeout is wanted between RTCC ticks, irq should be configured to + // trigger in the latter RTCC-tick. Otherwise ticker-api fails to send timer event to its client + if(((timestamp_ticks * 1000000) / (LOW_ENERGY_CLOCK_FREQUENCY / RTC_CLOCKDIV_INT)) < offset){ + timestamp_ticks++; + } + timestamp_ticks += current_ticks; /* RTCC has 32 bit resolution */