From 2b1d401296950517143d90533df232f754dbb13b Mon Sep 17 00:00:00 2001 From: "S.J.R. van Schaik" Date: Thu, 27 Jul 2017 12:24:42 +0200 Subject: [PATCH] stm32f0: rtc: fix off by one --- source/platform/stm32f0/rtc.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/source/platform/stm32f0/rtc.c b/source/platform/stm32f0/rtc.c index 6d76eec..cf2eb65 100644 --- a/source/platform/stm32f0/rtc.c +++ b/source/platform/stm32f0/rtc.c @@ -60,11 +60,13 @@ int rtc_get_time(struct tm *time) time->tm_min += (unsigned char)(((rtc_tr >> 12) & 0xF) * 10); time->tm_hour = (unsigned char)((rtc_tr >> 16) & 0xF); time->tm_hour += (unsigned char)(((rtc_tr >> 20) & 0xF) * 10); + time->tm_hour -= 1; time->tm_mday = (unsigned char)(rtc_dr & 0xF); time->tm_mday += (unsigned char)(((rtc_dr >> 4) & 0x3) * 10); time->tm_mon = (unsigned char)((rtc_dr >> 8) & 0xF); time->tm_mon += (unsigned char)(((rtc_dr >> 12) & 0x1) * 10); + time->tm_mon -= 1; time->tm_year = (unsigned char)((rtc_dr >> 16) & 0xF); time->tm_year += (unsigned char)(((rtc_dr >> 20) & 0xF) * 10); time->tm_year += 100; @@ -75,24 +77,26 @@ int rtc_get_time(struct tm *time) static int rtc_set_time(struct tm *time) { uint32_t rtc_tr, rtc_dr; - uint32_t year; + uint32_t hour, mon, year; if (!time) return -1; + hour = time->tm_hour + 1; + mon = time->tm_mon + 1; year = time->tm_year - 100; - rtc_tr = (time->tm_sec % 10); - rtc_tr |= (time->tm_sec / 10) << 4; - rtc_tr |= (time->tm_min % 10) << 8; - rtc_tr |= (time->tm_min / 10) << 12; - rtc_tr |= (time->tm_hour % 10) << 16; - rtc_tr |= (time->tm_hour / 10) << 20; + rtc_tr = (time->tm_sec % 10); + rtc_tr |= (time->tm_sec / 10) << 4; + rtc_tr |= (time->tm_min % 10) << 8; + rtc_tr |= (time->tm_min / 10) << 12; + rtc_tr |= (hour % 10) << 16; + rtc_tr |= (hour / 10) << 20; rtc_dr = (time->tm_mday % 10); rtc_dr |= (time->tm_mday / 10) << 4; - rtc_dr |= (time->tm_mon % 10) << 8; - rtc_dr |= (time->tm_mon / 10) << 12; + rtc_dr |= (mon % 10) << 8; + rtc_dr |= (mon / 10) << 12; rtc_dr |= (year % 10) << 16; rtc_dr |= (year / 10) << 20;