Skip to content

Commit 5b68602

Browse files
committed
feat: add STM32WB0x support
Signed-off-by: Frederic Pillon <frederic.pillon@st.com>
1 parent f9b5bb4 commit 5b68602

File tree

4 files changed

+63
-18
lines changed

4 files changed

+63
-18
lines changed

src/STM32RTC.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,19 @@ void STM32RTC::begin(bool resetTime, Hour_Format format)
6262
bool reinit;
6363

6464
_format = format;
65+
#if defined(RCC_RTC_WDG_BLEWKUP_CLKSOURCE_HSI64M_DIV2048)
66+
reinit = RTC_init((format == HOUR_12) ? HOUR_FORMAT_12 : HOUR_FORMAT_24,
67+
(_mode == MODE_MIX) ? ::MODE_BINARY_MIX : ((_mode == MODE_BIN) ? ::MODE_BINARY_ONLY : ::MODE_BINARY_NONE),
68+
(_clockSource == LSE_CLOCK) ? ::LSE_CLOCK :
69+
(_clockSource == HSI_CLOCK) ? ::HSI_CLOCK : ::LSI_CLOCK
70+
, resetTime);
71+
#else
6572
reinit = RTC_init((format == HOUR_12) ? HOUR_FORMAT_12 : HOUR_FORMAT_24,
6673
(_mode == MODE_MIX) ? ::MODE_BINARY_MIX : ((_mode == MODE_BIN) ? ::MODE_BINARY_ONLY : ::MODE_BINARY_NONE),
6774
(_clockSource == LSE_CLOCK) ? ::LSE_CLOCK :
6875
(_clockSource == HSE_CLOCK) ? ::HSE_CLOCK : ::LSI_CLOCK
6976
, resetTime);
77+
#endif /* RCC_RTC_WDG_BLEWKUP_CLKSOURCE_HSI64M_DIV2048 */
7078
_timeSet = !reinit;
7179

7280
syncDate();
@@ -137,8 +145,13 @@ void STM32RTC::setClockSource(Source_Clock source, uint32_t predivA, uint32_t pr
137145
{
138146
if (IS_CLOCK_SOURCE(source)) {
139147
_clockSource = source;
148+
#if defined(RCC_RTC_WDG_BLEWKUP_CLKSOURCE_HSI64M_DIV2048)
149+
RTC_SetClockSource((_clockSource == LSE_CLOCK) ? ::LSE_CLOCK :
150+
(_clockSource == HSI_CLOCK) ? ::HSI_CLOCK : ::LSI_CLOCK);
151+
#else
140152
RTC_SetClockSource((_clockSource == LSE_CLOCK) ? ::LSE_CLOCK :
141153
(_clockSource == HSE_CLOCK) ? ::HSE_CLOCK : ::LSI_CLOCK);
154+
#endif /* RCC_RTC_WDG_BLEWKUP_CLKSOURCE_HSI64M_DIV2048 */
142155
}
143156
RTC_setPrediv(predivA, predivS);
144157
}

src/STM32RTC.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,13 @@
6868

6969
typedef void(*voidFuncPtr)(void *);
7070

71+
#if defined(RCC_RTC_WDG_BLEWKUP_CLKSOURCE_HSI64M_DIV2048)
72+
#define IS_CLOCK_SOURCE(SRC) (((SRC) == STM32RTC::LSI_CLOCK) || ((SRC) == STM32RTC::LSE_CLOCK) ||\
73+
((SRC) == STM32RTC::HSI_CLOCK))
74+
#else
7175
#define IS_CLOCK_SOURCE(SRC) (((SRC) == STM32RTC::LSI_CLOCK) || ((SRC) == STM32RTC::LSE_CLOCK) ||\
7276
((SRC) == STM32RTC::HSE_CLOCK))
77+
#endif /* RCC_RTC_WDG_BLEWKUP_CLKSOURCE_HSI64M_DIV2048 */
7378
#define IS_HOUR_FORMAT(FMT) (((FMT) == STM32RTC::HOUR_12) || ((FMT) == STM32RTC::HOUR_24))
7479

