From df611a97a2a85d53a644e20e8fb6d5a96e653c52 Mon Sep 17 00:00:00 2001 From: Hamid Saffari <35362339+HamidSaffari@users.noreply.github.com> Date: Mon, 27 Jul 2020 06:46:33 +0430 Subject: [PATCH 1/8] Added getPrescaler(uint32_t *prescaler); setPrescaler(uint32_t prescaler); for calibrating STM32F1xx during runtime. --- src/STM32RTC.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 From 8fab545caaec6ca0bff474541f101d454ba7a39f Mon Sep 17 00:00:00 2001 From: Hamid Saffari <35362339+HamidSaffari@users.noreply.github.com> Date: Mon, 27 Jul 2020 06:47:44 +0430 Subject: [PATCH 2/8] Added getPrescaler(uint32_t *prescaler); setPrescaler(uint32_t prescaler); for calibrating STM32F1xx during runtime. --- src/STM32RTC.h | 3 +++ 1 file changed, 3 insertions(+) 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; From a344faf0437c924d804d70f4c8587e427d7a299f Mon Sep 17 00:00:00 2001 From: Hamid Saffari <35362339+HamidSaffari@users.noreply.github.com> Date: Mon, 27 Jul 2020 06:48:30 +0430 Subject: [PATCH 3/8] Added getPrescaler(uint32_t *prescaler); setPrescaler(uint32_t prescaler); for calibrating STM32F1xx during runtime. --- src/rtc.c | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/rtc.c b/src/rtc.c index d2c7674..c8211d5 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -248,6 +248,36 @@ 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 +354,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) { From 8e8ac32ad3779a65f0bb07e98318c0dfe0a51e05 Mon Sep 17 00:00:00 2001 From: Hamid Saffari <35362339+HamidSaffari@users.noreply.github.com> Date: Mon, 27 Jul 2020 06:49:26 +0430 Subject: [PATCH 4/8] Added getPrescaler(uint32_t *prescaler); setPrescaler(uint32_t prescaler); for calibrating STM32F1xx during runtime. --- src/rtc.h | 3 +++ 1 file changed, 3 insertions(+) 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); From 4fb39d9507bbed5113e2037fc2609d4dd696e9a1 Mon Sep 17 00:00:00 2001 From: Hamid Saffari <35362339+HamidSaffari@users.noreply.github.com> Date: Mon, 27 Jul 2020 06:53:53 +0430 Subject: [PATCH 5/8] Added getPrescaler(uint32_t *prescaler); setPrescaler(uint32_t prescaler); for calibrating STM32F1xx during runtime. --- src/rtc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rtc.c b/src/rtc.c index c8211d5..26df36c 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -354,8 +354,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;// eg: 0x8000-1 =32768-1 ;// - RtcHandle.Init.OutPut = RTC_OUTPUTSOURCE_NONE;//RTC_OUTPUTSOURCE_CALIBCLOCK; RTC_OUTPUTSOURCE_NONE; RTC_OUTPUTSOURCE_ALARM; RTC_OUTPUTSOURCE_SECOND + 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) { From 0a3f77215064a13bab5e6e19bd2fa6925966403c Mon Sep 17 00:00:00 2001 From: Hamid Saffari <35362339+HamidSaffari@users.noreply.github.com> Date: Sat, 1 Aug 2020 07:55:06 +0430 Subject: [PATCH 6/8] Update rtc.c --- src/rtc.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/rtc.c b/src/rtc.c index 26df36c..255fdc2 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -251,12 +251,12 @@ void RTC_getPrediv(int8_t *asynch, int16_t *synch) 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); */ + + // 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); @@ -270,7 +270,7 @@ void RTC_setPrescaler(uint32_t prescaler) 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 = (((uint32_t) RtcHandle.Instance->PRLH << 16U) | READ_REG(RtcHandle.Instance->PRLL & RTC_PRLL_PRL)); *prescaler = RtcHandle.Init.AsynchPrediv; #else UNUSED(asynch); @@ -355,7 +355,7 @@ 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;// eg: 0x8000-1 =32768-1 - RtcHandle.Init.OutPut = RTC_OUTPUTSOURCE_NONE;/* RTC_OUTPUTSOURCE_CALIBCLOCK; RTC_OUTPUTSOURCE_NONE; RTC_OUTPUTSOURCE_ALARM; RTC_OUTPUTSOURCE_SECOND */ + 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) { From ba6427ce918964bbf4bf0adc8d197876a3c1d37e Mon Sep 17 00:00:00 2001 From: Hamid Saffari <35362339+HamidSaffari@users.noreply.github.com> Date: Sat, 1 Aug 2020 08:01:56 +0430 Subject: [PATCH 7/8] Update rtc.c --- src/rtc.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/rtc.c b/src/rtc.c index 255fdc2..cd18b1e 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -252,12 +252,6 @@ 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); @@ -354,8 +348,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;// eg: 0x8000-1 =32768-1 - RtcHandle.Init.OutPut = RTC_OUTPUTSOURCE_NONE; /* RTC_OUTPUTSOURCE_CALIBCLOCK; RTC_OUTPUTSOURCE_NONE; RTC_OUTPUTSOURCE_ALARM; RTC_OUTPUTSOURCE_SECOND */ + RtcHandle.Init.AsynchPrediv = RTC_AUTO_1_SECOND; + RtcHandle.Init.OutPut = RTC_OUTPUTSOURCE_NONE; UNUSED(format); #else if (format == HOUR_FORMAT_12) { From 60a7c0804da5641c631bcd6ee192a7f0f273f1e8 Mon Sep 17 00:00:00 2001 From: Hamid Saffari <35362339+HamidSaffari@users.noreply.github.com> Date: Sat, 1 Aug 2020 08:04:36 +0430 Subject: [PATCH 8/8] Update rtc.c --- src/rtc.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/rtc.c b/src/rtc.c index cd18b1e..63d85dd 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -252,6 +252,13 @@ 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); @@ -348,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) {