3131#define _mco2_prescaler (v ) LL_RCC_MCO2_DIV_ ## v
3232#define mco2_prescaler (v ) _mco2_prescaler(v)
3333
34+ #ifdef CONFIG_SOC_SERIES_STM32WBX
35+ #define __LL_RCC_CALC_HCLK_FREQ __LL_RCC_CALC_HCLK1_FREQ
36+ #endif /* CONFIG_SOC_SERIES_STM32F0X */
37+
3438/**
3539 * @brief fill in AHB/APB buses configuration structure
3640 */
3741static void config_bus_clk_init (LL_UTILS_ClkInitTypeDef * clk_init )
3842{
43+ #ifdef CONFIG_SOC_SERIES_STM32WBX
44+ clk_init -> CPU1CLKDivider = ahb_prescaler (
45+ CONFIG_CLOCK_STM32_CPU1_PRESCALER );
46+ clk_init -> CPU2CLKDivider = ahb_prescaler (
47+ CONFIG_CLOCK_STM32_CPU2_PRESCALER );
48+ clk_init -> AHB4CLKDivider = ahb_prescaler (
49+ CONFIG_CLOCK_STM32_AHB4_PRESCALER );
50+ #else
3951 clk_init -> AHBCLKDivider = ahb_prescaler (
4052 CONFIG_CLOCK_STM32_AHB_PRESCALER );
53+ #endif /* CONFIG_SOC_SERIES_STM32WBX */
54+
4155 clk_init -> APB1CLKDivider = apb1_prescaler (
4256 CONFIG_CLOCK_STM32_APB1_PRESCALER );
57+
4358#ifndef CONFIG_SOC_SERIES_STM32F0X
4459 clk_init -> APB2CLKDivider = apb2_prescaler (
4560 CONFIG_CLOCK_STM32_APB2_PRESCALER );
@@ -65,7 +80,8 @@ static inline int stm32_clock_control_on(struct device *dev,
6580#if defined(CONFIG_SOC_SERIES_STM32L4X ) || \
6681 defined(CONFIG_SOC_SERIES_STM32F4X ) || \
6782 defined(CONFIG_SOC_SERIES_STM32F7X ) || \
68- defined(CONFIG_SOC_SERIES_STM32F2X )
83+ defined(CONFIG_SOC_SERIES_STM32F2X ) || \
84+ defined(CONFIG_SOC_SERIES_STM32WBX )
6985 case STM32_CLOCK_BUS_AHB2 :
7086 LL_AHB2_GRP1_EnableClock (pclken -> enr );
7187 break ;
@@ -74,7 +90,9 @@ static inline int stm32_clock_control_on(struct device *dev,
7490 case STM32_CLOCK_BUS_APB1 :
7591 LL_APB1_GRP1_EnableClock (pclken -> enr );
7692 break ;
77- #if defined(CONFIG_SOC_SERIES_STM32L4X ) || defined(CONFIG_SOC_SERIES_STM32F0X )
93+ #if defined(CONFIG_SOC_SERIES_STM32L4X ) || \
94+ defined(CONFIG_SOC_SERIES_STM32F0X ) || \
95+ defined(CONFIG_SOC_SERIES_STM32WBX )
7896 case STM32_CLOCK_BUS_APB1_2 :
7997 LL_APB1_GRP2_EnableClock (pclken -> enr );
8098 break ;
@@ -120,7 +138,9 @@ static inline int stm32_clock_control_off(struct device *dev,
120138 case STM32_CLOCK_BUS_APB1 :
121139 LL_APB1_GRP1_DisableClock (pclken -> enr );
122140 break ;
123- #if defined(CONFIG_SOC_SERIES_STM32L4X ) || defined(CONFIG_SOC_SERIES_STM32F0X )
141+ #if defined(CONFIG_SOC_SERIES_STM32L4X ) || \
142+ defined(CONFIG_SOC_SERIES_STM32F0X ) || \
143+ defined(CONFIG_SOC_SERIES_STM32WBX )
124144 case STM32_CLOCK_BUS_APB1_2 :
125145 LL_APB1_GRP2_DisableClock (pclken -> enr );
126146 break ;
@@ -173,9 +193,11 @@ static int stm32_clock_control_get_subsys_rate(struct device *clock,
173193 * rate = ahb_clock ;
174194 break ;
175195 case STM32_CLOCK_BUS_APB1 :
176- #if defined(CONFIG_SOC_SERIES_STM32L4X ) || defined(CONFIG_SOC_SERIES_STM32F0X )
196+ #if defined(CONFIG_SOC_SERIES_STM32L4X ) || \
197+ defined(CONFIG_SOC_SERIES_STM32F0X ) || \
198+ defined(CONFIG_SOC_SERIES_STM32WBX )
177199 case STM32_CLOCK_BUS_APB1_2 :
178- #endif /* CONFIG_SOC_SERIES_STM32L4X || CONFIG_SOC_SERIES_STM32F0X */
200+ #endif
179201 * rate = apb1_clock ;
180202 break ;
181203#ifndef CONFIG_SOC_SERIES_STM32F0X
@@ -238,12 +260,20 @@ static inline void stm32_clock_control_mco_init(void)
238260static int stm32_clock_control_init (struct device * dev )
239261{
240262 LL_UTILS_ClkInitTypeDef s_ClkInitStruct ;
263+ u32_t hclk_prescaler ;
241264
242265 ARG_UNUSED (dev );
243266
244267 /* configure clock for AHB/APB buses */
245268 config_bus_clk_init ((LL_UTILS_ClkInitTypeDef * )& s_ClkInitStruct );
246269
270+ /* update local hclk prescaler variable */
271+ #ifdef CONFIG_SOC_SERIES_STM32WBX
272+ hclk_prescaler = s_ClkInitStruct .CPU1CLKDivider ;
273+ #else
274+ hclk_prescaler = s_ClkInitStruct .AHBCLKDivider ;
275+ #endif /* CONFIG_SOC_SERIES_STM32WBX */
276+
247277 /* Some clocks would be activated by default */
248278 config_enable_default_clocks ();
249279
@@ -273,6 +303,7 @@ static int stm32_clock_control_init(struct device *dev)
273303#endif /* CONFIG_CLOCK_STM32_PLL_Q_DIVISOR */
274304
275305#ifdef CONFIG_CLOCK_STM32_PLL_SRC_MSI
306+
276307 /* Switch to PLL with MSI as clock source */
277308 LL_PLL_ConfigSystemClock_MSI (& s_PLLInitStruct , & s_ClkInitStruct );
278309
@@ -296,9 +327,13 @@ static int stm32_clock_control_init(struct device *dev)
296327#endif /* CONFIG_CLOCK_STM32_HSE_BYPASS */
297328
298329 /* Switch to PLL with HSE as clock source */
299- LL_PLL_ConfigSystemClock_HSE (CONFIG_CLOCK_STM32_HSE_CLOCK , hse_bypass ,
300- & s_PLLInitStruct ,
301- & s_ClkInitStruct );
330+ LL_PLL_ConfigSystemClock_HSE (
331+ #ifndef CONFIG_SOC_SERIES_STM32WBX
332+ CONFIG_CLOCK_STM32_HSE_CLOCK ,
333+ #endif
334+ hse_bypass ,
335+ & s_PLLInitStruct ,
336+ & s_ClkInitStruct );
302337
303338 /* Disable other clocks */
304339 LL_RCC_HSI_Disable ();
@@ -326,14 +361,14 @@ static int stm32_clock_control_init(struct device *dev)
326361
327362 /* Set HSE as SYSCLCK source */
328363 LL_RCC_SetSysClkSource (LL_RCC_SYS_CLKSOURCE_HSE );
329- LL_RCC_SetAHBPrescaler (s_ClkInitStruct . AHBCLKDivider );
364+ LL_RCC_SetAHBPrescaler (hclk_prescaler );
330365 while (LL_RCC_GetSysClkSource () != LL_RCC_SYS_CLKSOURCE_STATUS_HSE ) {
331366 }
332367
333368 /* Update SystemCoreClock variable */
334369 LL_SetSystemCoreClock (__LL_RCC_CALC_HCLK_FREQ (
335370 CONFIG_CLOCK_STM32_HSE_CLOCK ,
336- s_ClkInitStruct . AHBCLKDivider ));
371+ hclk_prescaler ));
337372
338373 /* Set APB1 & APB2 prescaler*/
339374 LL_RCC_SetAPB1Prescaler (s_ClkInitStruct .APB1CLKDivider );
@@ -371,7 +406,7 @@ static int stm32_clock_control_init(struct device *dev)
371406
372407 /* Set MSI as SYSCLCK source */
373408 LL_RCC_SetSysClkSource (LL_RCC_SYS_CLKSOURCE_MSI );
374- LL_RCC_SetAHBPrescaler (s_ClkInitStruct . AHBCLKDivider );
409+ LL_RCC_SetAHBPrescaler (hclk_prescaler );
375410 while (LL_RCC_GetSysClkSource () != LL_RCC_SYS_CLKSOURCE_STATUS_MSI ) {
376411 }
377412
@@ -383,6 +418,11 @@ static int stm32_clock_control_init(struct device *dev)
383418 /* Set APB1 & APB2 prescaler*/
384419 LL_RCC_SetAPB1Prescaler (s_ClkInitStruct .APB1CLKDivider );
385420 LL_RCC_SetAPB2Prescaler (s_ClkInitStruct .APB2CLKDivider );
421+ #ifdef CONFIG_SOC_SERIES_STM32WBX
422+ /* Set C2 AHB & AHB4 prescalers */
423+ LL_C2_RCC_SetAHBPrescaler (s_ClkInitStruct -> CPU2CLKDivider );
424+ LL_RCC_SetAHB4Prescaler (s_ClkInitStruct -> AHB4CLKDivider );
425+ #endif /* CONFIG_SOC_SERIES_STM32WBX */
386426
387427 /* Set flash latency */
388428 /* MSI used as SYSCLK (16MHz), set latency to 0 */
@@ -395,11 +435,11 @@ static int stm32_clock_control_init(struct device *dev)
395435
396436#elif CONFIG_CLOCK_STM32_SYSCLK_SRC_HSI
397437
398- stm32_clock_switch_to_hsi (s_ClkInitStruct . AHBCLKDivider );
438+ stm32_clock_switch_to_hsi (hclk_prescaler );
399439
400440 /* Update SystemCoreClock variable */
401441 LL_SetSystemCoreClock (__LL_RCC_CALC_HCLK_FREQ (HSI_VALUE ,
402- s_ClkInitStruct . AHBCLKDivider ));
442+ hclk_prescaler ));
403443
404444 /* Set APB1 & APB2 prescaler*/
405445 LL_RCC_SetAPB1Prescaler (s_ClkInitStruct .APB1CLKDivider );
0 commit comments