diff --git a/arch/arm/src/stm32l4/stm32l4_rcc.c b/arch/arm/src/stm32l4/stm32l4_rcc.c index d18e0dbc882..1f90867dc31 100644 --- a/arch/arm/src/stm32l4/stm32l4_rcc.c +++ b/arch/arm/src/stm32l4/stm32l4_rcc.c @@ -56,6 +56,7 @@ #include "stm32l4_flash.h" #include "stm32l4.h" #include "stm32l4_waste.h" +#include "stm32l4_rtc.h" /**************************************************************************** * Pre-processor Definitions @@ -117,8 +118,18 @@ static inline void rcc_resetbkp(void) /* Check if the RTC is already configured */ init_stat = stm32l4_rtc_is_initialized(); - if(!init_stat) + if (!init_stat) { + uint32_t bkregs[STM32L4_RTC_BKCOUNT]; + int i; + + /* Backup backup-registers before RTC reset. */ + + for (i = 0; i < STM32L4_RTC_BKCOUNT; i++) + { + bkregs[i] = getreg32(STM32L4_RTC_BKR(i)); + } + /* Enable write access to the backup domain (RTC registers, RTC * backup data registers and backup SRAM). */ @@ -132,6 +143,18 @@ static inline void rcc_resetbkp(void) modifyreg32(STM32L4_RCC_BDCR, 0, RCC_BDCR_BDRST); modifyreg32(STM32L4_RCC_BDCR, RCC_BDCR_BDRST, 0); + /* Restore backup-registers, except RTC related. */ + + for (i = 0; i < STM32L4_RTC_BKCOUNT; i++) + { + if (RTC_MAGIC_REG == STM32L4_RTC_BKR(i)) + { + continue; + } + + putreg32(bkregs[i], STM32L4_RTC_BKR(i)); + } + (void)stm32l4_pwr_enablebkp(false); } } diff --git a/arch/arm/src/stm32l4/stm32l4_rtc.c b/arch/arm/src/stm32l4/stm32l4_rtc.c index 7707d264c5f..f083250c7b9 100644 --- a/arch/arm/src/stm32l4/stm32l4_rtc.c +++ b/arch/arm/src/stm32l4/stm32l4_rtc.c @@ -84,22 +84,6 @@ # error "CONFIG_STM32L4_PWR must selected to use this driver" #endif -#if !defined(CONFIG_RTC_MAGIC) -# define CONFIG_RTC_MAGIC (0xfacefeee) -#endif - -#if !defined(CONFIG_RTC_MAGIC_TIME_SET) -# define CONFIG_RTC_MAGIC_TIME_SET (CONFIG_RTC_MAGIC + 1) -#endif - -#if !defined(CONFIG_RTC_MAGIC_REG) -# define CONFIG_RTC_MAGIC_REG (0) -#endif - -#define RTC_MAGIC CONFIG_RTC_MAGIC -#define RTC_MAGIC_TIME_SET CONFIG_RTC_MAGIC_TIME_SET -#define RTC_MAGIC_REG STM32L4_RTC_BKR(CONFIG_RTC_MAGIC_REG) - /* Constants ****************************************************************/ #define SYNCHRO_TIMEOUT (0x00020000) diff --git a/arch/arm/src/stm32l4/stm32l4_rtc.h b/arch/arm/src/stm32l4/stm32l4_rtc.h index c7da87e212f..e7b06fcb31c 100644 --- a/arch/arm/src/stm32l4/stm32l4_rtc.h +++ b/arch/arm/src/stm32l4/stm32l4_rtc.h @@ -57,6 +57,22 @@ #define STM32L4_RTC_PRESCALER_SECOND 32767 /* Default prescaler to get a second base */ #define STM32L4_RTC_PRESCALER_MIN 1 /* Maximum speed of 16384 Hz */ +#if !defined(CONFIG_RTC_MAGIC) +# define CONFIG_RTC_MAGIC (0xfacefeee) +#endif + +#if !defined(CONFIG_RTC_MAGIC_TIME_SET) +# define CONFIG_RTC_MAGIC_TIME_SET (CONFIG_RTC_MAGIC + 1) +#endif + +#if !defined(CONFIG_RTC_MAGIC_REG) +# define CONFIG_RTC_MAGIC_REG (0) +#endif + +#define RTC_MAGIC CONFIG_RTC_MAGIC +#define RTC_MAGIC_TIME_SET CONFIG_RTC_MAGIC_TIME_SET +#define RTC_MAGIC_REG STM32L4_RTC_BKR(CONFIG_RTC_MAGIC_REG) + /**************************************************************************** * Public Types ****************************************************************************/