7580
class STM32RTC {
@@ -107,7 +112,11 @@ class STM32RTC {
107112
enum Source_Clock : uint8_t {
108113
LSI_CLOCK = ::LSI_CLOCK,
109114
LSE_CLOCK = ::LSE_CLOCK,
115+
#if defined(RCC_RTC_WDG_BLEWKUP_CLKSOURCE_HSI64M_DIV2048)
116+
HSI_CLOCK = ::HSI_CLOCK,
117+
#else
110118
HSE_CLOCK = ::HSE_CLOCK
119+
#endif /* RCC_RTC_WDG_BLEWKUP_CLKSOURCE_HSI64M_DIV2048 */
111120
};
112121

113122
enum Alarm : uint32_t {

src/rtc.c

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -187,16 +187,20 @@ static void RTC_initClock(sourceClock_t source)
187187
if (source == LSE_CLOCK) {
188188
/* Enable the clock if not already set by user */
189189
enableClock(LSE_CLOCK);
190-
190+
#if defined(RCC_PERIPHCLK_RTC_WDG_BLEWKUP)
191+
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC_WDG_BLEWKUP;
192+
PeriphClkInit.RTCWDGBLEWKUPClockSelection = RCC_RTC_WDG_BLEWKUP_CLKSOURCE_LSE;
193+
} else if (source == HSI_CLOCK) {
194+
/* Enable the clock if not already set by user */
195+
enableClock(HSI_CLOCK);
196+
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC_WDG_BLEWKUP;
197+
PeriphClkInit.RTCWDGBLEWKUPClockSelection = RCC_RTC_WDG_BLEWKUP_CLKSOURCE_HSI64M_DIV2048;
198+
#else
191199
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
192200
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
193-
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
194-
Error_Handler();
195-
}
196201
} else if (source == HSE_CLOCK) {
197202
/* Enable the clock if not already set by user */
198203
enableClock(HSE_CLOCK);
199-
200204
/* HSE division factor for RTC clock must be set to ensure that
201205
* the clock supplied to the RTC is less than or equal to 1 MHz
202206
*/
@@ -230,21 +234,27 @@ static void RTC_initClock(sourceClock_t source)
230234
#else
231235
#error "Could not define RTCClockSelection"
232236
#endif /* STM32F1xx */
233-
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
234-
Error_Handler();
235-
}
237+
#endif /* RCC_PERIPHCLK_RTC_WDG_BLEWKUP */
236238
} else if (source == LSI_CLOCK) {
237239
/* Enable the clock if not already set by user */
238240
enableClock(LSI_CLOCK);
239-
241+
#if defined(RCC_PERIPHCLK_RTC_WDG_BLEWKUP)
242+
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC_WDG_BLEWKUP;
243+
PeriphClkInit.RTCWDGBLEWKUPClockSelection = RCC_RTC_WDG_BLEWKUP_CLKSOURCE_LSI;
244+
#else
240245
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
241246
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
242-
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
243-
Error_Handler();
244-
}
247+
#endif /* RCC_PERIPHCLK_RTC_WDG_BLEWKUP */
245248
} else {
249+
/* Invalid clock source */
250+
Error_Handler();
251+
}
252+
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
246253
Error_Handler();
247254
}
255+
#if defined(__HAL_RCC_RTC_CLK_ENABLE)
256+
__HAL_RCC_RTC_CLK_ENABLE();
257+
#endif
248258
}
249259

