summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoralf Trønnes <noralf@tronnes.org>2018-04-29 16:38:18 +0200
committerNoralf Trønnes <noralf@tronnes.org>2018-04-29 20:43:07 +0200
commit62d7a800d76ffb020d0cb1076b54a8e049b08bee (patch)
tree85bcb22e571c35cabfa30a1516bda773bdee4457
parent83e390714f696e58e34f4bcab5fb77ff1a5451fd (diff)
atmel-samd: RTC: Improve precision when setting datetime
The prescaler is not reset when setting the counter so we can be off by as much as 1023/1024 seconds. Fix this by resetting the RTC module.
-rw-r--r--ports/atmel-samd/common-hal/rtc/RTC.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/ports/atmel-samd/common-hal/rtc/RTC.c b/ports/atmel-samd/common-hal/rtc/RTC.c
index d63e81305..680a88deb 100644
--- a/ports/atmel-samd/common-hal/rtc/RTC.c
+++ b/ports/atmel-samd/common-hal/rtc/RTC.c
@@ -64,6 +64,12 @@ void common_hal_rtc_get_time(timeutils_struct_time_t *tm) {
}
void common_hal_rtc_set_time(timeutils_struct_time_t *tm) {
+ // Reset prescaler to increase initial precision. Otherwise we can be up to 1 second off already.
+ uint32_t freqcorr = hri_rtcmode0_read_FREQCORR_reg(calendar.device.hw);
+ calendar_deinit(&calendar);
+ rtc_init();
+ hri_rtcmode0_write_FREQCORR_reg(calendar.device.hw, freqcorr);
+
struct calendar_date date = {
.year = tm->tm_year,
.month = tm->tm_mon,