From c6ef07affed27af470504f5cf85f248f3c781ef1 Mon Sep 17 00:00:00 2001 From: Ken Willmott Date: Sat, 10 Feb 2018 18:52:15 -0500 Subject: [PATCH] Update rtc_util.c Modify rtc_get_count() and rtc_get_divider() to fix non-atomic accesses to RTC counter registers --- STM32F1/libraries/RTClock/src/utility/rtc_util.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/STM32F1/libraries/RTClock/src/utility/rtc_util.c b/STM32F1/libraries/RTClock/src/utility/rtc_util.c index 3c8b7d5..c730ba1 100644 --- a/STM32F1/libraries/RTClock/src/utility/rtc_util.c +++ b/STM32F1/libraries/RTClock/src/utility/rtc_util.c @@ -182,8 +182,10 @@ void rtc_set_count(uint32 value) { rtc_wait_sync(); rtc_wait_finished(); rtc_enter_config_mode(); - RTC->regs->CNTH = (value >> 16) & 0xffff; - RTC->regs->CNTL = value & 0xffff; + do { + h = RTC->regs->CNTH & 0xffff; + l = RTC->regs->CNTL & 0xffff; + } while (h ^ (RTC->regs->CNTH & 0xffff)); rtc_exit_config_mode(); rtc_wait_finished(); } @@ -211,8 +213,10 @@ uint32 rtc_get_divider() { rtc_clear_sync(); rtc_wait_sync(); rtc_wait_finished(); - h = RTC->regs->DIVH & 0x000f; - l = RTC->regs->DIVL & 0xffff; + do { + h = RTC->regs->DIVH & 0x000f; + l = RTC->regs->DIVL & 0xffff; + } while (h ^ (RTC->regs->DIVH & 0x000f)); return (h << 16) | l; } @@ -229,4 +233,4 @@ void rtc_set_alarm(uint32 value) { RTC->regs->ALRL = value & 0xffff; rtc_exit_config_mode(); rtc_wait_finished(); -} \ No newline at end of file +}