stm32/rtc: Check RTCEN=1 when testing if RTC is already running on boot.

It can be that LSEON and LSERDY are set yet the RTC is not enabled (this
can happen for example when coming out of the ST DFU mode on an F405 with
the RTC not previously initialised).  In such a case the RTC is never
started because the code thinks it's already running.  This patch fixes
this case by always checking if RTCEN is set when booting up (and also
testing for a valid RTCSEL value in the case of using an LSE).
This commit is contained in:
Damien George 2019-01-27 13:17:22 +11:00
parent 42863830be
commit c2886868b9
1 changed files with 5 additions and 2 deletions

View File

@ -124,7 +124,9 @@ void rtc_init_start(bool force_init) {
rtc_need_init_finalise = false; rtc_need_init_finalise = false;
if (!force_init) { if (!force_init) {
if ((RCC->BDCR & (RCC_BDCR_LSEON | RCC_BDCR_LSERDY)) == (RCC_BDCR_LSEON | RCC_BDCR_LSERDY)) { uint32_t bdcr = RCC->BDCR;
if ((bdcr & (RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL | RCC_BDCR_LSEON | RCC_BDCR_LSERDY))
== (RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL_0 | RCC_BDCR_LSEON | RCC_BDCR_LSERDY)) {
// LSE is enabled & ready --> no need to (re-)init RTC // LSE is enabled & ready --> no need to (re-)init RTC
// remove Backup Domain write protection // remove Backup Domain write protection
HAL_PWR_EnableBkUpAccess(); HAL_PWR_EnableBkUpAccess();
@ -133,7 +135,8 @@ void rtc_init_start(bool force_init) {
// provide some status information // provide some status information
rtc_info |= 0x40000 | (RCC->BDCR & 7) | (RCC->CSR & 3) << 8; rtc_info |= 0x40000 | (RCC->BDCR & 7) | (RCC->CSR & 3) << 8;
return; return;
} else if ((RCC->BDCR & RCC_BDCR_RTCSEL) == RCC_BDCR_RTCSEL_1) { } else if ((bdcr & (RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL))
== (RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL_1)) {
// LSI configured as the RTC clock source --> no need to (re-)init RTC // LSI configured as the RTC clock source --> no need to (re-)init RTC
// remove Backup Domain write protection // remove Backup Domain write protection
HAL_PWR_EnableBkUpAccess(); HAL_PWR_EnableBkUpAccess();