diff --git a/src/STM32RTC.cpp b/src/STM32RTC.cpp index b95a6ea..5feb1ac 100644 --- a/src/STM32RTC.cpp +++ b/src/STM32RTC.cpp @@ -159,6 +159,16 @@ void STM32RTC::setPrediv(int8_t predivA, int16_t predivS) RTC_setPrediv(predivA, predivS); } + +void STM32RTC::getPrescaler(uint32_t *prescaler){ + RTC_getPrescaler(prescaler); +} + +void STM32RTC::setPrescaler(uint32_t prescaler){ + RTC_setPrescaler(prescaler); +} + + /** * @brief enable the RTC alarm. * @param match: Alarm_Match configuration diff --git a/src/STM32RTC.h b/src/STM32RTC.h index 0fd0cc3..2edb603 100644 --- a/src/STM32RTC.h +++ b/src/STM32RTC.h @@ -192,6 +192,9 @@ class STM32RTC { void getPrediv(int8_t *predivA, int16_t *predivS); void setPrediv(int8_t predivA, int16_t predivS); + void getPrescaler(uint32_t *prescaler); + void setPrescaler(uint32_t prescaler); + bool isConfigured(void) { return _configured; diff --git a/src/rtc.c b/src/rtc.c index d2c7674..63d85dd 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -248,6 +248,37 @@ void RTC_getPrediv(int8_t *asynch, int16_t *synch) #endif /* !STM32F1xx */ } +void RTC_setPrescaler(uint32_t prescaler) +{ +#if defined(STM32F1xx) + + /* if(prescaler==RTC_AUTO_1_SECOND) prescaler = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_RTC); // Automatically calculate for 1Sec + SET_BIT((RtcHandle).Instance->CRL, RTC_CRL_CNF);//__HAL_RTC_WRITEPROTECTION_DISABLE(RtcHandle); + MODIFY_REG(RtcHandle.Instance->PRLH, RTC_PRLH_PRL, (prescaler >> 16U)); + MODIFY_REG(RtcHandle.Instance->PRLL, RTC_PRLL_PRL, (prescaler & RTC_PRLL_PRL)); + CLEAR_BIT((RtcHandle).Instance->CRL, RTC_CRL_CNF);//__HAL_RTC_WRITEPROTECTION_ENABLE(RtcHandle); + */ + + RtcHandle.Init.AsynchPrediv = prescaler; + HAL_RTC_Init(&RtcHandle); + +#else + UNUSED(asynch); + UNUSED(synch); +#endif /* STM32F1xx */ +} + +void RTC_getPrescaler(uint32_t *prescaler) +{ +#if defined(STM32F1xx) + // *prescaler = (((uint32_t) RtcHandle.Instance->PRLH << 16U) | READ_REG(RtcHandle.Instance->PRLL & RTC_PRLL_PRL)); + *prescaler = RtcHandle.Init.AsynchPrediv; +#else + UNUSED(asynch); + UNUSED(synch); +#endif /* STM32F1xx */ +} + #if !defined(STM32F1xx) /** * @brief Compute (a)synchronous prescaler @@ -324,8 +355,8 @@ void RTC_init(hourFormat_t format, sourceClock_t source, bool reset) #if defined(STM32F1xx) /* Let HAL calculate the prescaler */ - RtcHandle.Init.AsynchPrediv = RTC_AUTO_1_SECOND; - RtcHandle.Init.OutPut = RTC_OUTPUTSOURCE_NONE; + RtcHandle.Init.AsynchPrediv = RTC_AUTO_1_SECOND;// eg: 0x8000-1 =32768-1 + RtcHandle.Init.OutPut = RTC_OUTPUTSOURCE_NONE; /* RTC_OUTPUTSOURCE_CALIBCLOCK; RTC_OUTPUTSOURCE_NONE; RTC_OUTPUTSOURCE_ALARM; RTC_OUTPUTSOURCE_SECOND */ UNUSED(format); #else if (format == HOUR_FORMAT_12) { diff --git a/src/rtc.h b/src/rtc.h index 4457a8b..8085cba 100644 --- a/src/rtc.h +++ b/src/rtc.h @@ -149,6 +149,9 @@ void RTC_SetClockSource(sourceClock_t source); void RTC_getPrediv(int8_t *asynch, int16_t *synch); void RTC_setPrediv(int8_t asynch, int16_t synch); +void RTC_getPrescaler(uint32_t *prescaler); +void RTC_setPrescaler(uint32_t prescaler); + void RTC_init(hourFormat_t format, sourceClock_t source, bool reset); void RTC_DeInit(void); bool RTC_IsTimeSet(void);