Skip to content

Commit 17a5484

Browse files
committed
STM32 RTC : update and comment prescaler values
1 parent 01b2b1b commit 17a5484

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

targets/TARGET_STM/rtc_api.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,6 @@
3636

3737
static RTC_HandleTypeDef RtcHandle;
3838

39-
#if DEVICE_LOWPOWERTIMER
40-
#define RTC_ASYNCH_PREDIV ((RTC_CLOCK - 1) / 0x8000)
41-
#else
42-
#define RTC_ASYNCH_PREDIV (0x007F)
43-
#endif
44-
45-
#define RTC_SYNCH_PREDIV (RTC_CLOCK / (RTC_ASYNCH_PREDIV + 1) - 1)
46-
4739
#if DEVICE_LOWPOWERTIMER
4840
static void (*irq_handler)(void);
4941
static void RTC_IRQHandler(void);
@@ -114,8 +106,19 @@ void rtc_init(void)
114106
RtcHandle.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
115107
#else /* TARGET_STM32F1 */
116108
RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24;
117-
RtcHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
118-
RtcHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;
109+
110+
/* PREDIV_A : 7-bit asynchronous prescaler */
111+
#if DEVICE_LOWPOWERTIMER
112+
/* PREDIV_A is set to a small value to improve the SubSeconds resolution */
113+
/* with a 32768Hz clock, PREDIV_A=7 gives a precision of 244us */
114+
RtcHandle.Init.AsynchPrediv = 7;
115+
#else
116+
/* PREDIV_A is set to the maximum value to improve the consumption */
117+
RtcHandle.Init.AsynchPrediv = 0x007F;
118+
#endif
119+
/* PREDIV_S : 15-bit synchronous prescaler */
120+
/* PREDIV_S is set in order to get a 1 Hz clock */
121+
RtcHandle.Init.SynchPrediv = RTC_CLOCK / (RtcHandle.Init.AsynchPrediv + 1) - 1;
119122
RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
120123
RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
121124
RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
@@ -304,7 +307,7 @@ static void RTC_IRQHandler(void)
304307

305308
uint32_t rtc_read_subseconds(void)
306309
{
307-
return 1000000.f * ((double)(RTC_SYNCH_PREDIV - RTC->SSR) / (RTC_SYNCH_PREDIV + 1));
310+
return 1000000.f * ((double)((RTC->PRER & RTC_PRER_PREDIV_S) - RTC->SSR) / ((RTC->PRER & RTC_PRER_PREDIV_S) + 1));
308311
}
309312

310313
void rtc_set_wake_up_timer(uint32_t delta)

0 commit comments

Comments
 (0)