250260
/**
@@ -451,7 +461,9 @@ bool RTC_init(hourFormat_t format, binaryMode_t mode, sourceClock_t source, bool
451461
RtcHandle.Init.HourFormat = (format == HOUR_FORMAT_12) ? RTC_HOURFORMAT_12 : RTC_HOURFORMAT_24;
452462
RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
453463
RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
464+
#if defined(RTC_OUTPUT_TYPE_OPENDRAIN)
454465
RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
466+
#endif
455467
#if defined(RTC_OUTPUT_PULLUP_NONE)
456468
RtcHandle.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
457469
#endif
@@ -507,6 +519,14 @@ bool RTC_init(hourFormat_t format, binaryMode_t mode, sourceClock_t source, bool
507519
reinit = true;
508520
} else {
509521
// RTC is already initialized
522+
#if defined(__HAL_RCC_GET_RTC_WDG_BLEWKUP_CLK_CONFIG)
523+
uint32_t oldRtcClockSource = __HAL_RCC_GET_RTC_WDG_BLEWKUP_CLK_CONFIG();
524+
oldRtcClockSource = ((oldRtcClockSource == RCC_RTC_WDG_BLEWKUP_CLKSOURCE_LSE) ? LSE_CLOCK :
525+
(oldRtcClockSource == RCC_RTC_WDG_BLEWKUP_CLKSOURCE_LSI) ? LSI_CLOCK :
526+
(oldRtcClockSource == RCC_RTC_WDG_BLEWKUP_CLKSOURCE_HSI64M_DIV2048) ? HSI_CLOCK :
527+
// default case corresponding to no clock source
528+
0xFFFFFFFF);
529+
#else
510530
uint32_t oldRtcClockSource = __HAL_RCC_GET_RTC_SOURCE();
511531
oldRtcClockSource = ((oldRtcClockSource == RCC_RTCCLKSOURCE_LSE) ? LSE_CLOCK :
512532
(oldRtcClockSource == RCC_RTCCLKSOURCE_LSI) ? LSI_CLOCK :
@@ -521,7 +541,7 @@ bool RTC_init(hourFormat_t format, binaryMode_t mode, sourceClock_t source, bool
521541
#endif
522542
// default case corresponding to no clock source
523543
0xFFFFFFFF);
524-
544+
#endif
525545
#if defined(STM32F1xx)
526546
if ((RtcHandle.DateToUpdate.WeekDay == 0)
527547
&& (RtcHandle.DateToUpdate.Month == 0)
@@ -711,8 +731,8 @@ void RTC_SetTime(uint8_t hours, uint8_t minutes, uint8_t seconds, uint32_t subSe
711731
/*RTC_TimeStruct.SubSeconds = subSeconds;*/
712732
/*RTC_TimeStruct.SecondFraction = 0;*/
713733
#endif /* RTC_SSR_SS */
714-
RTC_TimeStruct.DayLightSaving = RTC_STOREOPERATION_RESET;
715-
RTC_TimeStruct.StoreOperation = RTC_DAYLIGHTSAVING_NONE;
734+
RTC_TimeStruct.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
735+
RTC_TimeStruct.StoreOperation = RTC_STOREOPERATION_RESET;
716736
#else
717737
UNUSED(period);
718738
#endif /* !STM32F1xx */
@@ -1192,7 +1212,8 @@ void RTC_Alarm_IRQHandler(void)
11921212
defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F070xB) || \
11931213
defined(STM32F030xC) || defined(STM32G0xx) || defined(STM32H5xx) || \
11941214
defined(STM32L0xx) || defined(STM32L5xx) || defined(STM32U0xx) ||\
1195-
defined(STM32U3xx) || defined(STM32U5xx) || defined(STM32WBAxx)
1215+
defined(STM32U3xx) || defined(STM32U5xx) || defined(STM32WB0x) || \
1216+
defined(STM32WBAxx)
11961217
// In some cases, the same vector is used to manage WakeupTimer,
11971218
// but with a dedicated HAL IRQHandler
11981219
HAL_RTCEx_WakeUpTimerIRQHandler(&RtcHandle);

src/rtc.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ typedef void(*voidCallbackPtr)(void *);
130130

131131
#if defined(STM32C0xx) || defined(STM32F0xx) || defined(STM32H5xx) || \
132132
defined(STM32L0xx) || defined(STM32L5xx) || defined(STM32U3xx) || \
133-
defined(STM32U3xx) || defined(STM32U5xx) || defined(STM32WBAxx)
133+
defined(STM32U3xx) || defined(STM32U5xx) || defined(STM32WB0x) || \
134+
defined(STM32WBAxx)
134135
#define RTC_Alarm_IRQn RTC_IRQn
135136
#define RTC_Alarm_IRQHandler RTC_IRQHandler
136137
#endif
@@ -142,7 +143,8 @@ typedef void(*voidCallbackPtr)(void *);
142143
/* mapping the IRQn for the one-second interrupt depending on the soc */
143144
#if defined(STM32F1xx) || (defined(STM32F0xx) && defined(RTC_CR_WUTE)) || \
144145
defined(STM32H5xx) || defined(STM32L0xx) || defined(STM32L5xx) || \
145-
defined(STM32U3xx) || defined(STM32U5xx) || defined(STM32WBAxx)
146+
defined(STM32U3xx) || defined(STM32U5xx) || defined(STM32WB0x) || \
147+
defined(STM32WBAxx)
146148
// specific WakeUp interrupt
147149
#define ONESECOND_IRQn RTC_IRQn
148150
#elif defined(STM32MP1xx)

0 commit comments

Comments
 (0)