3131#define z_mco2_prescaler (v ) LL_RCC_MCO2_DIV_ ## v
3232#define mco2_prescaler (v ) z_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
@@ -302,9 +332,13 @@ static int stm32_clock_control_init(struct device *dev)
302332#endif /* CONFIG_CLOCK_STM32_HSE_BYPASS */
303333
304334 /* Switch to PLL with HSE as clock source */
305- LL_PLL_ConfigSystemClock_HSE (CONFIG_CLOCK_STM32_HSE_CLOCK , hse_bypass ,
306- & s_PLLInitStruct ,
307- & s_ClkInitStruct );
335+ LL_PLL_ConfigSystemClock_HSE (
336+ #ifndef CONFIG_SOC_SERIES_STM32WBX
337+ CONFIG_CLOCK_STM32_HSE_CLOCK ,
338+ #endif
339+ hse_bypass ,
340+ & s_PLLInitStruct ,
341+ & s_ClkInitStruct );
308342
309343 /* Disable other clocks */
310344 LL_RCC_HSI_Disable ();
@@ -332,14 +366,14 @@ static int stm32_clock_control_init(struct device *dev)
332366
333367 /* Set HSE as SYSCLCK source */
334368 LL_RCC_SetSysClkSource (LL_RCC_SYS_CLKSOURCE_HSE );
335- LL_RCC_SetAHBPrescaler (s_ClkInitStruct . AHBCLKDivider );
369+ LL_RCC_SetAHBPrescaler (hclk_prescaler );
336370 while (LL_RCC_GetSysClkSource () != LL_RCC_SYS_CLKSOURCE_STATUS_HSE ) {
337371 }
338372
339373 /* Update SystemCoreClock variable */
340374 LL_SetSystemCoreClock (__LL_RCC_CALC_HCLK_FREQ (
341375 CONFIG_CLOCK_STM32_HSE_CLOCK ,
342- s_ClkInitStruct . AHBCLKDivider ));
376+ hclk_prescaler ));
343377
344378 /* Set APB1 & APB2 prescaler*/
345379 LL_RCC_SetAPB1Prescaler (s_ClkInitStruct .APB1CLKDivider );
@@ -377,7 +411,7 @@ static int stm32_clock_control_init(struct device *dev)
377411
378412 /* Set MSI as SYSCLCK source */
379413 LL_RCC_SetSysClkSource (LL_RCC_SYS_CLKSOURCE_MSI );
380- LL_RCC_SetAHBPrescaler (s_ClkInitStruct . AHBCLKDivider );
414+ LL_RCC_SetAHBPrescaler (hclk_prescaler );
381415 while (LL_RCC_GetSysClkSource () != LL_RCC_SYS_CLKSOURCE_STATUS_MSI ) {
382416 }
383417
@@ -389,6 +423,11 @@ static int stm32_clock_control_init(struct device *dev)
389423 /* Set APB1 & APB2 prescaler*/
390424 LL_RCC_SetAPB1Prescaler (s_ClkInitStruct .APB1CLKDivider );
391425 LL_RCC_SetAPB2Prescaler (s_ClkInitStruct .APB2CLKDivider );
426+ #ifdef CONFIG_SOC_SERIES_STM32WBX
427+ /* Set C2 AHB & AHB4 prescalers */
428+ LL_C2_RCC_SetAHBPrescaler (s_ClkInitStruct -> CPU2CLKDivider );
429+ LL_RCC_SetAHB4Prescaler (s_ClkInitStruct -> AHB4CLKDivider );
430+ #endif /* CONFIG_SOC_SERIES_STM32WBX */
392431
393432 /* Set flash latency */
394433 /* MSI used as SYSCLK (16MHz), set latency to 0 */
@@ -401,11 +440,11 @@ static int stm32_clock_control_init(struct device *dev)
401440
402441#elif CONFIG_CLOCK_STM32_SYSCLK_SRC_HSI
403442
404- stm32_clock_switch_to_hsi (s_ClkInitStruct . AHBCLKDivider );
443+ stm32_clock_switch_to_hsi (hclk_prescaler );
405444
406445 /* Update SystemCoreClock variable */
407446 LL_SetSystemCoreClock (__LL_RCC_CALC_HCLK_FREQ (HSI_VALUE ,
408- s_ClkInitStruct . AHBCLKDivider ));
447+ hclk_prescaler ));
409448
410449 /* Set APB1 & APB2 prescaler*/
411450 LL_RCC_SetAPB1Prescaler (s_ClkInitStruct .APB1CLKDivider );
0 commit comments