Update rtc_util.c

Modify rtc_get_count() and rtc_get_divider() to fix non-atomic accesses to RTC counter registers
This commit is contained in:
Ken Willmott 2018-02-10 18:52:15 -05:00 committed by GitHub
parent 5368d04c56
commit c6ef07affe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 5 deletions

View File

@ -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();
}
}