aboutsummaryrefslogtreecommitdiffstats
path: root/os
diff options
context:
space:
mode:
Diffstat (limited to 'os')
-rw-r--r--os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.c b/os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.c
index 824daa9e7..6d44570f1 100644
--- a/os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.c
+++ b/os/hal/ports/STM32/LLD/RTCv2/hal_rtc_lld.c
@@ -50,6 +50,8 @@
#define RTC_DR_DT_OFFSET 4
#define RTC_DR_DU_OFFSET 0
+#define RTC_CR_BKP_OFFSET 18
+
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
@@ -343,8 +345,9 @@ void rtc_lld_set_time(RTCDriver *rtcp, const RTCDateTime *timespec) {
/* Writing the registers.*/
rtc_enter_init();
- rtcp->rtc->TR = tr;
- rtcp->rtc->DR = dr;
+ rtcp->rtc->TR = tr;
+ rtcp->rtc->DR = dr;
+ rtcp->rtc->CR |= timespec->dstflag << RTC_CR_BKP_OFFSET;
rtc_exit_init();
/* Leaving a reentrant critical zone.*/
@@ -361,7 +364,7 @@ void rtc_lld_set_time(RTCDriver *rtcp, const RTCDateTime *timespec) {
* @notapi
*/
void rtc_lld_get_time(RTCDriver *rtcp, RTCDateTime *timespec) {
- uint32_t dr, tr;
+ uint32_t dr, tr, cr;
uint32_t subs;
#if STM32_RTC_HAS_SUBSECONDS
uint32_t ssr;
@@ -380,6 +383,7 @@ void rtc_lld_get_time(RTCDriver *rtcp, RTCDateTime *timespec) {
#endif /* STM32_RTC_HAS_SUBSECONDS */
tr = rtcp->rtc->TR;
dr = rtcp->rtc->DR;
+ cr = rtcp->rtc->CR;
rtcp->rtc->ISR &= ~RTC_ISR_RSF;
/* Leaving a reentrant critical zone.*/
@@ -400,6 +404,9 @@ void rtc_lld_get_time(RTCDriver *rtcp, RTCDateTime *timespec) {
/* Decoding date, this concludes the atomic read sequence.*/
rtc_decode_date(dr, timespec);
+
+ /* Retrieving the DST bit.*/
+ timespec->dstflag = (cr >> RTC_CR_BKP_OFFSET) & 1;
}
#if (RTC_ALARMS > 0) || defined(__DOXYGEN__)