1 /**
2   ******************************************************************************
3   * @file    stm32n6xx_ll_rcc.c
4   * @author  MCD Application Team
5   * @brief   RCC LL module driver.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2023 STMicroelectronics.
10   * All rights reserved.
11   *
12   * This software is licensed under terms that can be found in the LICENSE file
13   * in the root directory of this software component.
14   * If no LICENSE file comes with this software, it is provided AS-IS.
15   *
16   ******************************************************************************
17   */
18 
19 /* Includes ------------------------------------------------------------------*/
20 #include "stm32n6xx_ll_rcc.h"
21 #include "stm32n6xx_ll_bus.h"
22 #ifdef  USE_FULL_ASSERT
23 #include "stm32_assert.h"
24 #else
25 #define assert_param(expr) ((void)0U)
26 #endif /* USE_FULL_ASSERT */
27 
28 /** @addtogroup STM32N6xx_LL_Driver
29   * @{
30   */
31 
32 #if defined(RCC)
33 
34 /** @addtogroup RCC_LL
35   * @{
36   */
37 
38 /* Private types -------------------------------------------------------------*/
39 /* Private variables ---------------------------------------------------------*/
40 /* Private constants ---------------------------------------------------------*/
41 /** @addtogroup RCC_LL_Private_Constants
42   * @{
43   */
44 #if defined(USE_FPGA)
45 /* ***** FPGA values ******/
46 #define FREF_FREQ         32000000UL  /* FREF forced to 32MHz */
47 #define PLL_SOURCE_FREQ   32000000UL  /* PLL source forced to 32MHz */
48 #endif /* USE_FPGA */
49 /**
50   * @}
51   */
52 
53 /* Private macros ------------------------------------------------------------*/
54 /** @addtogroup RCC_LL_Private_Macros
55   * @{
56   */
57 #define IS_LL_RCC_ADC_CLKSOURCE(__VALUE__)    ((__VALUE__) == LL_RCC_ADC_CLKSOURCE)
58 
59 #define IS_LL_RCC_ADF_CLKSOURCE(__VALUE__)    ((__VALUE__) == LL_RCC_ADF1_CLKSOURCE)
60 
61 #define IS_LL_RCC_DCMIPP_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_DCMIPP_CLKSOURCE)
62 
63 #define IS_LL_RCC_ETH_CLKSOURCE(__VALUE__)    ((__VALUE__) == LL_RCC_ETH1_CLKSOURCE)
64 
65 #define IS_LL_RCC_ETHPTP_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_ETH1PTP_CLKSOURCE)
66 
67 #define IS_LL_RCC_FDCAN_CLKSOURCE(__VALUE__)  ((__VALUE__) == LL_RCC_FDCAN_CLKSOURCE)
68 
69 #define IS_LL_RCC_FMC_CLKSOURCE(__VALUE__)    ((__VALUE__) == LL_RCC_FMC_CLKSOURCE)
70 
71 #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
72                                                || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
73                                                || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE) \
74                                                || ((__VALUE__) == LL_RCC_I2C4_CLKSOURCE))
75 
76 #define IS_LL_RCC_I3C_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_I3C1_CLKSOURCE) \
77                                                || ((__VALUE__) == LL_RCC_I3C2_CLKSOURCE))
78 
79 #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE)  \
80                                                || ((__VALUE__) == LL_RCC_LPTIM2_CLKSOURCE)  \
81                                                || ((__VALUE__) == LL_RCC_LPTIM3_CLKSOURCE)  \
82                                                || ((__VALUE__) == LL_RCC_LPTIM4_CLKSOURCE)  \
83                                                || ((__VALUE__) == LL_RCC_LPTIM5_CLKSOURCE))
84 
85 #define IS_LL_RCC_LTDC_CLKSOURCE(__VALUE__)   ((__VALUE__) == LL_RCC_LTDC_CLKSOURCE)
86 
87 #define IS_LL_RCC_MDF_CLKSOURCE(__VALUE__)    ((__VALUE__) == LL_RCC_MDF1_CLKSOURCE)
88 
89 #define IS_LL_RCC_OTGPHY_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_OTGPHY1_CLKSOURCE) \
90                                                || ((__VALUE__) == LL_RCC_OTGPHY2_CLKSOURCE))
91 
92 #define IS_LL_RCC_OTGPHYCKREF_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_OTGPHY1CKREF_CLKSOURCE) \
93                                                     || ((__VALUE__) == LL_RCC_OTGPHY2CKREF_CLKSOURCE))
94 
95 #define IS_LL_RCC_PSSI_CLKSOURCE(__VALUE__)   ((__VALUE__) == LL_RCC_PSSI_CLKSOURCE)
96 
97 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
98                                                || ((__VALUE__) == LL_RCC_SAI2_CLKSOURCE))
99 
100 #define IS_LL_RCC_SDMMC_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_SDMMC1_CLKSOURCE) \
101                                                || ((__VALUE__) == LL_RCC_SDMMC2_CLKSOURCE))
102 
103 #define IS_LL_RCC_SPDIFRX_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_SPDIFRX1_CLKSOURCE)
104 
105 #define IS_LL_RCC_SPI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SPI1_CLKSOURCE) \
106                                                || ((__VALUE__) == LL_RCC_SPI2_CLKSOURCE) \
107                                                || ((__VALUE__) == LL_RCC_SPI3_CLKSOURCE) \
108                                                || ((__VALUE__) == LL_RCC_SPI4_CLKSOURCE) \
109                                                || ((__VALUE__) == LL_RCC_SPI5_CLKSOURCE) \
110                                                || ((__VALUE__) == LL_RCC_SPI6_CLKSOURCE))
111 
112 #define IS_LL_RCC_UART_CLKSOURCE(__VALUE__)   (((__VALUE__) == LL_RCC_UART4_CLKSOURCE) \
113                                                || ((__VALUE__) == LL_RCC_UART5_CLKSOURCE) \
114                                                || ((__VALUE__) == LL_RCC_UART7_CLKSOURCE) \
115                                                || ((__VALUE__) == LL_RCC_UART8_CLKSOURCE) \
116                                                || ((__VALUE__) == LL_RCC_UART9_CLKSOURCE))
117 
118 #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
119                                                || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \
120                                                || ((__VALUE__) == LL_RCC_USART3_CLKSOURCE) \
121                                                || ((__VALUE__) == LL_RCC_USART6_CLKSOURCE) \
122                                                || ((__VALUE__) == LL_RCC_USART10_CLKSOURCE))
123 
124 #define IS_LL_RCC_XSPI_CLKSOURCE(__VALUE__)   (((__VALUE__) == LL_RCC_XSPI1_CLKSOURCE) \
125                                                || ((__VALUE__) == LL_RCC_XSPI2_CLKSOURCE) \
126                                                || ((__VALUE__) == LL_RCC_XSPI3_CLKSOURCE))
127 
128 /**
129   * @}
130   */
131 
132 /* Private function prototypes -----------------------------------------------*/
133 /** @defgroup RCC_LL_Private_Functions RCC Private functions
134   * @{
135   */
136 static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
137 static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
138 static uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
139 static uint32_t RCC_GetPCLK4ClockFreq(uint32_t HCLK_Frequency);
140 static uint32_t RCC_GetPCLK5ClockFreq(uint32_t HCLK_Frequency);
141 
142 /**
143   * @}
144   */
145 
146 
147 /* Exported functions --------------------------------------------------------*/
148 /** @addtogroup RCC_LL_Exported_Functions
149   * @{
150   */
151 
152 /** @addtogroup RCC_LL_EF_Init
153   * @{
154   */
155 
156 /**
157   * @brief  Resets the RCC clock configuration to the default reset state.
158   * @note   The default reset state of the clock configuration is given below:
159   *            - HSI ON and used as system clock source
160   *            - HSE, PLL1, PLL2 and PLL3 OFF
161   *            - AHB, APB Bus pre-scaler set to 1.
162   *            - CSS, MCO1 and MCO2 OFF
163   *            - All interrupts disabled
164   * @note   This function doesn't modify the configuration of the
165   *            - Peripheral clocks
166   *            - LSI, LSE and RTC clocks
167   * @retval None
168   */
LL_RCC_DeInit(void)169 void LL_RCC_DeInit(void)
170 {
171   /* Disable all interrupts except default one */
172   WRITE_REG(RCC->CIER, RCC_CIER_HSECSSIE);
173 
174   /* Clear all interrupts flags */
175   WRITE_REG(RCC->CICR, RCC_CICR_LSIRDYC | RCC_CICR_LSERDYC | RCC_CICR_MSIRDYC | RCC_CICR_HSIRDYC | RCC_CICR_HSERDYC | \
176             RCC_CICR_PLL1RDYC | RCC_CICR_PLL2RDYC | RCC_CICR_PLL3RDYC | RCC_CICR_PLL4RDYC | \
177             RCC_CICR_LSECSSC | RCC_CICR_HSECSSC | RCC_CICR_WKUPFC);
178 
179   /* Clear reset source flags */
180   SET_BIT(RCC->RSR, RCC_RSR_RMVF);
181 
182   /* Restore default HSI */
183   LL_RCC_HSI_SetDivider(LL_RCC_HSI_DIV_1);
184   LL_RCC_HSI_Enable();
185 
186   /* Wait for HSI READY bit */
187   while (LL_RCC_HSI_IsReady() == 0U)
188   {}
189 
190   /* Reset CFGR1 register to select HSI as system clock */
191   CLEAR_REG(RCC->CFGR1);
192 
193   /* Reset MSION, HSEON, PLL1ON, PLL2ON, PLL3ON and PLL4ON bits */
194   WRITE_REG(RCC->CCR, RCC_CCR_MSIONC | RCC_CCR_HSEONC | \
195             RCC_CCR_PLL1ONC | RCC_CCR_PLL2ONC | RCC_CCR_PLL3ONC | RCC_CCR_PLL4ONC);
196 
197   /* Wait for PLL1 READY bit to be reset */
198   while (LL_RCC_PLL1_IsReady() != 0U)
199   {}
200 
201   /* Wait for PLL2 READY bit to be reset */
202   while (LL_RCC_PLL2_IsReady() != 0U)
203   {}
204 
205   /* Wait for PLL3 READY bit to be reset */
206   while (LL_RCC_PLL3_IsReady() != 0U)
207   {}
208 
209   /* Wait for PLL4 READY bit to be reset */
210   while (LL_RCC_PLL4_IsReady() != 0U)
211   {}
212 
213   /* Reset prescalers in CFGR2 register */
214   CLEAR_REG(RCC->CFGR2);
215 
216   /* Reset LSECFGR register */
217   CLEAR_REG(RCC->LSECFGR);
218 
219   /* Reset MSICFGR register */
220   CLEAR_REG(RCC->MSICFGR);
221 
222   /* Reset HSIMCR register to default value */
223   WRITE_REG(RCC->HSIMCR, 0x001F07A1U);
224 
225   /* Reset HSECFGR register to default value */
226   WRITE_REG(RCC->HSECFGR, 0x00000800U);
227 
228   /* Reset STOPCR register to default value */
229   WRITE_REG(RCC->STOPCR, 0x00000008U);
230 
231   /* Reset PLL1 registers to default value */
232   WRITE_REG(RCC->PLL1CFGR1, 0x08202500U);
233   WRITE_REG(RCC->PLL1CFGR2, 0x00800000U);
234   WRITE_REG(RCC->PLL1CFGR3, 0x4900000DU);
235   /* Reset PLL2 registers to default value */
236   WRITE_REG(RCC->PLL2CFGR1, 0x08000000U);
237   WRITE_REG(RCC->PLL2CFGR2, 0x00000000U);
238   WRITE_REG(RCC->PLL2CFGR3, 0x49000005U);
239   /* Reset PLL3 registers to default value */
240   WRITE_REG(RCC->PLL3CFGR1, 0x08000000U);
241   WRITE_REG(RCC->PLL3CFGR2, 0x00000000U);
242   WRITE_REG(RCC->PLL3CFGR3, 0x49000005U);
243   /* Reset PLL4 registers to default value */
244   WRITE_REG(RCC->PLL4CFGR1, 0x08000000U);
245   WRITE_REG(RCC->PLL4CFGR2, 0x00000000U);
246   WRITE_REG(RCC->PLL4CFGR3, 0x49000005U);
247 
248   /* Disable DIVENR register to set ICx state to default value */
249   WRITE_REG(RCC->DIVENCR, 0x00FFFFFFU);
250 
251   /* ICxCFGR reset value */
252   WRITE_REG(RCC->IC1CFGR, 0x00020000U);
253   WRITE_REG(RCC->IC2CFGR, 0x00030000U);
254   WRITE_REG(RCC->IC3CFGR, 0x00000000U);
255   WRITE_REG(RCC->IC4CFGR, 0x00000000U);
256   WRITE_REG(RCC->IC5CFGR, 0x00000000U);
257   WRITE_REG(RCC->IC6CFGR, 0x00030000U);
258   WRITE_REG(RCC->IC7CFGR, 0x10000000U);
259   WRITE_REG(RCC->IC8CFGR, 0x10000000U);
260   WRITE_REG(RCC->IC9CFGR, 0x10000000U);
261   WRITE_REG(RCC->IC10CFGR, 0x10000000U);
262   WRITE_REG(RCC->IC11CFGR, 0x00030000U);
263   WRITE_REG(RCC->IC12CFGR, 0x20000000U);
264   WRITE_REG(RCC->IC13CFGR, 0x20000000U);
265   WRITE_REG(RCC->IC14CFGR, 0x20000000U);
266   WRITE_REG(RCC->IC15CFGR, 0x20000000U);
267   WRITE_REG(RCC->IC16CFGR, 0x30000000U);
268   WRITE_REG(RCC->IC17CFGR, 0x30000000U);
269   WRITE_REG(RCC->IC18CFGR, 0x30000000U);
270   WRITE_REG(RCC->IC19CFGR, 0x30000000U);
271   WRITE_REG(RCC->IC20CFGR, 0x30000000U);
272 
273   /* CCIPRx reset value except RTCSEL/RTCPRE preserved */
274   WRITE_REG(RCC->CCIPR1, 0x00000000U);
275   WRITE_REG(RCC->CCIPR2, 0x00000000U);
276   WRITE_REG(RCC->CCIPR3, 0x00000001U);
277   WRITE_REG(RCC->CCIPR4, 0x00000000U);
278   WRITE_REG(RCC->CCIPR5, 0x0000F0F0U);
279   WRITE_REG(RCC->CCIPR6, 0x00000000U);
280   MODIFY_REG(RCC->CCIPR7, RCC_CCIPR7_PERSEL | RCC_CCIPR7_PSSISEL | \
281              RCC_CCIPR7_SAI1SEL | RCC_CCIPR7_SAI2SEL, 0x00000000U);
282   WRITE_REG(RCC->CCIPR8, 0x00000000U);
283   WRITE_REG(RCC->CCIPR9, 0x00000000U);
284   WRITE_REG(RCC->CCIPR12, 0x00000000U);
285   WRITE_REG(RCC->CCIPR13, 0x00000000U);
286   WRITE_REG(RCC->CCIPR14, 0x00000000U);
287 
288   /* Reset MEMENR register to default value */
289   WRITE_REG(RCC->MEMENR, 0x000013FFU);
290 
291   /* Reset MISCENR register */
292   CLEAR_REG(RCC->MISCENR);
293 }
294 
295 /**
296   * @}
297   */
298 
299 /** @addtogroup RCC_LL_EF_Get_Freq
300   * @brief  Return the frequencies of different on chip clocks;  System, AHB, APB1, APB2, APB3 and APB4 buses clocks.
301   *         and different peripheral clocks available on the device.
302   * @note   If SYSCLK source is HSI, function returns values based on HSI_VALUE(*)
303   * @note   If SYSCLK source is HSE, function returns values based on HSE_VALUE(**)
304   * @note   If SYSCLK source is MSI, function returns values based on MSI_VALUE(***)
305   * @note   If SYSCLK source is PLL, function returns values based on HSE_VALUE(**)
306   *         or HSI_VALUE(*) multiplied/divided by the PLL factors.
307   * @note   (*) HSI_VALUE is a constant defined in header file (default value
308   *             64 MHz) divider by HSIDIV, but the real value may vary depending on
309   *             on the variations in voltage and temperature.
310   * @note   (**) HSE_VALUE is a constant defined in header file (default value
311   *              25 MHz), user has to ensure that HSE_VALUE is same as the real
312   *              frequency of the crystal used. Otherwise, this function may
313   *              have wrong result.
314   * @note   (***) MSI_VALUE is a constant defined in header file (default value
315   *               4 MHz) but the real value may vary depending on the variations
316   *               in voltage and temperature.
317   * @note   The result of this function could be incorrect when using fractional
318   *         value for HSE crystal.
319   * @note   This function can be used by the user application to compute the
320   *         baud-rate for the communication peripherals or configure other parameters.
321   * @{
322   */
323 
324 /**
325   * @brief  Return the frequencies of different on chip clocks;  CPU, System bus, AHB, APB1, APB2, APB4
326   *         and APB5 buses clocks.
327   * @note   Each time CPUCLK, SYSCLK, HCLK, PCLK1, PCLK2, PCLK4 and/or PCLK5 clock changes, this function
328   *         must be called to update application structure fields. Otherwise, any configuration based on this
329   *         function will be incorrect.
330   * @param  RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
331   * @retval None
332   */
LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef * RCC_Clocks)333 void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks)
334 {
335   /* Get CPU frequency */
336   RCC_Clocks->CPUCLK_Frequency = LL_RCC_GetCpuClockFreq();
337 
338   /* Get SYSCLK frequency */
339   RCC_Clocks->SYSCLK_Frequency = LL_RCC_GetSystemClockFreq();
340 
341   /* HCLK clock frequency */
342   RCC_Clocks->HCLK_Frequency   = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
343 
344   /* PCLK1 clock frequency */
345   RCC_Clocks->PCLK1_Frequency  = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
346 
347   /* PCLK2 clock frequency */
348   RCC_Clocks->PCLK2_Frequency  = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency);
349 
350   /* PCLK4 clock frequency */
351   RCC_Clocks->PCLK4_Frequency  = RCC_GetPCLK4ClockFreq(RCC_Clocks->HCLK_Frequency);
352 
353   /* PCLK5 clock frequency */
354   RCC_Clocks->PCLK5_Frequency  = RCC_GetPCLK5ClockFreq(RCC_Clocks->HCLK_Frequency);
355 }
356 
357 /**
358   * @brief  Return CPU clock frequency
359   * @retval CPU clock frequency (in Hz)
360   */
LL_RCC_GetCpuClockFreq(void)361 uint32_t LL_RCC_GetCpuClockFreq(void)
362 {
363   uint32_t frequency = 0U;
364   uint32_t ic_divider;
365 
366   /* Get CPU clock source ----------------------------------------------------*/
367   switch (LL_RCC_GetCpuClkSource())
368   {
369     /* No check on Ready: Won't be selected by hardware if not */
370     case LL_RCC_CPU_CLKSOURCE_STATUS_HSI:
371       frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
372       break;
373 
374     case LL_RCC_CPU_CLKSOURCE_STATUS_MSI:
375       frequency = MSI_VALUE;
376       break;
377 
378     case LL_RCC_CPU_CLKSOURCE_STATUS_HSE:
379       frequency = HSE_VALUE;
380       break;
381 
382     case LL_RCC_CPU_CLKSOURCE_STATUS_IC1:
383       ic_divider = LL_RCC_IC1_GetDivider();
384       switch (LL_RCC_IC1_GetSource())
385       {
386         case LL_RCC_ICCLKSOURCE_PLL1:
387           frequency = LL_RCC_GetPLL1ClockFreq();
388           frequency = frequency / ic_divider;
389           break;
390         case LL_RCC_ICCLKSOURCE_PLL2:
391           frequency = LL_RCC_GetPLL2ClockFreq();
392           frequency = frequency / ic_divider;
393           break;
394         case LL_RCC_ICCLKSOURCE_PLL3:
395           frequency = LL_RCC_GetPLL3ClockFreq();
396           frequency = frequency / ic_divider;
397           break;
398         case LL_RCC_ICCLKSOURCE_PLL4:
399           frequency = LL_RCC_GetPLL4ClockFreq();
400           frequency = frequency / ic_divider;
401           break;
402         default:
403           /* Unexpected case */
404           break;
405       }
406       break;
407 
408     default:
409       /* Unexpected case */
410       break;
411   }
412 
413   return frequency;
414 }
415 
416 /**
417   * @brief  Return SYSTEM bus clock frequency
418   * @retval SYSTEM bus clock frequency (in Hz)
419   */
LL_RCC_GetSystemClockFreq(void)420 uint32_t LL_RCC_GetSystemClockFreq(void)
421 {
422   uint32_t frequency = 0U;
423   uint32_t ic_divider;
424 
425   /* Get SYSCLK source -------------------------------------------------------*/
426   switch (LL_RCC_GetSysClkSource())
427   {
428     /* No check on Ready: Won't be selected by hardware if not */
429     case LL_RCC_SYS_CLKSOURCE_STATUS_HSI:
430       frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
431       break;
432 
433     case LL_RCC_SYS_CLKSOURCE_STATUS_MSI:
434       frequency = MSI_VALUE;
435       break;
436 
437     case LL_RCC_SYS_CLKSOURCE_STATUS_HSE:
438       frequency = HSE_VALUE;
439       break;
440 
441     case LL_RCC_SYS_CLKSOURCE_STATUS_IC2_IC6_IC11:
442       ic_divider = LL_RCC_IC2_GetDivider();
443       switch (LL_RCC_IC2_GetSource())
444       {
445         case LL_RCC_ICCLKSOURCE_PLL1:
446           frequency = LL_RCC_GetPLL1ClockFreq();
447           frequency = frequency / ic_divider;
448           break;
449         case LL_RCC_ICCLKSOURCE_PLL2:
450           frequency = LL_RCC_GetPLL2ClockFreq();
451           frequency = frequency / ic_divider;
452           break;
453         case LL_RCC_ICCLKSOURCE_PLL3:
454           frequency = LL_RCC_GetPLL3ClockFreq();
455           frequency = frequency / ic_divider;
456           break;
457         case LL_RCC_ICCLKSOURCE_PLL4:
458           frequency = LL_RCC_GetPLL4ClockFreq();
459           frequency = frequency / ic_divider;
460           break;
461         default:
462           /* Unexpected case */
463           break;
464       }
465       break;
466 
467     default:
468       /* Unexpected case */
469       break;
470   }
471 
472   return frequency;
473 }
474 
475 /**
476   * @brief  Return PLL1 clock frequency
477   * @note   LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
478   * @retval PLL1 output clock frequency
479   */
LL_RCC_GetPLL1ClockFreq(void)480 uint32_t LL_RCC_GetPLL1ClockFreq(void)
481 {
482   uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
483   uint32_t plloutputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
484   uint32_t pllsource;
485   uint32_t divm;
486 
487   /* PLL_VCO = (HSE_VALUE, MSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
488      SYSCLK = PLL_VCO / PLLP1 / PLLP2
489   */
490   if (LL_RCC_PLL1_IsReady() != 0U)
491   {
492     if (LL_RCC_PLL1P_IsEnabled() != 0U)
493     {
494       pllsource = LL_RCC_PLL1_GetSource();
495 
496       switch (pllsource)
497       {
498         case LL_RCC_PLLSOURCE_HSI:
499           if (LL_RCC_HSI_IsReady() != 0U)
500           {
501             pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
502           }
503           break;
504 
505         case LL_RCC_PLLSOURCE_MSI:
506           if (LL_RCC_MSI_IsReady() != 0U)
507           {
508             pllinputfreq = MSI_VALUE;
509           }
510           break;
511 
512         case LL_RCC_PLLSOURCE_HSE:
513           if (LL_RCC_HSE_IsReady() != 0U)
514           {
515             pllinputfreq = HSE_VALUE;
516           }
517           break;
518 
519         case LL_RCC_PLLSOURCE_I2S_CKIN:
520           pllinputfreq = EXTERNAL_CLOCK_VALUE;
521           break;
522 
523         default:
524           /* unexpected case */
525           break;
526       }
527 
528       if (pllinputfreq != LL_RCC_PERIPH_FREQUENCY_NO)
529       {
530 #if defined(USE_FPGA)
531         /**** FPGA PLL input forced to 32MHz *****/
532         pllinputfreq = PLL_SOURCE_FREQ;
533 #endif /* USE_FPGA */
534         /* INTEGER mode only  - others TO DO */
535         divm = LL_RCC_PLL1_GetM();
536 
537         if (divm != 0U)
538         {
539           plloutputfreq = LL_RCC_CalcPLLClockFreq(pllinputfreq, divm, LL_RCC_PLL1_GetN(), LL_RCC_PLL1_GetFRACN(), \
540                                                   LL_RCC_PLL1_GetP1(), LL_RCC_PLL1_GetP2());
541         }
542       }
543     }
544   }
545 
546   return plloutputfreq;
547 }
548 
549 /**
550   * @brief  Return PLL2 clock frequency
551   * @note   LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
552   * @retval PLL2 output clock frequency
553   */
LL_RCC_GetPLL2ClockFreq(void)554 uint32_t LL_RCC_GetPLL2ClockFreq(void)
555 {
556   uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
557   uint32_t plloutputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
558   uint32_t pllsource;
559   uint32_t divm;
560 
561   /* PLL_VCO = (HSE_VALUE, MSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
562      SYSCLK = PLL_VCO / PLLP1 / PLLP2
563   */
564   if (LL_RCC_PLL2_IsReady() != 0U)
565   {
566     if (LL_RCC_PLL2P_IsEnabled() != 0U)
567     {
568       pllsource = LL_RCC_PLL2_GetSource();
569 
570       switch (pllsource)
571       {
572         case LL_RCC_PLLSOURCE_HSI:
573           if (LL_RCC_HSI_IsReady() != 0U)
574           {
575             pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
576           }
577           break;
578 
579         case LL_RCC_PLLSOURCE_MSI:
580           if (LL_RCC_MSI_IsReady() != 0U)
581           {
582             pllinputfreq = MSI_VALUE;
583           }
584           break;
585 
586         case LL_RCC_PLLSOURCE_HSE:
587           if (LL_RCC_HSE_IsReady() != 0U)
588           {
589             pllinputfreq = HSE_VALUE;
590           }
591           break;
592 
593         case LL_RCC_PLLSOURCE_I2S_CKIN:
594           pllinputfreq = EXTERNAL_CLOCK_VALUE;
595           break;
596 
597         default:
598           /* unexpected case */
599           break;
600       }
601 
602       if (pllinputfreq != LL_RCC_PERIPH_FREQUENCY_NO)
603       {
604 #if defined(USE_FPGA)
605         /**** FPGA PLL input forced to 32MHz *****/
606         pllinputfreq = PLL_SOURCE_FREQ;
607 #endif /* USE_FPGA */
608         /* INTEGER mode only  - others TO DO */
609         divm = LL_RCC_PLL2_GetM();
610 
611         if (divm != 0U)
612         {
613           plloutputfreq = LL_RCC_CalcPLLClockFreq(pllinputfreq, divm, LL_RCC_PLL2_GetN(), LL_RCC_PLL2_GetFRACN(), \
614                                                   LL_RCC_PLL2_GetP1(), LL_RCC_PLL2_GetP2());
615         }
616       }
617     }
618   }
619 
620   return plloutputfreq;
621 }
622 
623 /**
624   * @brief  Return PLL3 clock frequency
625   * @note   LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
626   * @retval PLL3 output clock frequency
627   */
LL_RCC_GetPLL3ClockFreq(void)628 uint32_t LL_RCC_GetPLL3ClockFreq(void)
629 {
630   uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
631   uint32_t plloutputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
632   uint32_t pllsource;
633   uint32_t divm;
634 
635   /* PLL_VCO = (HSE_VALUE, MSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
636      SYSCLK = PLL_VCO / PLLP1 / PLLP2
637   */
638   if (LL_RCC_PLL3_IsReady() != 0U)
639   {
640     if (LL_RCC_PLL3P_IsEnabled() != 0U)
641     {
642       pllsource = LL_RCC_PLL3_GetSource();
643 
644       switch (pllsource)
645       {
646         case LL_RCC_PLLSOURCE_HSI:
647           if (LL_RCC_HSI_IsReady() != 0U)
648           {
649             pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
650           }
651           break;
652 
653         case LL_RCC_PLLSOURCE_MSI:
654           if (LL_RCC_MSI_IsReady() != 0U)
655           {
656             pllinputfreq = MSI_VALUE;
657           }
658           break;
659 
660         case LL_RCC_PLLSOURCE_HSE:
661           if (LL_RCC_HSE_IsReady() != 0U)
662           {
663             pllinputfreq = HSE_VALUE;
664           }
665           break;
666 
667         case LL_RCC_PLLSOURCE_I2S_CKIN:
668           pllinputfreq = EXTERNAL_CLOCK_VALUE;
669           break;
670 
671         default:
672           /* unexpected case */
673           break;
674       }
675 
676       if (pllinputfreq != LL_RCC_PERIPH_FREQUENCY_NO)
677       {
678 #if defined(USE_FPGA)
679         /**** FPGA PLL input forced to 32MHz *****/
680         pllinputfreq = PLL_SOURCE_FREQ;
681 #endif /* USE_FPGA */
682         /* INTEGER mode only  - others TO DO */
683         divm = LL_RCC_PLL3_GetM();
684 
685         if (divm != 0U)
686         {
687           plloutputfreq = LL_RCC_CalcPLLClockFreq(pllinputfreq, divm, LL_RCC_PLL3_GetN(), LL_RCC_PLL3_GetFRACN(), \
688                                                   LL_RCC_PLL3_GetP1(), LL_RCC_PLL3_GetP2());
689         }
690       }
691     }
692   }
693 
694   return plloutputfreq;
695 }
696 
697 /**
698   * @brief  Return PLL4 clock frequency
699   * @note   LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
700   * @retval PLL4 output clock frequency
701   */
LL_RCC_GetPLL4ClockFreq(void)702 uint32_t LL_RCC_GetPLL4ClockFreq(void)
703 {
704   uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
705   uint32_t plloutputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
706   uint32_t pllsource;
707   uint32_t divm;
708 
709   /* PLL_VCO = (HSE_VALUE, MSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
710      SYSCLK = PLL_VCO / PLLP1 / PLLP2
711   */
712   if (LL_RCC_PLL4_IsReady() != 0U)
713   {
714     if (LL_RCC_PLL4P_IsEnabled() != 0U)
715     {
716       pllsource = LL_RCC_PLL4_GetSource();
717 
718       switch (pllsource)
719       {
720         case LL_RCC_PLLSOURCE_HSI:
721           if (LL_RCC_HSI_IsReady() != 0U)
722           {
723             pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
724           }
725           break;
726 
727         case LL_RCC_PLLSOURCE_MSI:
728           if (LL_RCC_MSI_IsReady() != 0U)
729           {
730             pllinputfreq = MSI_VALUE;
731           }
732           break;
733 
734         case LL_RCC_PLLSOURCE_HSE:
735           if (LL_RCC_HSE_IsReady() != 0U)
736           {
737             pllinputfreq = HSE_VALUE;
738           }
739           break;
740 
741         case LL_RCC_PLLSOURCE_I2S_CKIN:
742           pllinputfreq = EXTERNAL_CLOCK_VALUE;
743           break;
744 
745         default:
746           /* unexpected case */
747           break;
748       }
749 
750       if (pllinputfreq != LL_RCC_PERIPH_FREQUENCY_NO)
751       {
752 #if defined(USE_FPGA)
753         /**** FPGA PLL input forced to 32MHz *****/
754         pllinputfreq = PLL_SOURCE_FREQ;
755 #endif /* USE_FPGA */
756         /* INTEGER mode only  - others TO DO */
757         divm = LL_RCC_PLL4_GetM();
758 
759         if (divm != 0U)
760         {
761           plloutputfreq = LL_RCC_CalcPLLClockFreq(pllinputfreq, divm, LL_RCC_PLL4_GetN(), LL_RCC_PLL4_GetFRACN(), \
762                                                   LL_RCC_PLL4_GetP1(), LL_RCC_PLL4_GetP2());
763         }
764       }
765     }
766   }
767 
768   return plloutputfreq;
769 }
770 
771 /**
772   * @brief  Helper function to calculate the PLL frequency output when used in integer or fractional mode
773   * @note ex: @ref LL_RCC_CalcPLLClockFreq (HSE_VALUE, @ref LL_RCC_PLL1_GetM (), @ref LL_RCC_PLL1_GetN (),
774   *           @ref LL_RCC_PLL1_GetFRACN (), @ref LL_RCC_PLL1_GetP1 (), @ref LL_RCC_PLL1_GetP2 ());
775   * @param  PLLInputFreq PLL Input frequency (based on HSE/(HSI/HSIDIV)/MSI)
776   * @param  M      Between 1 and 63
777   * @param  N      Between 16 and 640 in integer mode, 20 to 320 in fractional mode
778   * @param  FRACN  0 in integer mode, between 0 and 0xFFFFFF in fractional mode
779   * @param  P1     VCO output divider P1 between 1 and 7
780   * @param  P2     VCO output divider P2 between 1 and 7
781   * @retval PLL clock frequency (in Hz)
782   */
LL_RCC_CalcPLLClockFreq(uint32_t PLLInputFreq,uint32_t M,uint32_t N,uint32_t FRACN,uint32_t P1,uint32_t P2)783 uint32_t LL_RCC_CalcPLLClockFreq(uint32_t PLLInputFreq, uint32_t M, uint32_t N, uint32_t FRACN, uint32_t P1,
784                                  uint32_t P2)
785 {
786   float_t freq;
787 
788   freq = ((float_t)PLLInputFreq * ((float_t)N + ((float_t)FRACN / (float_t)0x1000000))) / (float_t)M;
789 
790   freq = freq / (float_t)P1;
791   freq = freq / (float_t)P2;
792 
793   return (uint32_t)freq;
794 }
795 
796 /**
797   * @brief  Return ADC clock frequency
798   * @param  ADCxSource This parameter can be one of the following values:
799   *         @arg @ref LL_RCC_ADC_CLKSOURCE
800   * @retval ADC clock frequency (in Hz)
801   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
802   */
LL_RCC_GetADCClockFreq(uint32_t ADCxSource)803 uint32_t LL_RCC_GetADCClockFreq(uint32_t ADCxSource)
804 {
805   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
806   uint32_t ic_divider;
807 
808   /* Check parameter */
809   assert_param(IS_LL_RCC_ADC_CLKSOURCE(ADCxSource));
810 
811   switch (LL_RCC_GetADCClockSource(ADCxSource))
812   {
813     case LL_RCC_ADC_CLKSOURCE_HCLK:
814       frequency = RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq());
815       break;
816 
817     case LL_RCC_ADC_CLKSOURCE_CLKP:
818       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
819       break;
820 
821     case LL_RCC_ADC_CLKSOURCE_IC7:
822       if (LL_RCC_IC7_IsEnabled() != 0U)
823       {
824         ic_divider = LL_RCC_IC7_GetDivider();
825         switch (LL_RCC_IC7_GetSource())
826         {
827           case LL_RCC_ICCLKSOURCE_PLL1:
828             frequency = LL_RCC_GetPLL1ClockFreq();
829             frequency = frequency / ic_divider;
830             break;
831           case LL_RCC_ICCLKSOURCE_PLL2:
832             frequency = LL_RCC_GetPLL2ClockFreq();
833             frequency = frequency / ic_divider;
834             break;
835           case LL_RCC_ICCLKSOURCE_PLL3:
836             frequency = LL_RCC_GetPLL3ClockFreq();
837             frequency = frequency / ic_divider;
838             break;
839           case LL_RCC_ICCLKSOURCE_PLL4:
840             frequency = LL_RCC_GetPLL4ClockFreq();
841             frequency = frequency / ic_divider;
842             break;
843           default:
844             /* Unexpected case */
845             break;
846         }
847       }
848       break;
849 
850     case LL_RCC_ADC_CLKSOURCE_IC8:
851       if (LL_RCC_IC8_IsEnabled() != 0U)
852       {
853         ic_divider = LL_RCC_IC8_GetDivider();
854         switch (LL_RCC_IC8_GetSource())
855         {
856           case LL_RCC_ICCLKSOURCE_PLL1:
857             frequency = LL_RCC_GetPLL1ClockFreq();
858             frequency = frequency / ic_divider;
859             break;
860           case LL_RCC_ICCLKSOURCE_PLL2:
861             frequency = LL_RCC_GetPLL2ClockFreq();
862             frequency = frequency / ic_divider;
863             break;
864           case LL_RCC_ICCLKSOURCE_PLL3:
865             frequency = LL_RCC_GetPLL3ClockFreq();
866             frequency = frequency / ic_divider;
867             break;
868           case LL_RCC_ICCLKSOURCE_PLL4:
869             frequency = LL_RCC_GetPLL4ClockFreq();
870             frequency = frequency / ic_divider;
871             break;
872           default:
873             /* Unexpected case */
874             break;
875         }
876       }
877       break;
878 
879     case LL_RCC_ADC_CLKSOURCE_HSI:
880       if (LL_RCC_HSI_IsReady() != 0U)
881       {
882         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
883       }
884       break;
885 
886     case LL_RCC_ADC_CLKSOURCE_MSI:
887       if (LL_RCC_MSI_IsReady() != 0U)
888       {
889         frequency = MSI_VALUE;
890       }
891       break;
892 
893     case LL_RCC_ADC_CLKSOURCE_I2S_CKIN:
894       frequency = EXTERNAL_CLOCK_VALUE;
895       break;
896 
897     case LL_RCC_ADC_CLKSOURCE_TIMG:
898       frequency = LL_RCC_GetSystemClockFreq() / (1UL << LL_RCC_GetTIMPrescaler());
899       break;
900 
901     default:
902       /* Unexpected case */
903       break;
904   }
905 
906   return frequency;
907 }
908 
909 /**
910   * @brief  Return ADFx clock frequency
911   * @param  ADFxSource This parameter can be one of the following values:
912   *         @arg @ref LL_RCC_ADF1_CLKSOURCE
913   * @retval ADF clock frequency (in Hz)
914   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
915   */
LL_RCC_GetADFClockFreq(uint32_t ADFxSource)916 uint32_t LL_RCC_GetADFClockFreq(uint32_t ADFxSource)
917 {
918   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
919   uint32_t ic_divider;
920 
921   /* Check parameter */
922   assert_param(IS_LL_RCC_ADF_CLKSOURCE(ADFxSource));
923 
924   switch (LL_RCC_GetADFClockSource(ADFxSource))
925   {
926     case LL_RCC_ADF1_CLKSOURCE_HCLK:
927       frequency = RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq());
928       break;
929 
930     case LL_RCC_ADF1_CLKSOURCE_CLKP:
931       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
932       break;
933 
934     case LL_RCC_ADF1_CLKSOURCE_IC7:
935       if (LL_RCC_IC7_IsEnabled() != 0U)
936       {
937         ic_divider = LL_RCC_IC7_GetDivider();
938         switch (LL_RCC_IC7_GetSource())
939         {
940           case LL_RCC_ICCLKSOURCE_PLL1:
941             frequency = LL_RCC_GetPLL1ClockFreq();
942             frequency = frequency / ic_divider;
943             break;
944           case LL_RCC_ICCLKSOURCE_PLL2:
945             frequency = LL_RCC_GetPLL2ClockFreq();
946             frequency = frequency / ic_divider;
947             break;
948           case LL_RCC_ICCLKSOURCE_PLL3:
949             frequency = LL_RCC_GetPLL3ClockFreq();
950             frequency = frequency / ic_divider;
951             break;
952           case LL_RCC_ICCLKSOURCE_PLL4:
953             frequency = LL_RCC_GetPLL4ClockFreq();
954             frequency = frequency / ic_divider;
955             break;
956           default:
957             /* Unexpected case */
958             break;
959         }
960       }
961       break;
962 
963     case LL_RCC_ADF1_CLKSOURCE_IC8:
964       if (LL_RCC_IC8_IsEnabled() != 0U)
965       {
966         ic_divider = LL_RCC_IC8_GetDivider();
967         switch (LL_RCC_IC8_GetSource())
968         {
969           case LL_RCC_ICCLKSOURCE_PLL1:
970             frequency = LL_RCC_GetPLL1ClockFreq();
971             frequency = frequency / ic_divider;
972             break;
973           case LL_RCC_ICCLKSOURCE_PLL2:
974             frequency = LL_RCC_GetPLL2ClockFreq();
975             frequency = frequency / ic_divider;
976             break;
977           case LL_RCC_ICCLKSOURCE_PLL3:
978             frequency = LL_RCC_GetPLL3ClockFreq();
979             frequency = frequency / ic_divider;
980             break;
981           case LL_RCC_ICCLKSOURCE_PLL4:
982             frequency = LL_RCC_GetPLL4ClockFreq();
983             frequency = frequency / ic_divider;
984             break;
985           default:
986             /* Unexpected case */
987             break;
988         }
989       }
990       break;
991 
992     case LL_RCC_ADF1_CLKSOURCE_HSI:
993       if (LL_RCC_HSI_IsReady() != 0U)
994       {
995         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
996       }
997       break;
998 
999     case LL_RCC_ADF1_CLKSOURCE_MSI:
1000       if (LL_RCC_MSI_IsReady() != 0U)
1001       {
1002         frequency = MSI_VALUE;
1003       }
1004       break;
1005 
1006     case LL_RCC_ADF1_CLKSOURCE_I2S_CKIN:
1007       frequency = EXTERNAL_CLOCK_VALUE;
1008       break;
1009 
1010     case LL_RCC_ADF1_CLKSOURCE_TIMG:
1011       frequency = LL_RCC_GetSystemClockFreq() / (1UL << LL_RCC_GetTIMPrescaler());
1012       break;
1013 
1014     default:
1015       /* Unexpected case */
1016       break;
1017   }
1018 
1019   return frequency;
1020 }
1021 
1022 /**
1023   * @brief  Return CLKP clock frequency
1024   * @param  CLKPxSource This parameter can be one of the following values:
1025   *         @arg @ref LL_RCC_CLKP_CLKSOURCE
1026   * @retval CLKP clock frequency (in Hz)
1027   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
1028   */
LL_RCC_GetCLKPClockFreq(uint32_t CLKPxSource)1029 uint32_t LL_RCC_GetCLKPClockFreq(uint32_t CLKPxSource)
1030 {
1031   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1032   uint32_t ic_divider;
1033 
1034   switch (LL_RCC_GetCLKPClockSource(CLKPxSource))
1035   {
1036     case LL_RCC_CLKP_CLKSOURCE_HSI:
1037       if (LL_RCC_HSI_IsReady() != 0U)
1038       {
1039         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
1040       }
1041       break;
1042 
1043     case LL_RCC_CLKP_CLKSOURCE_MSI:
1044       if (LL_RCC_MSI_IsReady() != 0U)
1045       {
1046         frequency = MSI_VALUE;
1047       }
1048       break;
1049 
1050     case LL_RCC_CLKP_CLKSOURCE_HSE:
1051       if (LL_RCC_HSE_IsReady() != 0U)
1052       {
1053         frequency = HSE_VALUE;
1054       }
1055       break;
1056 
1057     case LL_RCC_CLKP_CLKSOURCE_IC5:
1058       if (LL_RCC_IC5_IsEnabled() != 0U)
1059       {
1060         ic_divider = LL_RCC_IC5_GetDivider();
1061         switch (LL_RCC_IC5_GetSource())
1062         {
1063           case LL_RCC_ICCLKSOURCE_PLL1:
1064             frequency = LL_RCC_GetPLL1ClockFreq();
1065             frequency = frequency / ic_divider;
1066             break;
1067           case LL_RCC_ICCLKSOURCE_PLL2:
1068             frequency = LL_RCC_GetPLL2ClockFreq();
1069             frequency = frequency / ic_divider;
1070             break;
1071           case LL_RCC_ICCLKSOURCE_PLL3:
1072             frequency = LL_RCC_GetPLL3ClockFreq();
1073             frequency = frequency / ic_divider;
1074             break;
1075           case LL_RCC_ICCLKSOURCE_PLL4:
1076             frequency = LL_RCC_GetPLL4ClockFreq();
1077             frequency = frequency / ic_divider;
1078             break;
1079           default:
1080             /* Unexpected case */
1081             break;
1082         }
1083       }
1084       break;
1085 
1086     case LL_RCC_CLKP_CLKSOURCE_IC10:
1087       if (LL_RCC_IC10_IsEnabled() != 0U)
1088       {
1089         ic_divider = LL_RCC_IC10_GetDivider();
1090         switch (LL_RCC_IC10_GetSource())
1091         {
1092           case LL_RCC_ICCLKSOURCE_PLL1:
1093             frequency = LL_RCC_GetPLL1ClockFreq();
1094             frequency = frequency / ic_divider;
1095             break;
1096           case LL_RCC_ICCLKSOURCE_PLL2:
1097             frequency = LL_RCC_GetPLL2ClockFreq();
1098             frequency = frequency / ic_divider;
1099             break;
1100           case LL_RCC_ICCLKSOURCE_PLL3:
1101             frequency = LL_RCC_GetPLL3ClockFreq();
1102             frequency = frequency / ic_divider;
1103             break;
1104           case LL_RCC_ICCLKSOURCE_PLL4:
1105             frequency = LL_RCC_GetPLL4ClockFreq();
1106             frequency = frequency / ic_divider;
1107             break;
1108           default:
1109             /* Unexpected case */
1110             break;
1111         }
1112       }
1113       break;
1114 
1115     case LL_RCC_CLKP_CLKSOURCE_IC15:
1116       if (LL_RCC_IC15_IsEnabled() != 0U)
1117       {
1118         ic_divider = LL_RCC_IC15_GetDivider();
1119         switch (LL_RCC_IC15_GetSource())
1120         {
1121           case LL_RCC_ICCLKSOURCE_PLL1:
1122             frequency = LL_RCC_GetPLL1ClockFreq();
1123             frequency = frequency / ic_divider;
1124             break;
1125           case LL_RCC_ICCLKSOURCE_PLL2:
1126             frequency = LL_RCC_GetPLL2ClockFreq();
1127             frequency = frequency / ic_divider;
1128             break;
1129           case LL_RCC_ICCLKSOURCE_PLL3:
1130             frequency = LL_RCC_GetPLL3ClockFreq();
1131             frequency = frequency / ic_divider;
1132             break;
1133           case LL_RCC_ICCLKSOURCE_PLL4:
1134             frequency = LL_RCC_GetPLL4ClockFreq();
1135             frequency = frequency / ic_divider;
1136             break;
1137           default:
1138             /* Unexpected case */
1139             break;
1140         }
1141       }
1142       break;
1143 
1144     case LL_RCC_CLKP_CLKSOURCE_IC19:
1145       if (LL_RCC_IC19_IsEnabled() != 0U)
1146       {
1147         ic_divider = LL_RCC_IC19_GetDivider();
1148         switch (LL_RCC_IC19_GetSource())
1149         {
1150           case LL_RCC_ICCLKSOURCE_PLL1:
1151             frequency = LL_RCC_GetPLL1ClockFreq();
1152             frequency = frequency / ic_divider;
1153             break;
1154           case LL_RCC_ICCLKSOURCE_PLL2:
1155             frequency = LL_RCC_GetPLL2ClockFreq();
1156             frequency = frequency / ic_divider;
1157             break;
1158           case LL_RCC_ICCLKSOURCE_PLL3:
1159             frequency = LL_RCC_GetPLL3ClockFreq();
1160             frequency = frequency / ic_divider;
1161             break;
1162           case LL_RCC_ICCLKSOURCE_PLL4:
1163             frequency = LL_RCC_GetPLL4ClockFreq();
1164             frequency = frequency / ic_divider;
1165             break;
1166           default:
1167             /* Unexpected case */
1168             break;
1169         }
1170       }
1171       break;
1172 
1173     case LL_RCC_CLKP_CLKSOURCE_IC20:
1174       if (LL_RCC_IC20_IsEnabled() != 0U)
1175       {
1176         ic_divider = LL_RCC_IC20_GetDivider();
1177         switch (LL_RCC_IC20_GetSource())
1178         {
1179           case LL_RCC_ICCLKSOURCE_PLL1:
1180             frequency = LL_RCC_GetPLL1ClockFreq();
1181             frequency = frequency / ic_divider;
1182             break;
1183           case LL_RCC_ICCLKSOURCE_PLL2:
1184             frequency = LL_RCC_GetPLL2ClockFreq();
1185             frequency = frequency / ic_divider;
1186             break;
1187           case LL_RCC_ICCLKSOURCE_PLL3:
1188             frequency = LL_RCC_GetPLL3ClockFreq();
1189             frequency = frequency / ic_divider;
1190             break;
1191           case LL_RCC_ICCLKSOURCE_PLL4:
1192             frequency = LL_RCC_GetPLL4ClockFreq();
1193             frequency = frequency / ic_divider;
1194             break;
1195           default:
1196             /* Unexpected case */
1197             break;
1198         }
1199       }
1200       break;
1201 
1202     default:
1203       /* Unexpected case */
1204       break;
1205   }
1206 
1207   return frequency;
1208 }
1209 
1210 /**
1211   * @brief  Return DCMIPP clock frequency
1212   * @param  DCMIPPxSource This parameter can be one of the following values:
1213   *         @arg @ref LL_RCC_DCMIPP_CLKSOURCE
1214   * @retval DCMIPP clock frequency (in Hz)
1215   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
1216   */
LL_RCC_GetDCMIPPClockFreq(uint32_t DCMIPPxSource)1217 uint32_t LL_RCC_GetDCMIPPClockFreq(uint32_t DCMIPPxSource)
1218 {
1219   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1220   uint32_t ic_divider;
1221 
1222   /* Check parameter */
1223   assert_param(IS_LL_RCC_DCMIPP_CLKSOURCE(DCMIPPxSource));
1224 
1225   switch (LL_RCC_GetDCMIPPClockSource(DCMIPPxSource))
1226   {
1227     case LL_RCC_DCMIPP_CLKSOURCE_PCLK5:
1228       frequency = RCC_GetPCLK5ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
1229       break;
1230 
1231     case LL_RCC_DCMIPP_CLKSOURCE_CLKP:
1232       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
1233       break;
1234 
1235     case LL_RCC_DCMIPP_CLKSOURCE_IC17:
1236       if (LL_RCC_IC17_IsEnabled() != 0U)
1237       {
1238         ic_divider = LL_RCC_IC17_GetDivider();
1239         switch (LL_RCC_IC17_GetSource())
1240         {
1241           case LL_RCC_ICCLKSOURCE_PLL1:
1242             frequency = LL_RCC_GetPLL1ClockFreq();
1243             frequency = frequency / ic_divider;
1244             break;
1245           case LL_RCC_ICCLKSOURCE_PLL2:
1246             frequency = LL_RCC_GetPLL2ClockFreq();
1247             frequency = frequency / ic_divider;
1248             break;
1249           case LL_RCC_ICCLKSOURCE_PLL3:
1250             frequency = LL_RCC_GetPLL3ClockFreq();
1251             frequency = frequency / ic_divider;
1252             break;
1253           case LL_RCC_ICCLKSOURCE_PLL4:
1254             frequency = LL_RCC_GetPLL4ClockFreq();
1255             frequency = frequency / ic_divider;
1256             break;
1257           default:
1258             /* Unexpected case */
1259             break;
1260         }
1261       }
1262       break;
1263 
1264     case LL_RCC_DCMIPP_CLKSOURCE_HSI:
1265       if (LL_RCC_HSI_IsReady() != 0U)
1266       {
1267         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
1268       }
1269       break;
1270 
1271     default:
1272       /* Unexpected case */
1273       break;
1274   }
1275 
1276   return frequency;
1277 }
1278 
1279 /**
1280   * @brief  Return ETH clock frequency
1281   * @param  ETHxSource This parameter can be one of the following values:
1282   *         @arg @ref LL_RCC_ETH1_CLKSOURCE
1283   * @retval ETH1 clock frequency (in Hz)
1284   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
1285   */
LL_RCC_GetETHClockFreq(uint32_t ETHxSource)1286 uint32_t LL_RCC_GetETHClockFreq(uint32_t ETHxSource)
1287 {
1288   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1289   uint32_t ic_divider;
1290 
1291   /* Check parameter */
1292   assert_param(IS_LL_RCC_ETH_CLKSOURCE(ETHxSource));
1293 
1294   switch (LL_RCC_GetETHClockSource(ETHxSource))
1295   {
1296     case LL_RCC_ETH1_CLKSOURCE_HCLK:
1297       frequency = RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq());
1298       break;
1299 
1300     case LL_RCC_ETH1_CLKSOURCE_CLKP:
1301       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
1302       break;
1303 
1304     case LL_RCC_ETH1_CLKSOURCE_IC12:
1305       if (LL_RCC_IC12_IsEnabled() != 0U)
1306       {
1307         ic_divider = LL_RCC_IC12_GetDivider();
1308         switch (LL_RCC_IC12_GetSource())
1309         {
1310           case LL_RCC_ICCLKSOURCE_PLL1:
1311             frequency = LL_RCC_GetPLL1ClockFreq();
1312             frequency = frequency / ic_divider;
1313             break;
1314           case LL_RCC_ICCLKSOURCE_PLL2:
1315             frequency = LL_RCC_GetPLL2ClockFreq();
1316             frequency = frequency / ic_divider;
1317             break;
1318           case LL_RCC_ICCLKSOURCE_PLL3:
1319             frequency = LL_RCC_GetPLL3ClockFreq();
1320             frequency = frequency / ic_divider;
1321             break;
1322           case LL_RCC_ICCLKSOURCE_PLL4:
1323             frequency = LL_RCC_GetPLL4ClockFreq();
1324             frequency = frequency / ic_divider;
1325             break;
1326           default:
1327             /* Unexpected case */
1328             break;
1329         }
1330       }
1331       break;
1332 
1333     case LL_RCC_ETH1_CLKSOURCE_HSE:
1334       if (LL_RCC_HSE_IsReady() != 0U)
1335       {
1336         frequency = HSE_VALUE;
1337       }
1338       break;
1339 
1340     default:
1341       /* Unexpected case */
1342       break;
1343   }
1344 
1345   return frequency;
1346 }
1347 
1348 /**
1349   * @brief  Return ETH PTP clock frequency
1350   * @param  ETHxPTPSource This parameter can be one of the following values:
1351   *         @arg @ref LL_RCC_ETH1PTP_CLKSOURCE
1352   * @retval ETH1 PTP clock frequency with divider (in Hz)
1353   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
1354   */
LL_RCC_GetETHPTPClockFreq(uint32_t ETHxPTPSource)1355 uint32_t LL_RCC_GetETHPTPClockFreq(uint32_t ETHxPTPSource)
1356 {
1357   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1358   uint32_t ic_divider;
1359 
1360   /* Check parameter */
1361   assert_param(IS_LL_RCC_ETHPTP_CLKSOURCE(ETHxPTPSource));
1362 
1363   switch (LL_RCC_GetETHPTPClockSource(ETHxPTPSource))
1364   {
1365     case LL_RCC_ETH1PTP_CLKSOURCE_HCLK:
1366       frequency = RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq());
1367       break;
1368 
1369     case LL_RCC_ETH1PTP_CLKSOURCE_CLKP:
1370       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
1371       break;
1372 
1373     case LL_RCC_ETH1PTP_CLKSOURCE_IC13:
1374       if (LL_RCC_IC13_IsEnabled() != 0U)
1375       {
1376         ic_divider = LL_RCC_IC13_GetDivider();
1377         switch (LL_RCC_IC13_GetSource())
1378         {
1379           case LL_RCC_ICCLKSOURCE_PLL1:
1380             frequency = LL_RCC_GetPLL1ClockFreq();
1381             frequency = frequency / ic_divider;
1382             break;
1383           case LL_RCC_ICCLKSOURCE_PLL2:
1384             frequency = LL_RCC_GetPLL2ClockFreq();
1385             frequency = frequency / ic_divider;
1386             break;
1387           case LL_RCC_ICCLKSOURCE_PLL3:
1388             frequency = LL_RCC_GetPLL3ClockFreq();
1389             frequency = frequency / ic_divider;
1390             break;
1391           case LL_RCC_ICCLKSOURCE_PLL4:
1392             frequency = LL_RCC_GetPLL4ClockFreq();
1393             frequency = frequency / ic_divider;
1394             break;
1395           default:
1396             /* Unexpected case */
1397             break;
1398         }
1399       }
1400       break;
1401 
1402     case LL_RCC_ETH1PTP_CLKSOURCE_HSE:
1403       if (LL_RCC_HSE_IsReady() != 0U)
1404       {
1405         frequency = HSE_VALUE;
1406       }
1407       break;
1408 
1409     default:
1410       /* Unexpected case */
1411       break;
1412   }
1413 
1414   /* Apply divider */
1415   if (frequency != LL_RCC_PERIPH_FREQUENCY_NO)
1416   {
1417     frequency = frequency / ((LL_RCC_GetETH1PTPDivider() >> RCC_CCIPR2_ETH1PTPDIV_Pos) + 1U);
1418   }
1419 
1420   return frequency;
1421 }
1422 
1423 /**
1424   * @brief  Return FDCAN clock frequency
1425   * @param  FDCANxSource This parameter can be one of the following values:
1426   *         @arg @ref LL_RCC_FDCAN_CLKSOURCE
1427   * @retval FDCAN clock frequency (in Hz)
1428   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
1429   */
LL_RCC_GetFDCANClockFreq(uint32_t FDCANxSource)1430 uint32_t LL_RCC_GetFDCANClockFreq(uint32_t FDCANxSource)
1431 {
1432   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1433   uint32_t ic_divider;
1434 
1435   switch (LL_RCC_GetFDCANClockSource(FDCANxSource))
1436   {
1437     case LL_RCC_FDCAN_CLKSOURCE_PCLK1:
1438       frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
1439       break;
1440 
1441     case LL_RCC_FDCAN_CLKSOURCE_CLKP:
1442       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
1443       break;
1444 
1445     case LL_RCC_FDCAN_CLKSOURCE_IC19:
1446       if (LL_RCC_IC19_IsEnabled() != 0U)
1447       {
1448         ic_divider = LL_RCC_IC19_GetDivider();
1449         switch (LL_RCC_IC19_GetSource())
1450         {
1451           case LL_RCC_ICCLKSOURCE_PLL1:
1452             frequency = LL_RCC_GetPLL1ClockFreq();
1453             frequency = frequency / ic_divider;
1454             break;
1455           case LL_RCC_ICCLKSOURCE_PLL2:
1456             frequency = LL_RCC_GetPLL2ClockFreq();
1457             frequency = frequency / ic_divider;
1458             break;
1459           case LL_RCC_ICCLKSOURCE_PLL3:
1460             frequency = LL_RCC_GetPLL3ClockFreq();
1461             frequency = frequency / ic_divider;
1462             break;
1463           case LL_RCC_ICCLKSOURCE_PLL4:
1464             frequency = LL_RCC_GetPLL4ClockFreq();
1465             frequency = frequency / ic_divider;
1466             break;
1467           default:
1468             /* Unexpected case */
1469             break;
1470         }
1471       }
1472       break;
1473 
1474     case LL_RCC_FDCAN_CLKSOURCE_HSE:
1475       if (LL_RCC_HSE_IsReady() != 0U)
1476       {
1477         frequency = HSE_VALUE;
1478       }
1479       break;
1480 
1481     default:
1482       /* Unexpected case */
1483       break;
1484   }
1485 
1486   return frequency;
1487 }
1488 
1489 /**
1490   * @brief  Return FMC clock frequency
1491   * @param  FMCxSource This parameter can be one of the following values:
1492   *         @arg @ref LL_RCC_FMC_CLKSOURCE
1493   * @retval FMC clock frequency (in Hz)
1494   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
1495   */
LL_RCC_GetFMCClockFreq(uint32_t FMCxSource)1496 uint32_t LL_RCC_GetFMCClockFreq(uint32_t FMCxSource)
1497 {
1498   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1499   uint32_t ic_divider;
1500 
1501   switch (LL_RCC_GetFMCClockSource(FMCxSource))
1502   {
1503     case LL_RCC_FMC_CLKSOURCE_HCLK:
1504       frequency = RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq());
1505       break;
1506 
1507     case LL_RCC_FMC_CLKSOURCE_CLKP:
1508       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
1509       break;
1510 
1511     case LL_RCC_FMC_CLKSOURCE_IC3:
1512       if (LL_RCC_IC3_IsEnabled() != 0U)
1513       {
1514         ic_divider = LL_RCC_IC3_GetDivider();
1515         switch (LL_RCC_IC3_GetSource())
1516         {
1517           case LL_RCC_ICCLKSOURCE_PLL1:
1518             frequency = LL_RCC_GetPLL1ClockFreq();
1519             frequency = frequency / ic_divider;
1520             break;
1521           case LL_RCC_ICCLKSOURCE_PLL2:
1522             frequency = LL_RCC_GetPLL2ClockFreq();
1523             frequency = frequency / ic_divider;
1524             break;
1525           case LL_RCC_ICCLKSOURCE_PLL3:
1526             frequency = LL_RCC_GetPLL3ClockFreq();
1527             frequency = frequency / ic_divider;
1528             break;
1529           case LL_RCC_ICCLKSOURCE_PLL4:
1530             frequency = LL_RCC_GetPLL4ClockFreq();
1531             frequency = frequency / ic_divider;
1532             break;
1533           default:
1534             /* Unexpected case */
1535             break;
1536         }
1537       }
1538       break;
1539 
1540     case LL_RCC_FMC_CLKSOURCE_IC4:
1541       if (LL_RCC_IC4_IsEnabled() != 0U)
1542       {
1543         ic_divider = LL_RCC_IC4_GetDivider();
1544         switch (LL_RCC_IC4_GetSource())
1545         {
1546           case LL_RCC_ICCLKSOURCE_PLL1:
1547             frequency = LL_RCC_GetPLL1ClockFreq();
1548             frequency = frequency / ic_divider;
1549             break;
1550           case LL_RCC_ICCLKSOURCE_PLL2:
1551             frequency = LL_RCC_GetPLL2ClockFreq();
1552             frequency = frequency / ic_divider;
1553             break;
1554           case LL_RCC_ICCLKSOURCE_PLL3:
1555             frequency = LL_RCC_GetPLL3ClockFreq();
1556             frequency = frequency / ic_divider;
1557             break;
1558           case LL_RCC_ICCLKSOURCE_PLL4:
1559             frequency = LL_RCC_GetPLL4ClockFreq();
1560             frequency = frequency / ic_divider;
1561             break;
1562           default:
1563             /* Unexpected case */
1564             break;
1565         }
1566       }
1567       break;
1568 
1569     default:
1570       /* Unexpected case */
1571       break;
1572   }
1573 
1574   return frequency;
1575 }
1576 
1577 /**
1578   * @brief  Return I2Cx clock frequency
1579   * @param  I2CxSource This parameter can be one of the following values:
1580   *         @arg @ref LL_RCC_I2C1_CLKSOURCE
1581   *         @arg @ref LL_RCC_I2C2_CLKSOURCE
1582   *         @arg @ref LL_RCC_I2C3_CLKSOURCE
1583   *         @arg @ref LL_RCC_I2C4_CLKSOURCE
1584   * @retval I2C clock frequency (in Hz)
1585   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
1586   */
LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)1587 uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)
1588 {
1589   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1590   uint32_t ic_divider;
1591 
1592   /* Check parameter */
1593   assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource));
1594 
1595   switch (LL_RCC_GetI2CClockSource(I2CxSource))
1596   {
1597     case LL_RCC_I2C1_CLKSOURCE_PCLK1:
1598     case LL_RCC_I2C2_CLKSOURCE_PCLK1:
1599     case LL_RCC_I2C3_CLKSOURCE_PCLK1:
1600     case LL_RCC_I2C4_CLKSOURCE_PCLK1:
1601       frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
1602       break;
1603 
1604     case LL_RCC_I2C1_CLKSOURCE_CLKP:
1605     case LL_RCC_I2C2_CLKSOURCE_CLKP:
1606     case LL_RCC_I2C3_CLKSOURCE_CLKP:
1607     case LL_RCC_I2C4_CLKSOURCE_CLKP:
1608       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
1609       break;
1610 
1611     case LL_RCC_I2C1_CLKSOURCE_IC10:
1612     case LL_RCC_I2C2_CLKSOURCE_IC10:
1613     case LL_RCC_I2C3_CLKSOURCE_IC10:
1614     case LL_RCC_I2C4_CLKSOURCE_IC10:
1615       if (LL_RCC_IC10_IsEnabled() != 0U)
1616       {
1617         ic_divider = LL_RCC_IC10_GetDivider();
1618         switch (LL_RCC_IC10_GetSource())
1619         {
1620           case LL_RCC_ICCLKSOURCE_PLL1:
1621             frequency = LL_RCC_GetPLL1ClockFreq();
1622             frequency = frequency / ic_divider;
1623             break;
1624           case LL_RCC_ICCLKSOURCE_PLL2:
1625             frequency = LL_RCC_GetPLL2ClockFreq();
1626             frequency = frequency / ic_divider;
1627             break;
1628           case LL_RCC_ICCLKSOURCE_PLL3:
1629             frequency = LL_RCC_GetPLL3ClockFreq();
1630             frequency = frequency / ic_divider;
1631             break;
1632           case LL_RCC_ICCLKSOURCE_PLL4:
1633             frequency = LL_RCC_GetPLL4ClockFreq();
1634             frequency = frequency / ic_divider;
1635             break;
1636           default:
1637             /* Unexpected case */
1638             break;
1639         }
1640       }
1641       break;
1642 
1643     case LL_RCC_I2C1_CLKSOURCE_IC15:
1644     case LL_RCC_I2C2_CLKSOURCE_IC15:
1645     case LL_RCC_I2C3_CLKSOURCE_IC15:
1646     case LL_RCC_I2C4_CLKSOURCE_IC15:
1647       if (LL_RCC_IC15_IsEnabled() != 0U)
1648       {
1649         ic_divider = LL_RCC_IC15_GetDivider();
1650         switch (LL_RCC_IC15_GetSource())
1651         {
1652           case LL_RCC_ICCLKSOURCE_PLL1:
1653             frequency = LL_RCC_GetPLL1ClockFreq();
1654             frequency = frequency / ic_divider;
1655             break;
1656           case LL_RCC_ICCLKSOURCE_PLL2:
1657             frequency = LL_RCC_GetPLL2ClockFreq();
1658             frequency = frequency / ic_divider;
1659             break;
1660           case LL_RCC_ICCLKSOURCE_PLL3:
1661             frequency = LL_RCC_GetPLL3ClockFreq();
1662             frequency = frequency / ic_divider;
1663             break;
1664           case LL_RCC_ICCLKSOURCE_PLL4:
1665             frequency = LL_RCC_GetPLL4ClockFreq();
1666             frequency = frequency / ic_divider;
1667             break;
1668           default:
1669             /* Unexpected case */
1670             break;
1671         }
1672       }
1673       break;
1674 
1675     case LL_RCC_I2C1_CLKSOURCE_HSI:
1676     case LL_RCC_I2C2_CLKSOURCE_HSI:
1677     case LL_RCC_I2C3_CLKSOURCE_HSI:
1678     case LL_RCC_I2C4_CLKSOURCE_HSI:
1679       if (LL_RCC_HSI_IsReady() != 0U)
1680       {
1681         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
1682       }
1683       break;
1684 
1685     case LL_RCC_I2C1_CLKSOURCE_MSI:
1686     case LL_RCC_I2C2_CLKSOURCE_MSI:
1687     case LL_RCC_I2C3_CLKSOURCE_MSI:
1688     case LL_RCC_I2C4_CLKSOURCE_MSI:
1689       if (LL_RCC_MSI_IsReady() != 0U)
1690       {
1691         frequency = MSI_VALUE;
1692       }
1693       break;
1694 
1695     default:
1696       /* Unexpected case */
1697       break;
1698   }
1699 
1700   return frequency;
1701 }
1702 
1703 /**
1704   * @brief  Return I3Cx clock frequency
1705   * @param  I3CxSource This parameter can be one of the following values:
1706   *         @arg @ref LL_RCC_I3C1_CLKSOURCE
1707   *         @arg @ref LL_RCC_I3C2_CLKSOURCE
1708   * @retval I3C clock frequency (in Hz)
1709   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
1710   */
LL_RCC_GetI3CClockFreq(uint32_t I3CxSource)1711 uint32_t LL_RCC_GetI3CClockFreq(uint32_t I3CxSource)
1712 {
1713   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1714   uint32_t ic_divider;
1715 
1716   /* Check parameter */
1717   assert_param(IS_LL_RCC_I3C_CLKSOURCE(I3CxSource));
1718 
1719   switch (LL_RCC_GetI3CClockSource(I3CxSource))
1720   {
1721     case LL_RCC_I3C1_CLKSOURCE_PCLK1:
1722     case LL_RCC_I3C2_CLKSOURCE_PCLK1:
1723       frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
1724       break;
1725 
1726     case LL_RCC_I3C1_CLKSOURCE_CLKP:
1727     case LL_RCC_I3C2_CLKSOURCE_CLKP:
1728       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
1729       break;
1730 
1731     case LL_RCC_I3C1_CLKSOURCE_IC10:
1732     case LL_RCC_I3C2_CLKSOURCE_IC10:
1733       if (LL_RCC_IC10_IsEnabled() != 0U)
1734       {
1735         ic_divider = LL_RCC_IC10_GetDivider();
1736         switch (LL_RCC_IC10_GetSource())
1737         {
1738           case LL_RCC_ICCLKSOURCE_PLL1:
1739             frequency = LL_RCC_GetPLL1ClockFreq();
1740             frequency = frequency / ic_divider;
1741             break;
1742           case LL_RCC_ICCLKSOURCE_PLL2:
1743             frequency = LL_RCC_GetPLL2ClockFreq();
1744             frequency = frequency / ic_divider;
1745             break;
1746           case LL_RCC_ICCLKSOURCE_PLL3:
1747             frequency = LL_RCC_GetPLL3ClockFreq();
1748             frequency = frequency / ic_divider;
1749             break;
1750           case LL_RCC_ICCLKSOURCE_PLL4:
1751             frequency = LL_RCC_GetPLL4ClockFreq();
1752             frequency = frequency / ic_divider;
1753             break;
1754           default:
1755             /* Unexpected case */
1756             break;
1757         }
1758       }
1759       break;
1760 
1761     case LL_RCC_I3C1_CLKSOURCE_IC15:
1762     case LL_RCC_I3C2_CLKSOURCE_IC15:
1763       if (LL_RCC_IC15_IsEnabled() != 0U)
1764       {
1765         ic_divider = LL_RCC_IC15_GetDivider();
1766         switch (LL_RCC_IC15_GetSource())
1767         {
1768           case LL_RCC_ICCLKSOURCE_PLL1:
1769             frequency = LL_RCC_GetPLL1ClockFreq();
1770             frequency = frequency / ic_divider;
1771             break;
1772           case LL_RCC_ICCLKSOURCE_PLL2:
1773             frequency = LL_RCC_GetPLL2ClockFreq();
1774             frequency = frequency / ic_divider;
1775             break;
1776           case LL_RCC_ICCLKSOURCE_PLL3:
1777             frequency = LL_RCC_GetPLL3ClockFreq();
1778             frequency = frequency / ic_divider;
1779             break;
1780           case LL_RCC_ICCLKSOURCE_PLL4:
1781             frequency = LL_RCC_GetPLL4ClockFreq();
1782             frequency = frequency / ic_divider;
1783             break;
1784           default:
1785             /* Unexpected case */
1786             break;
1787         }
1788       }
1789       break;
1790 
1791     case LL_RCC_I3C1_CLKSOURCE_HSI:
1792     case LL_RCC_I3C2_CLKSOURCE_HSI:
1793       if (LL_RCC_HSI_IsReady() != 0U)
1794       {
1795         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
1796       }
1797       break;
1798 
1799     case LL_RCC_I3C1_CLKSOURCE_MSI:
1800     case LL_RCC_I3C2_CLKSOURCE_MSI:
1801       if (LL_RCC_MSI_IsReady() != 0U)
1802       {
1803         frequency = MSI_VALUE;
1804       }
1805       break;
1806 
1807     default:
1808       /* Unexpected case */
1809       break;
1810   }
1811 
1812   return frequency;
1813 }
1814 
1815 /**
1816   * @brief  Return LPTIMx clock frequency
1817   * @param  LPTIMxSource This parameter can be one of the following values:
1818   *         @arg @ref LL_RCC_LPTIM1_CLKSOURCE
1819   *         @arg @ref LL_RCC_LPTIM2_CLKSOURCE
1820   *         @arg @ref LL_RCC_LPTIM3_CLKSOURCE
1821   *         @arg @ref LL_RCC_LPTIM4_CLKSOURCE
1822   *         @arg @ref LL_RCC_LPTIM5_CLKSOURCE
1823   * @retval LPTIM clock frequency (in Hz)
1824   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
1825   */
LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)1826 uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
1827 {
1828   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1829   uint32_t ic_divider;
1830 
1831   /* Check parameter */
1832   assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
1833 
1834   switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
1835   {
1836     case LL_RCC_LPTIM1_CLKSOURCE_PCLK1:
1837       frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
1838       break;
1839 
1840     case LL_RCC_LPTIM2_CLKSOURCE_PCLK4:
1841     case LL_RCC_LPTIM3_CLKSOURCE_PCLK4:
1842     case LL_RCC_LPTIM4_CLKSOURCE_PCLK4:
1843     case LL_RCC_LPTIM5_CLKSOURCE_PCLK4:
1844       frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
1845       break;
1846 
1847     case LL_RCC_LPTIM1_CLKSOURCE_CLKP:
1848     case LL_RCC_LPTIM2_CLKSOURCE_CLKP:
1849     case LL_RCC_LPTIM3_CLKSOURCE_CLKP:
1850     case LL_RCC_LPTIM4_CLKSOURCE_CLKP:
1851     case LL_RCC_LPTIM5_CLKSOURCE_CLKP:
1852       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
1853       break;
1854 
1855     case LL_RCC_LPTIM1_CLKSOURCE_IC15:
1856     case LL_RCC_LPTIM2_CLKSOURCE_IC15:
1857     case LL_RCC_LPTIM3_CLKSOURCE_IC15:
1858     case LL_RCC_LPTIM4_CLKSOURCE_IC15:
1859     case LL_RCC_LPTIM5_CLKSOURCE_IC15:
1860       if (LL_RCC_IC15_IsEnabled() != 0U)
1861       {
1862         ic_divider = LL_RCC_IC15_GetDivider();
1863         switch (LL_RCC_IC15_GetSource())
1864         {
1865           case LL_RCC_ICCLKSOURCE_PLL1:
1866             frequency = LL_RCC_GetPLL1ClockFreq();
1867             frequency = frequency / ic_divider;
1868             break;
1869           case LL_RCC_ICCLKSOURCE_PLL2:
1870             frequency = LL_RCC_GetPLL2ClockFreq();
1871             frequency = frequency / ic_divider;
1872             break;
1873           case LL_RCC_ICCLKSOURCE_PLL3:
1874             frequency = LL_RCC_GetPLL3ClockFreq();
1875             frequency = frequency / ic_divider;
1876             break;
1877           case LL_RCC_ICCLKSOURCE_PLL4:
1878             frequency = LL_RCC_GetPLL4ClockFreq();
1879             frequency = frequency / ic_divider;
1880             break;
1881           default:
1882             /* Unexpected case */
1883             break;
1884         }
1885       }
1886       break;
1887 
1888     case LL_RCC_LPTIM1_CLKSOURCE_LSE:
1889     case LL_RCC_LPTIM2_CLKSOURCE_LSE:
1890     case LL_RCC_LPTIM3_CLKSOURCE_LSE:
1891     case LL_RCC_LPTIM4_CLKSOURCE_LSE:
1892     case LL_RCC_LPTIM5_CLKSOURCE_LSE:
1893       if (LL_RCC_LSE_IsReady() != 0U)
1894       {
1895         frequency = LSE_VALUE;
1896       }
1897       break;
1898 
1899     case LL_RCC_LPTIM1_CLKSOURCE_LSI:
1900     case LL_RCC_LPTIM2_CLKSOURCE_LSI:
1901     case LL_RCC_LPTIM3_CLKSOURCE_LSI:
1902     case LL_RCC_LPTIM4_CLKSOURCE_LSI:
1903     case LL_RCC_LPTIM5_CLKSOURCE_LSI:
1904       if (LL_RCC_LSI_IsReady() != 0U)
1905       {
1906         frequency = LSI_VALUE;
1907       }
1908       break;
1909 
1910     case LL_RCC_LPTIM1_CLKSOURCE_TIMG:
1911     case LL_RCC_LPTIM2_CLKSOURCE_TIMG:
1912     case LL_RCC_LPTIM3_CLKSOURCE_TIMG:
1913     case LL_RCC_LPTIM4_CLKSOURCE_TIMG:
1914     case LL_RCC_LPTIM5_CLKSOURCE_TIMG:
1915       frequency = LL_RCC_GetSystemClockFreq() / (1UL << LL_RCC_GetTIMPrescaler());
1916       break;
1917 
1918     default:
1919       /* Unexpected case */
1920       break;
1921   }
1922 
1923   return frequency;
1924 }
1925 
1926 /**
1927   * @brief  Return LPUART clock frequency
1928   * @param  LPUARTxSource This parameter can be one of the following values:
1929   *         @arg @ref LL_RCC_LPUART1_CLKSOURCE
1930   * @retval LPUART clock frequency (in Hz)
1931   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
1932   */
LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource)1933 uint32_t LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource)
1934 {
1935   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1936   uint32_t ic_divider;
1937 
1938   switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource))
1939   {
1940     case LL_RCC_LPUART1_CLKSOURCE_PCLK4:
1941       frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
1942       break;
1943 
1944     case LL_RCC_LPUART1_CLKSOURCE_CLKP:
1945       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
1946       break;
1947 
1948     case LL_RCC_LPUART1_CLKSOURCE_IC9:
1949       if (LL_RCC_IC9_IsEnabled() != 0U)
1950       {
1951         ic_divider = LL_RCC_IC9_GetDivider();
1952         switch (LL_RCC_IC9_GetSource())
1953         {
1954           case LL_RCC_ICCLKSOURCE_PLL1:
1955             frequency = LL_RCC_GetPLL1ClockFreq();
1956             frequency = frequency / ic_divider;
1957             break;
1958           case LL_RCC_ICCLKSOURCE_PLL2:
1959             frequency = LL_RCC_GetPLL2ClockFreq();
1960             frequency = frequency / ic_divider;
1961             break;
1962           case LL_RCC_ICCLKSOURCE_PLL3:
1963             frequency = LL_RCC_GetPLL3ClockFreq();
1964             frequency = frequency / ic_divider;
1965             break;
1966           case LL_RCC_ICCLKSOURCE_PLL4:
1967             frequency = LL_RCC_GetPLL4ClockFreq();
1968             frequency = frequency / ic_divider;
1969             break;
1970           default:
1971             /* Unexpected case */
1972             break;
1973         }
1974       }
1975       break;
1976 
1977     case LL_RCC_LPUART1_CLKSOURCE_IC14:
1978       if (LL_RCC_IC14_IsEnabled() != 0U)
1979       {
1980         ic_divider = LL_RCC_IC14_GetDivider();
1981         switch (LL_RCC_IC14_GetSource())
1982         {
1983           case LL_RCC_ICCLKSOURCE_PLL1:
1984             frequency = LL_RCC_GetPLL1ClockFreq();
1985             frequency = frequency / ic_divider;
1986             break;
1987           case LL_RCC_ICCLKSOURCE_PLL2:
1988             frequency = LL_RCC_GetPLL2ClockFreq();
1989             frequency = frequency / ic_divider;
1990             break;
1991           case LL_RCC_ICCLKSOURCE_PLL3:
1992             frequency = LL_RCC_GetPLL3ClockFreq();
1993             frequency = frequency / ic_divider;
1994             break;
1995           case LL_RCC_ICCLKSOURCE_PLL4:
1996             frequency = LL_RCC_GetPLL4ClockFreq();
1997             frequency = frequency / ic_divider;
1998             break;
1999           default:
2000             /* Unexpected case */
2001             break;
2002         }
2003       }
2004       break;
2005 
2006     case LL_RCC_LPUART1_CLKSOURCE_HSI:
2007       if (LL_RCC_HSI_IsReady() != 0U)
2008       {
2009         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
2010       }
2011       break;
2012 
2013     case LL_RCC_LPUART1_CLKSOURCE_MSI:
2014       if (LL_RCC_MSI_IsReady() != 0U)
2015       {
2016         frequency = MSI_VALUE;
2017       }
2018       break;
2019 
2020     case LL_RCC_LPUART1_CLKSOURCE_LSE:
2021       if (LL_RCC_LSE_IsReady() != 0U)
2022       {
2023         frequency = LSE_VALUE;
2024       }
2025       break;
2026 
2027     default:
2028       /* Unexpected case */
2029       break;
2030   }
2031 
2032   return frequency;
2033 }
2034 
2035 /**
2036   * @brief  Return LTDC clock frequency
2037   * @param  LTDCxSource This parameter can be one of the following values:
2038   *         @arg @ref LL_RCC_LTDC_CLKSOURCE
2039   * @retval LTDC clock frequency (in Hz)
2040   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
2041   */
LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource)2042 uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource)
2043 {
2044   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2045   uint32_t ic_divider;
2046 
2047   /* Check parameter */
2048   assert_param(IS_LL_RCC_LTDC_CLKSOURCE(LTDCxSource));
2049 
2050   switch (LL_RCC_GetLTDCClockSource(LTDCxSource))
2051   {
2052     case LL_RCC_LTDC_CLKSOURCE_PCLK5:
2053       frequency = RCC_GetPCLK5ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
2054       break;
2055 
2056     case LL_RCC_LTDC_CLKSOURCE_CLKP:
2057       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
2058       break;
2059 
2060     case LL_RCC_LTDC_CLKSOURCE_IC16:
2061       if (LL_RCC_IC16_IsEnabled() != 0U)
2062       {
2063         ic_divider = LL_RCC_IC16_GetDivider();
2064         switch (LL_RCC_IC16_GetSource())
2065         {
2066           case LL_RCC_ICCLKSOURCE_PLL1:
2067             frequency = LL_RCC_GetPLL1ClockFreq();
2068             frequency = frequency / ic_divider;
2069             break;
2070           case LL_RCC_ICCLKSOURCE_PLL2:
2071             frequency = LL_RCC_GetPLL2ClockFreq();
2072             frequency = frequency / ic_divider;
2073             break;
2074           case LL_RCC_ICCLKSOURCE_PLL3:
2075             frequency = LL_RCC_GetPLL3ClockFreq();
2076             frequency = frequency / ic_divider;
2077             break;
2078           case LL_RCC_ICCLKSOURCE_PLL4:
2079             frequency = LL_RCC_GetPLL4ClockFreq();
2080             frequency = frequency / ic_divider;
2081             break;
2082           default:
2083             /* Unexpected case */
2084             break;
2085         }
2086       }
2087       break;
2088 
2089     case LL_RCC_LTDC_CLKSOURCE_HSI:
2090       if (LL_RCC_HSI_IsReady() != 0U)
2091       {
2092         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
2093       }
2094       break;
2095 
2096     default:
2097       /* Unexpected case */
2098       break;
2099   }
2100 
2101   return frequency;
2102 }
2103 
2104 /**
2105   * @brief  Return MDFx clock frequency
2106   * @param  MDFxSource This parameter can be one of the following values:
2107   *         @arg @ref LL_RCC_MDF1_CLKSOURCE
2108   * @retval MDF clock frequency (in Hz)
2109   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
2110   */
LL_RCC_GetMDFClockFreq(uint32_t MDFxSource)2111 uint32_t LL_RCC_GetMDFClockFreq(uint32_t MDFxSource)
2112 {
2113   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2114   uint32_t ic_divider;
2115 
2116   /* Check parameter */
2117   assert_param(IS_LL_RCC_MDF_CLKSOURCE(MDFxSource));
2118 
2119   switch (LL_RCC_GetMDFClockSource(MDFxSource))
2120   {
2121     case LL_RCC_MDF1_CLKSOURCE_HCLK:
2122       frequency = RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq());
2123       break;
2124 
2125     case LL_RCC_MDF1_CLKSOURCE_CLKP:
2126       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
2127       break;
2128 
2129     case LL_RCC_MDF1_CLKSOURCE_IC7:
2130       if (LL_RCC_IC7_IsEnabled() != 0U)
2131       {
2132         ic_divider = LL_RCC_IC7_GetDivider();
2133         switch (LL_RCC_IC7_GetSource())
2134         {
2135           case LL_RCC_ICCLKSOURCE_PLL1:
2136             frequency = LL_RCC_GetPLL1ClockFreq();
2137             frequency = frequency / ic_divider;
2138             break;
2139           case LL_RCC_ICCLKSOURCE_PLL2:
2140             frequency = LL_RCC_GetPLL2ClockFreq();
2141             frequency = frequency / ic_divider;
2142             break;
2143           case LL_RCC_ICCLKSOURCE_PLL3:
2144             frequency = LL_RCC_GetPLL3ClockFreq();
2145             frequency = frequency / ic_divider;
2146             break;
2147           case LL_RCC_ICCLKSOURCE_PLL4:
2148             frequency = LL_RCC_GetPLL4ClockFreq();
2149             frequency = frequency / ic_divider;
2150             break;
2151           default:
2152             /* Unexpected case */
2153             break;
2154         }
2155       }
2156       break;
2157 
2158     case LL_RCC_MDF1_CLKSOURCE_IC8:
2159       if (LL_RCC_IC8_IsEnabled() != 0U)
2160       {
2161         ic_divider = LL_RCC_IC8_GetDivider();
2162         switch (LL_RCC_IC8_GetSource())
2163         {
2164           case LL_RCC_ICCLKSOURCE_PLL1:
2165             frequency = LL_RCC_GetPLL1ClockFreq();
2166             frequency = frequency / ic_divider;
2167             break;
2168           case LL_RCC_ICCLKSOURCE_PLL2:
2169             frequency = LL_RCC_GetPLL2ClockFreq();
2170             frequency = frequency / ic_divider;
2171             break;
2172           case LL_RCC_ICCLKSOURCE_PLL3:
2173             frequency = LL_RCC_GetPLL3ClockFreq();
2174             frequency = frequency / ic_divider;
2175             break;
2176           case LL_RCC_ICCLKSOURCE_PLL4:
2177             frequency = LL_RCC_GetPLL4ClockFreq();
2178             frequency = frequency / ic_divider;
2179             break;
2180           default:
2181             /* Unexpected case */
2182             break;
2183         }
2184       }
2185       break;
2186 
2187     case LL_RCC_MDF1_CLKSOURCE_HSI:
2188       if (LL_RCC_HSI_IsReady() != 0U)
2189       {
2190         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
2191       }
2192       break;
2193 
2194     case LL_RCC_MDF1_CLKSOURCE_MSI:
2195       if (LL_RCC_MSI_IsReady() != 0U)
2196       {
2197         frequency = MSI_VALUE;
2198       }
2199       break;
2200 
2201     case LL_RCC_MDF1_CLKSOURCE_I2S_CKIN:
2202       frequency = EXTERNAL_CLOCK_VALUE;
2203       break;
2204 
2205     case LL_RCC_MDF1_CLKSOURCE_TIMG:
2206       frequency = LL_RCC_GetSystemClockFreq() / (1UL << LL_RCC_GetTIMPrescaler());
2207       break;
2208 
2209     default:
2210       /* Unexpected case */
2211       break;
2212   }
2213 
2214   return frequency;
2215 }
2216 
2217 /**
2218   * @brief  Return OTGPHYx clock frequency
2219   * @param  OTGPHYxSource This parameter can be one of the following values:
2220   *         @arg @ref LL_RCC_OTGPHY1_CLKSOURCE
2221   *         @arg @ref LL_RCC_OTGPHY2_CLKSOURCE
2222   * @retval OTGPHY clock frequency (in Hz)
2223   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
2224   */
LL_RCC_GetOTGPHYClockFreq(uint32_t OTGPHYxSource)2225 uint32_t LL_RCC_GetOTGPHYClockFreq(uint32_t OTGPHYxSource)
2226 {
2227   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2228   uint32_t ic_divider;
2229 
2230   /* Check parameter */
2231   assert_param(IS_LL_RCC_OTGPHY_CLKSOURCE(OTGPHYxSource));
2232 
2233   switch (LL_RCC_GetOTGPHYClockSource(OTGPHYxSource))
2234   {
2235     case LL_RCC_OTGPHY1_CLKSOURCE_CLKP:
2236     case LL_RCC_OTGPHY2_CLKSOURCE_CLKP:
2237       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
2238       break;
2239 
2240     case LL_RCC_OTGPHY1_CLKSOURCE_IC15:
2241     case LL_RCC_OTGPHY2_CLKSOURCE_IC15:
2242       if (LL_RCC_IC15_IsEnabled() != 0U)
2243       {
2244         ic_divider = LL_RCC_IC15_GetDivider();
2245         switch (LL_RCC_IC15_GetSource())
2246         {
2247           case LL_RCC_ICCLKSOURCE_PLL1:
2248             frequency = LL_RCC_GetPLL1ClockFreq();
2249             frequency = frequency / ic_divider;
2250             break;
2251           case LL_RCC_ICCLKSOURCE_PLL2:
2252             frequency = LL_RCC_GetPLL2ClockFreq();
2253             frequency = frequency / ic_divider;
2254             break;
2255           case LL_RCC_ICCLKSOURCE_PLL3:
2256             frequency = LL_RCC_GetPLL3ClockFreq();
2257             frequency = frequency / ic_divider;
2258             break;
2259           case LL_RCC_ICCLKSOURCE_PLL4:
2260             frequency = LL_RCC_GetPLL4ClockFreq();
2261             frequency = frequency / ic_divider;
2262             break;
2263           default:
2264             /* Unexpected case */
2265             break;
2266         }
2267       }
2268       break;
2269 
2270     case LL_RCC_OTGPHY1_CLKSOURCE_HSE_DIV_2:
2271     case LL_RCC_OTGPHY2_CLKSOURCE_HSE_DIV_2:
2272       if (LL_RCC_HSE_IsReady() != 0U)
2273       {
2274         frequency = HSE_VALUE >> 1U;
2275       }
2276       break;
2277 
2278     case LL_RCC_OTGPHY1_CLKSOURCE_HSE_DIV_2_OSC:
2279     case LL_RCC_OTGPHY2_CLKSOURCE_HSE_DIV_2_OSC:
2280       if (LL_RCC_HSE_IsReady() != 0U)
2281       {
2282         if (LL_RCC_HSE_IsSelectedHSEDiv2AsDiv2Clock() == 0UL)
2283         {
2284           frequency = HSE_VALUE;
2285         }
2286         else
2287         {
2288           frequency = HSE_VALUE >> 1U;
2289         }
2290       }
2291       break;
2292 
2293     default:
2294       /* Unexpected case */
2295       break;
2296   }
2297 
2298   return frequency;
2299 }
2300 
2301 /**
2302   * @brief  Return OTGPHYxCKREF clock frequency
2303   * @param  OTGPHYxCKREFSource This parameter can be one of the following values:
2304   *         @arg @ref LL_RCC_OTGPHY1CKREF_CLKSOURCE
2305   *         @arg @ref LL_RCC_OTGPHY2CKREF_CLKSOURCE
2306   * @retval OTGPHYCKREF clock frequency (in Hz)
2307   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
2308   */
LL_RCC_GetOTGPHYCKREFClockFreq(uint32_t OTGPHYxCKREFSource)2309 uint32_t LL_RCC_GetOTGPHYCKREFClockFreq(uint32_t OTGPHYxCKREFSource)
2310 {
2311   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2312 
2313   /* Check parameter */
2314   assert_param(IS_LL_RCC_OTGPHYCKREF_CLKSOURCE(OTGPHYxCKREFSource));
2315 
2316   switch (LL_RCC_GetOTGPHYCKREFClockSource(OTGPHYxCKREFSource))
2317   {
2318     case LL_RCC_OTGPHY1CKREF_CLKSOURCE_OTGPHY1:
2319       frequency = LL_RCC_GetOTGPHYClockFreq(LL_RCC_OTGPHY1_CLKSOURCE);
2320       break;
2321 
2322     case LL_RCC_OTGPHY2CKREF_CLKSOURCE_OTGPHY2:
2323       frequency = LL_RCC_GetOTGPHYClockFreq(LL_RCC_OTGPHY2_CLKSOURCE);
2324       break;
2325 
2326     case LL_RCC_OTGPHY1CKREF_CLKSOURCE_HSE_DIV_2_OSC:
2327     case LL_RCC_OTGPHY2CKREF_CLKSOURCE_HSE_DIV_2_OSC:
2328       if (LL_RCC_HSE_IsReady() != 0U)
2329       {
2330         if (LL_RCC_HSE_IsSelectedHSEDiv2AsDiv2Clock() == 0UL)
2331         {
2332           frequency = HSE_VALUE;
2333         }
2334         else
2335         {
2336           frequency = HSE_VALUE >> 1U;
2337         }
2338       }
2339       break;
2340 
2341     default:
2342       /* Unexpected case */
2343       break;
2344   }
2345 
2346   return frequency;
2347 }
2348 
2349 /**
2350   * @brief  Return PSSI clock frequency
2351   * @param  PSSIxSource This parameter can be one of the following values:
2352   *         @arg @ref LL_RCC_PSSI_CLKSOURCE
2353   * @retval PSSI clock frequency (in Hz)
2354   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
2355   */
LL_RCC_GetPSSIClockFreq(uint32_t PSSIxSource)2356 uint32_t LL_RCC_GetPSSIClockFreq(uint32_t PSSIxSource)
2357 {
2358   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2359   uint32_t ic_divider;
2360 
2361   /* Check parameter */
2362   assert_param(IS_LL_RCC_PSSI_CLKSOURCE(PSSIxSource));
2363 
2364   switch (LL_RCC_GetPSSIClockSource(PSSIxSource))
2365   {
2366     case LL_RCC_PSSI_CLKSOURCE_HCLK:
2367       frequency = RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq());
2368       break;
2369 
2370     case LL_RCC_PSSI_CLKSOURCE_CLKP:
2371       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
2372       break;
2373 
2374     case LL_RCC_PSSI_CLKSOURCE_IC20:
2375       if (LL_RCC_IC20_IsEnabled() != 0U)
2376       {
2377         ic_divider = LL_RCC_IC20_GetDivider();
2378         switch (LL_RCC_IC20_GetSource())
2379         {
2380           case LL_RCC_ICCLKSOURCE_PLL1:
2381             frequency = LL_RCC_GetPLL1ClockFreq();
2382             frequency = frequency / ic_divider;
2383             break;
2384           case LL_RCC_ICCLKSOURCE_PLL2:
2385             frequency = LL_RCC_GetPLL2ClockFreq();
2386             frequency = frequency / ic_divider;
2387             break;
2388           case LL_RCC_ICCLKSOURCE_PLL3:
2389             frequency = LL_RCC_GetPLL3ClockFreq();
2390             frequency = frequency / ic_divider;
2391             break;
2392           case LL_RCC_ICCLKSOURCE_PLL4:
2393             frequency = LL_RCC_GetPLL4ClockFreq();
2394             frequency = frequency / ic_divider;
2395             break;
2396           default:
2397             /* Unexpected case */
2398             break;
2399         }
2400       }
2401       break;
2402 
2403     case LL_RCC_PSSI_CLKSOURCE_HSI:
2404       if (LL_RCC_HSI_IsReady() != 0U)
2405       {
2406         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
2407       }
2408       break;
2409 
2410     default:
2411       /* Unexpected case */
2412       break;
2413   }
2414 
2415   return frequency;
2416 }
2417 
2418 /**
2419   * @brief  Return SAIx clock frequency
2420   * @param  SAIxSource This parameter can be one of the following values:
2421   *         @arg @ref LL_RCC_SAI1_CLKSOURCE
2422   *         @arg @ref LL_RCC_SAI2_CLKSOURCE
2423   * @retval SAI clock frequency (in Hz)
2424   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
2425   */
LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)2426 uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
2427 {
2428   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2429   uint32_t ic_divider;
2430 
2431   /* Check parameter */
2432   assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
2433 
2434   switch (LL_RCC_GetSAIClockSource(SAIxSource))
2435   {
2436     case LL_RCC_SAI1_CLKSOURCE_PCLK2:
2437     case LL_RCC_SAI2_CLKSOURCE_PCLK2:
2438       frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
2439       break;
2440 
2441     case LL_RCC_SAI1_CLKSOURCE_CLKP:
2442     case LL_RCC_SAI2_CLKSOURCE_CLKP:
2443       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
2444       break;
2445 
2446     case LL_RCC_SAI1_CLKSOURCE_IC7:
2447     case LL_RCC_SAI2_CLKSOURCE_IC7:
2448       if (LL_RCC_IC7_IsEnabled() != 0U)
2449       {
2450         ic_divider = LL_RCC_IC7_GetDivider();
2451         switch (LL_RCC_IC7_GetSource())
2452         {
2453           case LL_RCC_ICCLKSOURCE_PLL1:
2454             frequency = LL_RCC_GetPLL1ClockFreq();
2455             frequency = frequency / ic_divider;
2456             break;
2457           case LL_RCC_ICCLKSOURCE_PLL2:
2458             frequency = LL_RCC_GetPLL2ClockFreq();
2459             frequency = frequency / ic_divider;
2460             break;
2461           case LL_RCC_ICCLKSOURCE_PLL3:
2462             frequency = LL_RCC_GetPLL3ClockFreq();
2463             frequency = frequency / ic_divider;
2464             break;
2465           case LL_RCC_ICCLKSOURCE_PLL4:
2466             frequency = LL_RCC_GetPLL4ClockFreq();
2467             frequency = frequency / ic_divider;
2468             break;
2469           default:
2470             /* Unexpected case */
2471             break;
2472         }
2473       }
2474       break;
2475 
2476     case LL_RCC_SAI1_CLKSOURCE_IC8:
2477     case LL_RCC_SAI2_CLKSOURCE_IC8:
2478       if (LL_RCC_IC8_IsEnabled() != 0U)
2479       {
2480         ic_divider = LL_RCC_IC8_GetDivider();
2481         switch (LL_RCC_IC8_GetSource())
2482         {
2483           case LL_RCC_ICCLKSOURCE_PLL1:
2484             frequency = LL_RCC_GetPLL1ClockFreq();
2485             frequency = frequency / ic_divider;
2486             break;
2487           case LL_RCC_ICCLKSOURCE_PLL2:
2488             frequency = LL_RCC_GetPLL2ClockFreq();
2489             frequency = frequency / ic_divider;
2490             break;
2491           case LL_RCC_ICCLKSOURCE_PLL3:
2492             frequency = LL_RCC_GetPLL3ClockFreq();
2493             frequency = frequency / ic_divider;
2494             break;
2495           case LL_RCC_ICCLKSOURCE_PLL4:
2496             frequency = LL_RCC_GetPLL4ClockFreq();
2497             frequency = frequency / ic_divider;
2498             break;
2499           default:
2500             /* Unexpected case */
2501             break;
2502         }
2503       }
2504       break;
2505 
2506     case LL_RCC_SAI1_CLKSOURCE_HSI:
2507     case LL_RCC_SAI2_CLKSOURCE_HSI:
2508       if (LL_RCC_HSI_IsReady() != 0U)
2509       {
2510         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
2511       }
2512       break;
2513 
2514     case LL_RCC_SAI1_CLKSOURCE_MSI:
2515     case LL_RCC_SAI2_CLKSOURCE_MSI:
2516       if (LL_RCC_MSI_IsReady() != 0U)
2517       {
2518         frequency = MSI_VALUE;
2519       }
2520       break;
2521 
2522     case LL_RCC_SAI1_CLKSOURCE_I2S_CKIN:
2523     case LL_RCC_SAI2_CLKSOURCE_I2S_CKIN:
2524       frequency = EXTERNAL_CLOCK_VALUE;
2525       break;
2526 
2527     case LL_RCC_SAI1_CLKSOURCE_SPDIFRX1:
2528     case LL_RCC_SAI2_CLKSOURCE_SPDIFRX1:
2529       frequency = LL_RCC_GetSPDIFRXClockFreq(LL_RCC_SPDIFRX1_CLKSOURCE);
2530       break;
2531 
2532     default:
2533       /* Unexpected case */
2534       break;
2535   }
2536 
2537   return frequency;
2538 }
2539 
2540 /**
2541   * @brief  Return SDMMC clock frequency
2542   * @param  SDMMCxSource This parameter can be one of the following values:
2543   *         @arg @ref LL_RCC_SDMMC1_CLKSOURCE
2544   *         @arg @ref LL_RCC_SDMMC2_CLKSOURCE
2545   * @retval SDMMC clock frequency (in Hz)
2546   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
2547   */
LL_RCC_GetSDMMCClockFreq(uint32_t SDMMCxSource)2548 uint32_t LL_RCC_GetSDMMCClockFreq(uint32_t SDMMCxSource)
2549 {
2550   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2551   uint32_t ic_divider;
2552 
2553   /* Check parameter */
2554   assert_param(IS_LL_RCC_SDMMC_CLKSOURCE(SDMMCxSource));
2555 
2556   switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
2557   {
2558     case LL_RCC_SDMMC1_CLKSOURCE_HCLK:
2559     case LL_RCC_SDMMC2_CLKSOURCE_HCLK:
2560       frequency = RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq());
2561       break;
2562 
2563     case LL_RCC_SDMMC1_CLKSOURCE_CLKP:
2564     case LL_RCC_SDMMC2_CLKSOURCE_CLKP:
2565       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
2566       break;
2567 
2568     case LL_RCC_SDMMC1_CLKSOURCE_IC4:
2569     case LL_RCC_SDMMC2_CLKSOURCE_IC4:
2570       if (LL_RCC_IC4_IsEnabled() != 0U)
2571       {
2572         ic_divider = LL_RCC_IC4_GetDivider();
2573         switch (LL_RCC_IC4_GetSource())
2574         {
2575           case LL_RCC_ICCLKSOURCE_PLL1:
2576             frequency = LL_RCC_GetPLL1ClockFreq();
2577             frequency = frequency / ic_divider;
2578             break;
2579           case LL_RCC_ICCLKSOURCE_PLL2:
2580             frequency = LL_RCC_GetPLL2ClockFreq();
2581             frequency = frequency / ic_divider;
2582             break;
2583           case LL_RCC_ICCLKSOURCE_PLL3:
2584             frequency = LL_RCC_GetPLL3ClockFreq();
2585             frequency = frequency / ic_divider;
2586             break;
2587           case LL_RCC_ICCLKSOURCE_PLL4:
2588             frequency = LL_RCC_GetPLL4ClockFreq();
2589             frequency = frequency / ic_divider;
2590             break;
2591           default:
2592             /* Unexpected case */
2593             break;
2594         }
2595       }
2596       break;
2597 
2598     case LL_RCC_SDMMC1_CLKSOURCE_IC5:
2599     case LL_RCC_SDMMC2_CLKSOURCE_IC5:
2600       if (LL_RCC_IC5_IsEnabled() != 0U)
2601       {
2602         ic_divider = LL_RCC_IC5_GetDivider();
2603         switch (LL_RCC_IC5_GetSource())
2604         {
2605           case LL_RCC_ICCLKSOURCE_PLL1:
2606             frequency = LL_RCC_GetPLL1ClockFreq();
2607             frequency = frequency / ic_divider;
2608             break;
2609           case LL_RCC_ICCLKSOURCE_PLL2:
2610             frequency = LL_RCC_GetPLL2ClockFreq();
2611             frequency = frequency / ic_divider;
2612             break;
2613           case LL_RCC_ICCLKSOURCE_PLL3:
2614             frequency = LL_RCC_GetPLL3ClockFreq();
2615             frequency = frequency / ic_divider;
2616             break;
2617           case LL_RCC_ICCLKSOURCE_PLL4:
2618             frequency = LL_RCC_GetPLL4ClockFreq();
2619             frequency = frequency / ic_divider;
2620             break;
2621           default:
2622             /* Unexpected case */
2623             break;
2624         }
2625       }
2626       break;
2627 
2628     default:
2629       /* Unexpected case */
2630       break;
2631   }
2632 
2633   return frequency;
2634 }
2635 
2636 /**
2637   * @brief  Return SPDIFRX clock frequency
2638   * @param  SPDIFRXxSource This parameter can be one of the following values:
2639   *         @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE
2640   * @retval SPDIF clock frequency (in Hz)
2641   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
2642   */
LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource)2643 uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource)
2644 {
2645   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2646   uint32_t ic_divider;
2647 
2648   /* Check parameter */
2649   assert_param(IS_LL_RCC_SPDIFRX_CLKSOURCE(SPDIFRXxSource));
2650 
2651   switch (LL_RCC_GetSPDIFRXClockSource(SPDIFRXxSource))
2652   {
2653     case LL_RCC_SPDIFRX1_CLKSOURCE_PCLK1:
2654       frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
2655       break;
2656 
2657     case LL_RCC_SPDIFRX1_CLKSOURCE_CLKP:
2658       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
2659       break;
2660 
2661     case LL_RCC_SPDIFRX1_CLKSOURCE_IC7:
2662       if (LL_RCC_IC7_IsEnabled() != 0U)
2663       {
2664         ic_divider = LL_RCC_IC7_GetDivider();
2665         switch (LL_RCC_IC7_GetSource())
2666         {
2667           case LL_RCC_ICCLKSOURCE_PLL1:
2668             frequency = LL_RCC_GetPLL1ClockFreq();
2669             frequency = frequency / ic_divider;
2670             break;
2671           case LL_RCC_ICCLKSOURCE_PLL2:
2672             frequency = LL_RCC_GetPLL2ClockFreq();
2673             frequency = frequency / ic_divider;
2674             break;
2675           case LL_RCC_ICCLKSOURCE_PLL3:
2676             frequency = LL_RCC_GetPLL3ClockFreq();
2677             frequency = frequency / ic_divider;
2678             break;
2679           case LL_RCC_ICCLKSOURCE_PLL4:
2680             frequency = LL_RCC_GetPLL4ClockFreq();
2681             frequency = frequency / ic_divider;
2682             break;
2683           default:
2684             /* Unexpected case */
2685             break;
2686         }
2687       }
2688       break;
2689 
2690     case LL_RCC_SPDIFRX1_CLKSOURCE_IC8:
2691       if (LL_RCC_IC8_IsEnabled() != 0U)
2692       {
2693         ic_divider = LL_RCC_IC8_GetDivider();
2694         switch (LL_RCC_IC8_GetSource())
2695         {
2696           case LL_RCC_ICCLKSOURCE_PLL1:
2697             frequency = LL_RCC_GetPLL1ClockFreq();
2698             frequency = frequency / ic_divider;
2699             break;
2700           case LL_RCC_ICCLKSOURCE_PLL2:
2701             frequency = LL_RCC_GetPLL2ClockFreq();
2702             frequency = frequency / ic_divider;
2703             break;
2704           case LL_RCC_ICCLKSOURCE_PLL3:
2705             frequency = LL_RCC_GetPLL3ClockFreq();
2706             frequency = frequency / ic_divider;
2707             break;
2708           case LL_RCC_ICCLKSOURCE_PLL4:
2709             frequency = LL_RCC_GetPLL4ClockFreq();
2710             frequency = frequency / ic_divider;
2711             break;
2712           default:
2713             /* Unexpected case */
2714             break;
2715         }
2716       }
2717       break;
2718 
2719     case LL_RCC_SPDIFRX1_CLKSOURCE_HSI:
2720       if (LL_RCC_HSI_IsReady() != 0U)
2721       {
2722         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
2723       }
2724       break;
2725 
2726     case LL_RCC_SPDIFRX1_CLKSOURCE_MSI:
2727       if (LL_RCC_MSI_IsReady() != 0U)
2728       {
2729         frequency = MSI_VALUE;
2730       }
2731       break;
2732 
2733     case LL_RCC_SPDIFRX1_CLKSOURCE_I2S_CKIN:
2734       frequency = EXTERNAL_CLOCK_VALUE;
2735       break;
2736 
2737     default:
2738       /* Unexpected case */
2739       break;
2740   }
2741 
2742   return frequency;
2743 }
2744 
2745 /**
2746   * @brief  Return SPIx clock frequency
2747   * @param  SPIxSource This parameter can be one of the following values:
2748   *         @arg @ref LL_RCC_SPI1_CLKSOURCE
2749   *         @arg @ref LL_RCC_SPI2_CLKSOURCE
2750   *         @arg @ref LL_RCC_SPI3_CLKSOURCE
2751   *         @arg @ref LL_RCC_SPI4_CLKSOURCE
2752   *         @arg @ref LL_RCC_SPI5_CLKSOURCE
2753   *         @arg @ref LL_RCC_SPI6_CLKSOURCE
2754   * @retval SPI clock frequency (in Hz)
2755   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
2756   */
LL_RCC_GetSPIClockFreq(uint32_t SPIxSource)2757 uint32_t LL_RCC_GetSPIClockFreq(uint32_t SPIxSource)
2758 {
2759   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2760   uint32_t ic_divider;
2761 
2762   /* Check parameter */
2763   assert_param(IS_LL_RCC_SPI_CLKSOURCE(SPIxSource));
2764 
2765   switch (LL_RCC_GetSPIClockSource(SPIxSource))
2766   {
2767     case LL_RCC_SPI2_CLKSOURCE_PCLK1:
2768     case LL_RCC_SPI3_CLKSOURCE_PCLK1:
2769       frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
2770       break;
2771 
2772     case LL_RCC_SPI1_CLKSOURCE_PCLK2:
2773     case LL_RCC_SPI4_CLKSOURCE_PCLK2:
2774     case LL_RCC_SPI5_CLKSOURCE_PCLK2:
2775       frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
2776       break;
2777 
2778     case LL_RCC_SPI6_CLKSOURCE_PCLK4:
2779       frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
2780       break;
2781 
2782     case LL_RCC_SPI1_CLKSOURCE_CLKP:
2783     case LL_RCC_SPI2_CLKSOURCE_CLKP:
2784     case LL_RCC_SPI3_CLKSOURCE_CLKP:
2785     case LL_RCC_SPI4_CLKSOURCE_CLKP:
2786     case LL_RCC_SPI5_CLKSOURCE_CLKP:
2787     case LL_RCC_SPI6_CLKSOURCE_CLKP:
2788       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
2789       break;
2790 
2791     case LL_RCC_SPI1_CLKSOURCE_IC8:
2792     case LL_RCC_SPI2_CLKSOURCE_IC8:
2793     case LL_RCC_SPI3_CLKSOURCE_IC8:
2794     case LL_RCC_SPI6_CLKSOURCE_IC8:
2795       if (LL_RCC_IC8_IsEnabled() != 0U)
2796       {
2797         ic_divider = LL_RCC_IC8_GetDivider();
2798         switch (LL_RCC_IC8_GetSource())
2799         {
2800           case LL_RCC_ICCLKSOURCE_PLL1:
2801             frequency = LL_RCC_GetPLL1ClockFreq();
2802             frequency = frequency / ic_divider;
2803             break;
2804           case LL_RCC_ICCLKSOURCE_PLL2:
2805             frequency = LL_RCC_GetPLL2ClockFreq();
2806             frequency = frequency / ic_divider;
2807             break;
2808           case LL_RCC_ICCLKSOURCE_PLL3:
2809             frequency = LL_RCC_GetPLL3ClockFreq();
2810             frequency = frequency / ic_divider;
2811             break;
2812           case LL_RCC_ICCLKSOURCE_PLL4:
2813             frequency = LL_RCC_GetPLL4ClockFreq();
2814             frequency = frequency / ic_divider;
2815             break;
2816           default:
2817             /* Unexpected case */
2818             break;
2819         }
2820       }
2821       break;
2822 
2823     case LL_RCC_SPI1_CLKSOURCE_IC9:
2824     case LL_RCC_SPI2_CLKSOURCE_IC9:
2825     case LL_RCC_SPI3_CLKSOURCE_IC9:
2826     case LL_RCC_SPI4_CLKSOURCE_IC9:
2827     case LL_RCC_SPI5_CLKSOURCE_IC9:
2828     case LL_RCC_SPI6_CLKSOURCE_IC9:
2829       if (LL_RCC_IC9_IsEnabled() != 0U)
2830       {
2831         ic_divider = LL_RCC_IC9_GetDivider();
2832         switch (LL_RCC_IC9_GetSource())
2833         {
2834           case LL_RCC_ICCLKSOURCE_PLL1:
2835             frequency = LL_RCC_GetPLL1ClockFreq();
2836             frequency = frequency / ic_divider;
2837             break;
2838           case LL_RCC_ICCLKSOURCE_PLL2:
2839             frequency = LL_RCC_GetPLL2ClockFreq();
2840             frequency = frequency / ic_divider;
2841             break;
2842           case LL_RCC_ICCLKSOURCE_PLL3:
2843             frequency = LL_RCC_GetPLL3ClockFreq();
2844             frequency = frequency / ic_divider;
2845             break;
2846           case LL_RCC_ICCLKSOURCE_PLL4:
2847             frequency = LL_RCC_GetPLL4ClockFreq();
2848             frequency = frequency / ic_divider;
2849             break;
2850           default:
2851             /* Unexpected case */
2852             break;
2853         }
2854       }
2855       break;
2856 
2857     case LL_RCC_SPI4_CLKSOURCE_IC14:
2858     case LL_RCC_SPI5_CLKSOURCE_IC14:
2859       if (LL_RCC_IC14_IsEnabled() != 0U)
2860       {
2861         ic_divider = LL_RCC_IC14_GetDivider();
2862         switch (LL_RCC_IC14_GetSource())
2863         {
2864           case LL_RCC_ICCLKSOURCE_PLL1:
2865             frequency = LL_RCC_GetPLL1ClockFreq();
2866             frequency = frequency / ic_divider;
2867             break;
2868           case LL_RCC_ICCLKSOURCE_PLL2:
2869             frequency = LL_RCC_GetPLL2ClockFreq();
2870             frequency = frequency / ic_divider;
2871             break;
2872           case LL_RCC_ICCLKSOURCE_PLL3:
2873             frequency = LL_RCC_GetPLL3ClockFreq();
2874             frequency = frequency / ic_divider;
2875             break;
2876           case LL_RCC_ICCLKSOURCE_PLL4:
2877             frequency = LL_RCC_GetPLL4ClockFreq();
2878             frequency = frequency / ic_divider;
2879             break;
2880           default:
2881             /* Unexpected case */
2882             break;
2883         }
2884       }
2885       break;
2886 
2887     case LL_RCC_SPI1_CLKSOURCE_HSI:
2888     case LL_RCC_SPI2_CLKSOURCE_HSI:
2889     case LL_RCC_SPI3_CLKSOURCE_HSI:
2890     case LL_RCC_SPI4_CLKSOURCE_HSI:
2891     case LL_RCC_SPI5_CLKSOURCE_HSI:
2892     case LL_RCC_SPI6_CLKSOURCE_HSI:
2893       if (LL_RCC_HSI_IsReady() != 0U)
2894       {
2895         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
2896       }
2897       break;
2898 
2899     case LL_RCC_SPI1_CLKSOURCE_MSI:
2900     case LL_RCC_SPI2_CLKSOURCE_MSI:
2901     case LL_RCC_SPI3_CLKSOURCE_MSI:
2902     case LL_RCC_SPI4_CLKSOURCE_MSI:
2903     case LL_RCC_SPI5_CLKSOURCE_MSI:
2904     case LL_RCC_SPI6_CLKSOURCE_MSI:
2905       if (LL_RCC_MSI_IsReady() != 0U)
2906       {
2907         frequency = MSI_VALUE;
2908       }
2909       break;
2910 
2911     case LL_RCC_SPI1_CLKSOURCE_I2S_CKIN:
2912     case LL_RCC_SPI2_CLKSOURCE_I2S_CKIN:
2913     case LL_RCC_SPI3_CLKSOURCE_I2S_CKIN:
2914     case LL_RCC_SPI6_CLKSOURCE_I2S_CKIN:
2915       frequency = EXTERNAL_CLOCK_VALUE;
2916       break;
2917 
2918     case LL_RCC_SPI4_CLKSOURCE_HSE:
2919     case LL_RCC_SPI5_CLKSOURCE_HSE:
2920       if (LL_RCC_HSE_IsReady() != 0U)
2921       {
2922         frequency = HSE_VALUE;
2923       }
2924       break;
2925 
2926     default:
2927       /* Unexpected case */
2928       break;
2929   }
2930 
2931   return frequency;
2932 }
2933 
2934 /**
2935   * @brief  Return UARTx clock frequency
2936   * @param  UARTxSource This parameter can be one of the following values:
2937   *         @arg @ref LL_RCC_UART4_CLKSOURCE
2938   *         @arg @ref LL_RCC_UART5_CLKSOURCE
2939   *         @arg @ref LL_RCC_UART7_CLKSOURCE
2940   *         @arg @ref LL_RCC_UART8_CLKSOURCE
2941   *         @arg @ref LL_RCC_UART9_CLKSOURCE
2942   * @retval USART clock frequency (in Hz)
2943   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
2944   */
LL_RCC_GetUARTClockFreq(uint32_t UARTxSource)2945 uint32_t LL_RCC_GetUARTClockFreq(uint32_t UARTxSource)
2946 {
2947   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2948   uint32_t ic_divider;
2949 
2950   /* Check parameter */
2951   assert_param(IS_LL_RCC_UART_CLKSOURCE(UARTxSource));
2952 
2953   switch (LL_RCC_GetUARTClockSource(UARTxSource))
2954   {
2955     case LL_RCC_UART4_CLKSOURCE_PCLK1:
2956     case LL_RCC_UART5_CLKSOURCE_PCLK1:
2957     case LL_RCC_UART7_CLKSOURCE_PCLK1:
2958     case LL_RCC_UART8_CLKSOURCE_PCLK1:
2959       frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
2960       break;
2961 
2962     case LL_RCC_UART9_CLKSOURCE_PCLK2:
2963       frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
2964       break;
2965 
2966     case LL_RCC_UART4_CLKSOURCE_CLKP:
2967     case LL_RCC_UART5_CLKSOURCE_CLKP:
2968     case LL_RCC_UART7_CLKSOURCE_CLKP:
2969     case LL_RCC_UART8_CLKSOURCE_CLKP:
2970     case LL_RCC_UART9_CLKSOURCE_CLKP:
2971       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
2972       break;
2973 
2974     case LL_RCC_UART4_CLKSOURCE_IC9:
2975     case LL_RCC_UART5_CLKSOURCE_IC9:
2976     case LL_RCC_UART7_CLKSOURCE_IC9:
2977     case LL_RCC_UART8_CLKSOURCE_IC9:
2978     case LL_RCC_UART9_CLKSOURCE_IC9:
2979       if (LL_RCC_IC9_IsEnabled() != 0U)
2980       {
2981         ic_divider = LL_RCC_IC9_GetDivider();
2982         switch (LL_RCC_IC9_GetSource())
2983         {
2984           case LL_RCC_ICCLKSOURCE_PLL1:
2985             frequency = LL_RCC_GetPLL1ClockFreq();
2986             frequency = frequency / ic_divider;
2987             break;
2988           case LL_RCC_ICCLKSOURCE_PLL2:
2989             frequency = LL_RCC_GetPLL2ClockFreq();
2990             frequency = frequency / ic_divider;
2991             break;
2992           case LL_RCC_ICCLKSOURCE_PLL3:
2993             frequency = LL_RCC_GetPLL3ClockFreq();
2994             frequency = frequency / ic_divider;
2995             break;
2996           case LL_RCC_ICCLKSOURCE_PLL4:
2997             frequency = LL_RCC_GetPLL4ClockFreq();
2998             frequency = frequency / ic_divider;
2999             break;
3000           default:
3001             /* Unexpected case */
3002             break;
3003         }
3004       }
3005       break;
3006 
3007     case LL_RCC_UART4_CLKSOURCE_IC14:
3008     case LL_RCC_UART5_CLKSOURCE_IC14:
3009     case LL_RCC_UART7_CLKSOURCE_IC14:
3010     case LL_RCC_UART8_CLKSOURCE_IC14:
3011     case LL_RCC_UART9_CLKSOURCE_IC14:
3012       if (LL_RCC_IC14_IsEnabled() != 0U)
3013       {
3014         ic_divider = LL_RCC_IC14_GetDivider();
3015         switch (LL_RCC_IC14_GetSource())
3016         {
3017           case LL_RCC_ICCLKSOURCE_PLL1:
3018             frequency = LL_RCC_GetPLL1ClockFreq();
3019             frequency = frequency / ic_divider;
3020             break;
3021           case LL_RCC_ICCLKSOURCE_PLL2:
3022             frequency = LL_RCC_GetPLL2ClockFreq();
3023             frequency = frequency / ic_divider;
3024             break;
3025           case LL_RCC_ICCLKSOURCE_PLL3:
3026             frequency = LL_RCC_GetPLL3ClockFreq();
3027             frequency = frequency / ic_divider;
3028             break;
3029           case LL_RCC_ICCLKSOURCE_PLL4:
3030             frequency = LL_RCC_GetPLL4ClockFreq();
3031             frequency = frequency / ic_divider;
3032             break;
3033           default:
3034             /* Unexpected case */
3035             break;
3036         }
3037       }
3038       break;
3039 
3040     case LL_RCC_UART4_CLKSOURCE_HSI:
3041     case LL_RCC_UART5_CLKSOURCE_HSI:
3042     case LL_RCC_UART7_CLKSOURCE_HSI:
3043     case LL_RCC_UART8_CLKSOURCE_HSI:
3044     case LL_RCC_UART9_CLKSOURCE_HSI:
3045       if (LL_RCC_HSI_IsReady() != 0U)
3046       {
3047         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
3048       }
3049       break;
3050 
3051     case LL_RCC_UART4_CLKSOURCE_MSI:
3052     case LL_RCC_UART5_CLKSOURCE_MSI:
3053     case LL_RCC_UART7_CLKSOURCE_MSI:
3054     case LL_RCC_UART8_CLKSOURCE_MSI:
3055     case LL_RCC_UART9_CLKSOURCE_MSI:
3056       if (LL_RCC_MSI_IsReady() != 0U)
3057       {
3058         frequency = MSI_VALUE;
3059       }
3060       break;
3061 
3062     case LL_RCC_UART4_CLKSOURCE_LSE:
3063     case LL_RCC_UART5_CLKSOURCE_LSE:
3064     case LL_RCC_UART7_CLKSOURCE_LSE:
3065     case LL_RCC_UART8_CLKSOURCE_LSE:
3066     case LL_RCC_UART9_CLKSOURCE_LSE:
3067       if (LL_RCC_LSE_IsReady() != 0U)
3068       {
3069         frequency = LSE_VALUE;
3070       }
3071       break;
3072 
3073     default:
3074       /* Unexpected case */
3075       break;
3076   }
3077 
3078   return frequency;
3079 }
3080 
3081 /**
3082   * @brief  Return USARTx clock frequency
3083   * @param  USARTxSource This parameter can be one of the following values:
3084   *         @arg @ref LL_RCC_USART1_CLKSOURCE
3085   *         @arg @ref LL_RCC_USART2_CLKSOURCE
3086   *         @arg @ref LL_RCC_USART3_CLKSOURCE
3087   *         @arg @ref LL_RCC_USART6_CLKSOURCE
3088   *         @arg @ref LL_RCC_USART10_CLKSOURCE
3089   * @retval USART clock frequency (in Hz)
3090   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
3091   */
LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)3092 uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)
3093 {
3094   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
3095   uint32_t ic_divider;
3096 
3097   /* Check parameter */
3098   assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource));
3099 
3100   switch (LL_RCC_GetUSARTClockSource(USARTxSource))
3101   {
3102     case LL_RCC_USART1_CLKSOURCE_PCLK2:
3103     case LL_RCC_USART6_CLKSOURCE_PCLK2:
3104     case LL_RCC_USART10_CLKSOURCE_PCLK2:
3105       frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
3106       break;
3107 
3108     case LL_RCC_USART2_CLKSOURCE_PCLK1:
3109     case LL_RCC_USART3_CLKSOURCE_PCLK1:
3110       frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq()));
3111       break;
3112 
3113     case LL_RCC_USART1_CLKSOURCE_CLKP:
3114     case LL_RCC_USART2_CLKSOURCE_CLKP:
3115     case LL_RCC_USART3_CLKSOURCE_CLKP:
3116     case LL_RCC_USART6_CLKSOURCE_CLKP:
3117     case LL_RCC_USART10_CLKSOURCE_CLKP:
3118       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
3119       break;
3120 
3121     case LL_RCC_USART1_CLKSOURCE_IC9:
3122     case LL_RCC_USART2_CLKSOURCE_IC9:
3123     case LL_RCC_USART3_CLKSOURCE_IC9:
3124     case LL_RCC_USART6_CLKSOURCE_IC9:
3125     case LL_RCC_USART10_CLKSOURCE_IC9:
3126       if (LL_RCC_IC9_IsEnabled() != 0U)
3127       {
3128         ic_divider = LL_RCC_IC9_GetDivider();
3129         switch (LL_RCC_IC9_GetSource())
3130         {
3131           case LL_RCC_ICCLKSOURCE_PLL1:
3132             frequency = LL_RCC_GetPLL1ClockFreq();
3133             frequency = frequency / ic_divider;
3134             break;
3135           case LL_RCC_ICCLKSOURCE_PLL2:
3136             frequency = LL_RCC_GetPLL2ClockFreq();
3137             frequency = frequency / ic_divider;
3138             break;
3139           case LL_RCC_ICCLKSOURCE_PLL3:
3140             frequency = LL_RCC_GetPLL3ClockFreq();
3141             frequency = frequency / ic_divider;
3142             break;
3143           case LL_RCC_ICCLKSOURCE_PLL4:
3144             frequency = LL_RCC_GetPLL4ClockFreq();
3145             frequency = frequency / ic_divider;
3146             break;
3147           default:
3148             /* Unexpected case */
3149             break;
3150         }
3151       }
3152       break;
3153 
3154     case LL_RCC_USART1_CLKSOURCE_IC14:
3155     case LL_RCC_USART2_CLKSOURCE_IC14:
3156     case LL_RCC_USART3_CLKSOURCE_IC14:
3157     case LL_RCC_USART6_CLKSOURCE_IC14:
3158     case LL_RCC_USART10_CLKSOURCE_IC14:
3159       if (LL_RCC_IC14_IsEnabled() != 0U)
3160       {
3161         ic_divider = LL_RCC_IC14_GetDivider();
3162         switch (LL_RCC_IC14_GetSource())
3163         {
3164           case LL_RCC_ICCLKSOURCE_PLL1:
3165             frequency = LL_RCC_GetPLL1ClockFreq();
3166             frequency = frequency / ic_divider;
3167             break;
3168           case LL_RCC_ICCLKSOURCE_PLL2:
3169             frequency = LL_RCC_GetPLL2ClockFreq();
3170             frequency = frequency / ic_divider;
3171             break;
3172           case LL_RCC_ICCLKSOURCE_PLL3:
3173             frequency = LL_RCC_GetPLL3ClockFreq();
3174             frequency = frequency / ic_divider;
3175             break;
3176           case LL_RCC_ICCLKSOURCE_PLL4:
3177             frequency = LL_RCC_GetPLL4ClockFreq();
3178             frequency = frequency / ic_divider;
3179             break;
3180           default:
3181             /* Unexpected case */
3182             break;
3183         }
3184       }
3185       break;
3186 
3187     case LL_RCC_USART1_CLKSOURCE_HSI:
3188     case LL_RCC_USART2_CLKSOURCE_HSI:
3189     case LL_RCC_USART3_CLKSOURCE_HSI:
3190     case LL_RCC_USART6_CLKSOURCE_HSI:
3191     case LL_RCC_USART10_CLKSOURCE_HSI:
3192       if (LL_RCC_HSI_IsReady() != 0U)
3193       {
3194         frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
3195       }
3196       break;
3197 
3198     case LL_RCC_USART1_CLKSOURCE_MSI:
3199     case LL_RCC_USART2_CLKSOURCE_MSI:
3200     case LL_RCC_USART3_CLKSOURCE_MSI:
3201     case LL_RCC_USART6_CLKSOURCE_MSI:
3202     case LL_RCC_USART10_CLKSOURCE_MSI:
3203       if (LL_RCC_MSI_IsReady() != 0U)
3204       {
3205         frequency = MSI_VALUE;
3206       }
3207       break;
3208 
3209     case LL_RCC_USART1_CLKSOURCE_LSE:
3210     case LL_RCC_USART2_CLKSOURCE_LSE:
3211     case LL_RCC_USART3_CLKSOURCE_LSE:
3212     case LL_RCC_USART6_CLKSOURCE_LSE:
3213     case LL_RCC_USART10_CLKSOURCE_LSE:
3214       if (LL_RCC_LSE_IsReady() != 0U)
3215       {
3216         frequency = LSE_VALUE;
3217       }
3218       break;
3219 
3220     default:
3221       /* Unexpected case */
3222       break;
3223   }
3224 
3225   return frequency;
3226 }
3227 
3228 /**
3229   * @brief  Return XSPI clock frequency
3230   * @param  XSPIxSource This parameter can be one of the following values:
3231   *         @arg @ref LL_RCC_XSPI1_CLKSOURCE
3232   *         @arg @ref LL_RCC_XSPI2_CLKSOURCE
3233   *         @arg @ref LL_RCC_XSPI3_CLKSOURCE
3234   * @retval XSPI clock frequency (in Hz)
3235   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
3236   */
3237 
LL_RCC_GetXSPIClockFreq(uint32_t XSPIxSource)3238 uint32_t LL_RCC_GetXSPIClockFreq(uint32_t XSPIxSource)
3239 {
3240   uint32_t frequency = LL_RCC_PERIPH_FREQUENCY_NO;
3241   uint32_t ic_divider;
3242 
3243   switch (LL_RCC_GetXSPIClockSource(XSPIxSource))
3244   {
3245     case LL_RCC_XSPI1_CLKSOURCE_HCLK:
3246     case LL_RCC_XSPI2_CLKSOURCE_HCLK:
3247     case LL_RCC_XSPI3_CLKSOURCE_HCLK:
3248       frequency = RCC_GetHCLKClockFreq(LL_RCC_GetSystemClockFreq());
3249       break;
3250 
3251     case LL_RCC_XSPI1_CLKSOURCE_CLKP:
3252     case LL_RCC_XSPI2_CLKSOURCE_CLKP:
3253     case LL_RCC_XSPI3_CLKSOURCE_CLKP:
3254       frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
3255       break;
3256 
3257     case LL_RCC_XSPI1_CLKSOURCE_IC3:
3258     case LL_RCC_XSPI2_CLKSOURCE_IC3:
3259     case LL_RCC_XSPI3_CLKSOURCE_IC3:
3260       if (LL_RCC_IC3_IsEnabled() != 0U)
3261       {
3262         ic_divider = LL_RCC_IC3_GetDivider();
3263         switch (LL_RCC_IC3_GetSource())
3264         {
3265           case LL_RCC_ICCLKSOURCE_PLL1:
3266             frequency = LL_RCC_GetPLL1ClockFreq();
3267             frequency = frequency / ic_divider;
3268             break;
3269           case LL_RCC_ICCLKSOURCE_PLL2:
3270             frequency = LL_RCC_GetPLL2ClockFreq();
3271             frequency = frequency / ic_divider;
3272             break;
3273           case LL_RCC_ICCLKSOURCE_PLL3:
3274             frequency = LL_RCC_GetPLL3ClockFreq();
3275             frequency = frequency / ic_divider;
3276             break;
3277           case LL_RCC_ICCLKSOURCE_PLL4:
3278             frequency = LL_RCC_GetPLL4ClockFreq();
3279             frequency = frequency / ic_divider;
3280             break;
3281           default:
3282             /* Unexpected case */
3283             break;
3284         }
3285       }
3286       break;
3287 
3288     case LL_RCC_XSPI1_CLKSOURCE_IC4:
3289     case LL_RCC_XSPI2_CLKSOURCE_IC4:
3290     case LL_RCC_XSPI3_CLKSOURCE_IC4:
3291       if (LL_RCC_IC4_IsEnabled() != 0U)
3292       {
3293         ic_divider = LL_RCC_IC4_GetDivider();
3294         switch (LL_RCC_IC4_GetSource())
3295         {
3296           case LL_RCC_ICCLKSOURCE_PLL1:
3297             frequency = LL_RCC_GetPLL1ClockFreq();
3298             frequency = frequency / ic_divider;
3299             break;
3300           case LL_RCC_ICCLKSOURCE_PLL2:
3301             frequency = LL_RCC_GetPLL2ClockFreq();
3302             frequency = frequency / ic_divider;
3303             break;
3304           case LL_RCC_ICCLKSOURCE_PLL3:
3305             frequency = LL_RCC_GetPLL3ClockFreq();
3306             frequency = frequency / ic_divider;
3307             break;
3308           case LL_RCC_ICCLKSOURCE_PLL4:
3309             frequency = LL_RCC_GetPLL4ClockFreq();
3310             frequency = frequency / ic_divider;
3311             break;
3312           default:
3313             /* Unexpected case */
3314             break;
3315         }
3316       }
3317       break;
3318 
3319     default:
3320       /* Nothing to do */
3321       break;
3322   }
3323 
3324   return frequency;
3325 }
3326 
3327 /**
3328   * @}
3329   */
3330 
3331 /**
3332   * @}
3333   */
3334 
3335 /** @addtogroup RCC_LL_Private_Functions
3336   * @{
3337   */
3338 
3339 /**
3340   * @brief  Return HCLK clock frequency
3341   * @param  SYSCLK_Frequency SYSCLK clock frequency
3342   * @retval HCLK clock frequency (in Hz)
3343   */
RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)3344 static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
3345 {
3346   /* HCLK clock frequency */
3347   return LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
3348 }
3349 
3350 /**
3351   * @brief  Return PCLK1 clock frequency
3352   * @param  HCLK_Frequency HCLK clock frequency
3353   * @retval PCLK1 clock frequency (in Hz)
3354   */
RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)3355 static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
3356 {
3357   /* PCLK1 clock frequency */
3358   return LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
3359 }
3360 
3361 /**
3362   * @brief  Return PCLK2 clock frequency
3363   * @param  HCLK_Frequency HCLK clock frequency
3364   * @retval PCLK2 clock frequency (in Hz)
3365   */
RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)3366 static uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
3367 {
3368   /* PCLK2 clock frequency */
3369   return LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
3370 }
3371 
3372 /**
3373   * @brief  Return PCLK4 clock frequency
3374   * @param  HCLK_Frequency HCLK clock frequency
3375   * @retval PCLK4 clock frequency (in Hz)
3376   */
RCC_GetPCLK4ClockFreq(uint32_t HCLK_Frequency)3377 static uint32_t RCC_GetPCLK4ClockFreq(uint32_t HCLK_Frequency)
3378 {
3379   /* PCLK4 clock frequency */
3380   return LL_RCC_CALC_PCLK4_FREQ(HCLK_Frequency, LL_RCC_GetAPB4Prescaler());
3381 }
3382 
3383 /**
3384   * @brief  Return PCLK5 clock frequency
3385   * @param  HCLK_Frequency HCLK clock frequency
3386   * @retval PCLK5 clock frequency (in Hz)
3387   */
RCC_GetPCLK5ClockFreq(uint32_t HCLK_Frequency)3388 static uint32_t RCC_GetPCLK5ClockFreq(uint32_t HCLK_Frequency)
3389 {
3390   /* PCLK5 clock frequency */
3391   return LL_RCC_CALC_PCLK5_FREQ(HCLK_Frequency, LL_RCC_GetAPB5Prescaler());
3392 }
3393 
3394 /**
3395   * @}
3396   */
3397 
3398 /**
3399   * @}
3400   */
3401 
3402 #endif /* defined(RCC) */
3403 
3404 /**
3405   * @}
3406   */
3407