1 /**
2   ******************************************************************************
3   * @file    stm32f4xx_ll_rcc.c
4   * @author  MCD Application Team
5   * @brief   RCC LL module driver.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2017 STMicroelectronics.
10   * All rights reserved.
11   *
12   * This software is licensed under terms that can be found in the LICENSE file in
13   * the root directory of this software component.
14   * If no LICENSE file comes with this software, it is provided AS-IS.
15   ******************************************************************************
16   */
17 #if defined(USE_FULL_LL_DRIVER)
18 
19 /* Includes ------------------------------------------------------------------*/
20 #include "stm32f4xx_ll_rcc.h"
21 #ifdef  USE_FULL_ASSERT
22   #include "stm32_assert.h"
23 #else
24   #define assert_param(expr) ((void)0U)
25 #endif
26 /** @addtogroup STM32F4xx_LL_Driver
27   * @{
28   */
29 
30 #if defined(RCC)
31 
32 /** @addtogroup RCC_LL
33   * @{
34   */
35 
36 /* Private types -------------------------------------------------------------*/
37 /* Private variables ---------------------------------------------------------*/
38 /* Private constants ---------------------------------------------------------*/
39 /* Private macros ------------------------------------------------------------*/
40 /** @addtogroup RCC_LL_Private_Macros
41   * @{
42   */
43 #if defined(FMPI2C1)
44 #define IS_LL_RCC_FMPI2C_CLKSOURCE(__VALUE__)     ((__VALUE__) == LL_RCC_FMPI2C1_CLKSOURCE)
45 #endif /* FMPI2C1 */
46 
47 #if defined(LPTIM1)
48 #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE))
49 #endif /* LPTIM1 */
50 
51 #if defined(SAI1)
52 #if defined(RCC_DCKCFGR_SAI1SRC)
53 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
54                                             || ((__VALUE__) == LL_RCC_SAI2_CLKSOURCE))
55 #elif defined(RCC_DCKCFGR_SAI1ASRC)
56 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SAI1_A_CLKSOURCE) \
57                                             || ((__VALUE__) == LL_RCC_SAI1_B_CLKSOURCE))
58 #endif /* RCC_DCKCFGR_SAI1SRC */
59 #endif /* SAI1 */
60 
61 #if defined(SDIO)
62 #define IS_LL_RCC_SDIO_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_SDIO_CLKSOURCE))
63 #endif /* SDIO */
64 
65 #if defined(RNG)
66 #define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_RNG_CLKSOURCE))
67 #endif /* RNG */
68 
69 #if defined(USB_OTG_FS) || defined(USB_OTG_HS)
70 #define IS_LL_RCC_USB_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_USB_CLKSOURCE))
71 #endif /* USB_OTG_FS || USB_OTG_HS */
72 
73 #if defined(DFSDM2_Channel0)
74 #define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE))
75 
76 #define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE) \
77                                                     || ((__VALUE__) == LL_RCC_DFSDM2_AUDIO_CLKSOURCE))
78 #elif defined(DFSDM1_Channel0)
79 #define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE))
80 
81 #define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE))
82 #endif /* DFSDM2_Channel0 */
83 
84 #if defined(RCC_DCKCFGR_I2S2SRC)
85 #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE) \
86                                             || ((__VALUE__) == LL_RCC_I2S2_CLKSOURCE))
87 #else
88 #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE))
89 #endif /* RCC_DCKCFGR_I2S2SRC */
90 
91 #if defined(CEC)
92 #define IS_LL_RCC_CEC_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_CEC_CLKSOURCE))
93 #endif /* CEC */
94 
95 #if defined(DSI)
96 #define IS_LL_RCC_DSI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_DSI_CLKSOURCE))
97 #endif /* DSI */
98 
99 #if defined(LTDC)
100 #define IS_LL_RCC_LTDC_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_LTDC_CLKSOURCE))
101 #endif /* LTDC */
102 
103 #if defined(SPDIFRX)
104 #define IS_LL_RCC_SPDIFRX_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SPDIFRX1_CLKSOURCE))
105 #endif /* SPDIFRX */
106 /**
107   * @}
108   */
109 
110 /* Private function prototypes -----------------------------------------------*/
111 /** @defgroup RCC_LL_Private_Functions RCC Private functions
112   * @{
113   */
114 uint32_t RCC_GetSystemClockFreq(void);
115 uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
116 uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
117 uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
118 uint32_t RCC_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source);
119 uint32_t RCC_PLL_GetFreqDomain_48M(void);
120 #if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC)
121 uint32_t RCC_PLL_GetFreqDomain_I2S(void);
122 #endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */
123 #if defined(SPDIFRX)
124 uint32_t RCC_PLL_GetFreqDomain_SPDIFRX(void);
125 #endif /* SPDIFRX */
126 #if defined(RCC_PLLCFGR_PLLR)
127 #if defined(SAI1)
128 uint32_t RCC_PLL_GetFreqDomain_SAI(void);
129 #endif /* SAI1 */
130 #endif /* RCC_PLLCFGR_PLLR */
131 #if defined(DSI)
132 uint32_t RCC_PLL_GetFreqDomain_DSI(void);
133 #endif /* DSI */
134 #if defined(RCC_PLLSAI_SUPPORT)
135 uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void);
136 #if defined(RCC_PLLSAICFGR_PLLSAIP)
137 uint32_t RCC_PLLSAI_GetFreqDomain_48M(void);
138 #endif /* RCC_PLLSAICFGR_PLLSAIP */
139 #if defined(LTDC)
140 uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void);
141 #endif /* LTDC */
142 #endif /* RCC_PLLSAI_SUPPORT */
143 #if defined(RCC_PLLI2S_SUPPORT)
144 uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void);
145 #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
146 uint32_t RCC_PLLI2S_GetFreqDomain_48M(void);
147 #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
148 #if defined(SAI1)
149 uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void);
150 #endif /* SAI1 */
151 #if defined(SPDIFRX)
152 uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void);
153 #endif /* SPDIFRX */
154 #endif /* RCC_PLLI2S_SUPPORT */
155 /**
156   * @}
157   */
158 
159 
160 /* Exported functions --------------------------------------------------------*/
161 /** @addtogroup RCC_LL_Exported_Functions
162   * @{
163   */
164 
165 /** @addtogroup RCC_LL_EF_Init
166   * @{
167   */
168 
169 /**
170   * @brief  Reset the RCC clock configuration to the default reset state.
171   * @note   The default reset state of the clock configuration is given below:
172   *         - HSI ON and used as system clock source
173   *         - HSE and PLL OFF
174   *         - AHB, APB1 and APB2 prescaler set to 1.
175   *         - CSS, MCO OFF
176   *         - All interrupts disabled
177   * @note   This function doesn't modify the configuration of the
178   *         - Peripheral clocks
179   *         - LSI, LSE and RTC clocks
180   * @retval An ErrorStatus enumeration value:
181   *          - SUCCESS: RCC registers are de-initialized
182   *          - ERROR: not applicable
183   */
LL_RCC_DeInit(void)184 ErrorStatus LL_RCC_DeInit(void)
185 {
186   __IO uint32_t vl_mask;
187 
188   /* Set HSION bit */
189   LL_RCC_HSI_Enable();
190 
191   /* Wait for HSI READY bit */
192   while(LL_RCC_HSI_IsReady() != 1U)
193   {}
194 
195   /* Reset CFGR register */
196   LL_RCC_WriteReg(CFGR, 0x00000000U);
197 
198   /* Read CR register */
199   vl_mask = LL_RCC_ReadReg(CR);
200 
201   /* Reset HSEON, HSEBYP, PLLON, CSSON bits */
202   CLEAR_BIT(vl_mask,
203             (RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_PLLON | RCC_CR_CSSON));
204 
205 #if defined(RCC_PLLSAI_SUPPORT)
206   /* Reset PLLSAION bit */
207   CLEAR_BIT(vl_mask, RCC_CR_PLLSAION);
208 #endif /* RCC_PLLSAI_SUPPORT */
209 
210 #if defined(RCC_PLLI2S_SUPPORT)
211   /* Reset PLLI2SON bit */
212   CLEAR_BIT(vl_mask, RCC_CR_PLLI2SON);
213 #endif /* RCC_PLLI2S_SUPPORT */
214 
215   /* Write new value in CR register */
216   LL_RCC_WriteReg(CR, vl_mask);
217 
218   /* Set HSITRIM bits to the reset value*/
219   LL_RCC_HSI_SetCalibTrimming(0x10U);
220 
221   /* Wait for PLL READY bit to be reset */
222   while(LL_RCC_PLL_IsReady() != 0U)
223   {}
224 
225   /* Reset PLLCFGR register */
226   LL_RCC_WriteReg(PLLCFGR, RCC_PLLCFGR_RST_VALUE);
227 
228 #if defined(RCC_PLLI2S_SUPPORT)
229   /* Reset PLLI2SCFGR register */
230   LL_RCC_WriteReg(PLLI2SCFGR, RCC_PLLI2SCFGR_RST_VALUE);
231 #endif /* RCC_PLLI2S_SUPPORT */
232 
233 #if defined(RCC_PLLSAI_SUPPORT)
234   /* Reset PLLSAICFGR register */
235   LL_RCC_WriteReg(PLLSAICFGR, RCC_PLLSAICFGR_RST_VALUE);
236 #endif /* RCC_PLLSAI_SUPPORT */
237 
238   /* Disable all interrupts */
239   CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE | RCC_CIR_LSERDYIE | RCC_CIR_HSIRDYIE | RCC_CIR_HSERDYIE | RCC_CIR_PLLRDYIE);
240 
241 #if defined(RCC_CIR_PLLI2SRDYIE)
242   CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE);
243 #endif /* RCC_CIR_PLLI2SRDYIE */
244 
245 #if defined(RCC_CIR_PLLSAIRDYIE)
246   CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE);
247 #endif /* RCC_CIR_PLLSAIRDYIE */
248 
249   /* Clear all interrupt flags */
250   SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC | RCC_CIR_CSSC);
251 
252 #if defined(RCC_CIR_PLLI2SRDYC)
253   SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC);
254 #endif /* RCC_CIR_PLLI2SRDYC */
255 
256 #if defined(RCC_CIR_PLLSAIRDYC)
257   SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC);
258 #endif /* RCC_CIR_PLLSAIRDYC */
259 
260   /* Clear LSION bit */
261   CLEAR_BIT(RCC->CSR, RCC_CSR_LSION);
262 
263   /* Reset all CSR flags */
264   SET_BIT(RCC->CSR, RCC_CSR_RMVF);
265 
266   return SUCCESS;
267 }
268 
269 /**
270   * @}
271   */
272 
273 /** @addtogroup RCC_LL_EF_Get_Freq
274   * @brief  Return the frequencies of different on chip clocks;  System, AHB, APB1 and APB2 buses clocks
275   *         and different peripheral clocks available on the device.
276   * @note   If SYSCLK source is HSI, function returns values based on HSI_VALUE(**)
277   * @note   If SYSCLK source is HSE, function returns values based on HSE_VALUE(***)
278   * @note   If SYSCLK source is PLL, function returns values based on HSE_VALUE(***)
279   *         or HSI_VALUE(**) multiplied/divided by the PLL factors.
280   * @note   (**) HSI_VALUE is a constant defined in this file (default value
281   *              16 MHz) but the real value may vary depending on the variations
282   *              in voltage and temperature.
283   * @note   (***) HSE_VALUE is a constant defined in this file (default value
284   *               25 MHz), user has to ensure that HSE_VALUE is same as the real
285   *               frequency of the crystal used. Otherwise, this function may
286   *               have wrong result.
287   * @note   The result of this function could be incorrect when using fractional
288   *         value for HSE crystal.
289   * @note   This function can be used by the user application to compute the
290   *         baud-rate for the communication peripherals or configure other parameters.
291   * @{
292   */
293 
294 /**
295   * @brief  Return the frequencies of different on chip clocks;  System, AHB, APB1 and APB2 buses clocks
296   * @note   Each time SYSCLK, HCLK, PCLK1 and/or PCLK2 clock changes, this function
297   *         must be called to update structure fields. Otherwise, any
298   *         configuration based on this function will be incorrect.
299   * @param  RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
300   * @retval None
301   */
LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef * RCC_Clocks)302 void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks)
303 {
304   /* Get SYSCLK frequency */
305   RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
306 
307   /* HCLK clock frequency */
308   RCC_Clocks->HCLK_Frequency   = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
309 
310   /* PCLK1 clock frequency */
311   RCC_Clocks->PCLK1_Frequency  = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
312 
313   /* PCLK2 clock frequency */
314   RCC_Clocks->PCLK2_Frequency  = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency);
315 }
316 
317 #if defined(FMPI2C1)
318 /**
319   * @brief  Return FMPI2Cx clock frequency
320   * @param  FMPI2CxSource This parameter can be one of the following values:
321   *         @arg @ref LL_RCC_FMPI2C1_CLKSOURCE
322   * @retval FMPI2C clock frequency (in Hz)
323   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that HSI oscillator is not ready
324   */
LL_RCC_GetFMPI2CClockFreq(uint32_t FMPI2CxSource)325 uint32_t LL_RCC_GetFMPI2CClockFreq(uint32_t FMPI2CxSource)
326 {
327   uint32_t FMPI2C_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
328 
329   /* Check parameter */
330   assert_param(IS_LL_RCC_FMPI2C_CLKSOURCE(FMPI2CxSource));
331 
332   if (FMPI2CxSource == LL_RCC_FMPI2C1_CLKSOURCE)
333   {
334     /* FMPI2C1 CLK clock frequency */
335     switch (LL_RCC_GetFMPI2CClockSource(FMPI2CxSource))
336     {
337       case LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK: /* FMPI2C1 Clock is System Clock */
338         FMPI2C_frequency = RCC_GetSystemClockFreq();
339         break;
340 
341       case LL_RCC_FMPI2C1_CLKSOURCE_HSI:    /* FMPI2C1 Clock is HSI Osc. */
342         if (LL_RCC_HSI_IsReady())
343         {
344           FMPI2C_frequency = HSI_VALUE;
345         }
346         break;
347 
348       case LL_RCC_FMPI2C1_CLKSOURCE_PCLK1:  /* FMPI2C1 Clock is PCLK1 */
349       default:
350         FMPI2C_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
351         break;
352     }
353   }
354 
355   return FMPI2C_frequency;
356 }
357 #endif /* FMPI2C1 */
358 
359 /**
360   * @brief  Return I2Sx clock frequency
361   * @param  I2SxSource This parameter can be one of the following values:
362   *         @arg @ref LL_RCC_I2S1_CLKSOURCE
363   *         @arg @ref LL_RCC_I2S2_CLKSOURCE (*)
364   *
365   *         (*) value not defined in all devices.
366   * @retval I2S clock frequency (in Hz)
367   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
368   */
LL_RCC_GetI2SClockFreq(uint32_t I2SxSource)369 uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource)
370 {
371   uint32_t i2s_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
372 
373   /* Check parameter */
374   assert_param(IS_LL_RCC_I2S_CLKSOURCE(I2SxSource));
375 
376   if (I2SxSource == LL_RCC_I2S1_CLKSOURCE)
377   {
378     /* I2S1 CLK clock frequency */
379     switch (LL_RCC_GetI2SClockSource(I2SxSource))
380     {
381 #if defined(RCC_PLLI2S_SUPPORT)
382       case LL_RCC_I2S1_CLKSOURCE_PLLI2S:       /* I2S1 Clock is PLLI2S */
383         if (LL_RCC_PLLI2S_IsReady())
384         {
385           i2s_frequency = RCC_PLLI2S_GetFreqDomain_I2S();
386         }
387         break;
388 #endif /* RCC_PLLI2S_SUPPORT */
389 
390 #if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC)
391       case LL_RCC_I2S1_CLKSOURCE_PLL:          /* I2S1 Clock is PLL */
392         if (LL_RCC_PLL_IsReady())
393         {
394           i2s_frequency = RCC_PLL_GetFreqDomain_I2S();
395         }
396         break;
397 
398       case LL_RCC_I2S1_CLKSOURCE_PLLSRC:       /* I2S1 Clock is PLL Main source */
399         switch (LL_RCC_PLL_GetMainSource())
400         {
401            case LL_RCC_PLLSOURCE_HSE:          /* I2S1 Clock is HSE Osc. */
402              if (LL_RCC_HSE_IsReady())
403              {
404                i2s_frequency = HSE_VALUE;
405              }
406              break;
407 
408            case LL_RCC_PLLSOURCE_HSI:          /* I2S1 Clock is HSI Osc. */
409            default:
410              if (LL_RCC_HSI_IsReady())
411              {
412                i2s_frequency = HSI_VALUE;
413              }
414              break;
415         }
416         break;
417 #endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */
418 
419       case LL_RCC_I2S1_CLKSOURCE_PIN:          /* I2S1 Clock is External clock */
420       default:
421         i2s_frequency = EXTERNAL_CLOCK_VALUE;
422         break;
423     }
424   }
425 #if defined(RCC_DCKCFGR_I2S2SRC)
426   else
427   {
428     /* I2S2 CLK clock frequency */
429     switch (LL_RCC_GetI2SClockSource(I2SxSource))
430     {
431       case LL_RCC_I2S2_CLKSOURCE_PLLI2S:       /* I2S2 Clock is PLLI2S */
432         if (LL_RCC_PLLI2S_IsReady())
433         {
434           i2s_frequency = RCC_PLLI2S_GetFreqDomain_I2S();
435         }
436         break;
437 
438       case LL_RCC_I2S2_CLKSOURCE_PLL:          /* I2S2 Clock is PLL */
439         if (LL_RCC_PLL_IsReady())
440         {
441           i2s_frequency = RCC_PLL_GetFreqDomain_I2S();
442         }
443         break;
444 
445       case LL_RCC_I2S2_CLKSOURCE_PLLSRC:       /* I2S2 Clock is PLL Main source */
446         switch (LL_RCC_PLL_GetMainSource())
447         {
448            case LL_RCC_PLLSOURCE_HSE:          /* I2S2 Clock is HSE Osc. */
449              if (LL_RCC_HSE_IsReady())
450              {
451                i2s_frequency = HSE_VALUE;
452              }
453              break;
454 
455            case LL_RCC_PLLSOURCE_HSI:          /* I2S2 Clock is HSI Osc. */
456            default:
457              if (LL_RCC_HSI_IsReady())
458              {
459                i2s_frequency = HSI_VALUE;
460              }
461              break;
462         }
463         break;
464 
465       case LL_RCC_I2S2_CLKSOURCE_PIN:          /* I2S2 Clock is External clock */
466       default:
467         i2s_frequency = EXTERNAL_CLOCK_VALUE;
468         break;
469     }
470   }
471 #endif /* RCC_DCKCFGR_I2S2SRC */
472 
473   return i2s_frequency;
474 }
475 
476 #if defined(LPTIM1)
477 /**
478   * @brief  Return LPTIMx clock frequency
479   * @param  LPTIMxSource This parameter can be one of the following values:
480   *         @arg @ref LL_RCC_LPTIM1_CLKSOURCE
481   * @retval LPTIM clock frequency (in Hz)
482   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready
483   */
LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)484 uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
485 {
486   uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
487 
488   /* Check parameter */
489   assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
490 
491   if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE)
492   {
493     /* LPTIM1CLK clock frequency */
494     switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
495     {
496       case LL_RCC_LPTIM1_CLKSOURCE_LSI:    /* LPTIM1 Clock is LSI Osc. */
497         if (LL_RCC_LSI_IsReady())
498         {
499           lptim_frequency = LSI_VALUE;
500         }
501         break;
502 
503       case LL_RCC_LPTIM1_CLKSOURCE_HSI:    /* LPTIM1 Clock is HSI Osc. */
504         if (LL_RCC_HSI_IsReady())
505         {
506           lptim_frequency = HSI_VALUE;
507         }
508         break;
509 
510       case LL_RCC_LPTIM1_CLKSOURCE_LSE:    /* LPTIM1 Clock is LSE Osc. */
511         if (LL_RCC_LSE_IsReady())
512         {
513           lptim_frequency = LSE_VALUE;
514         }
515         break;
516 
517       case LL_RCC_LPTIM1_CLKSOURCE_PCLK1:  /* LPTIM1 Clock is PCLK1 */
518       default:
519         lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
520         break;
521     }
522   }
523 
524   return lptim_frequency;
525 }
526 #endif /* LPTIM1 */
527 
528 #if defined(SAI1)
529 /**
530   * @brief  Return SAIx clock frequency
531   * @param  SAIxSource This parameter can be one of the following values:
532   *         @arg @ref LL_RCC_SAI1_CLKSOURCE (*)
533   *         @arg @ref LL_RCC_SAI2_CLKSOURCE (*)
534   *         @arg @ref LL_RCC_SAI1_A_CLKSOURCE (*)
535   *         @arg @ref LL_RCC_SAI1_B_CLKSOURCE (*)
536   *
537   *         (*) value not defined in all devices.
538   * @retval SAI clock frequency (in Hz)
539   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
540   */
LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)541 uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
542 {
543   uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
544 
545   /* Check parameter */
546   assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
547 
548 #if defined(RCC_DCKCFGR_SAI1SRC)
549   if ((SAIxSource == LL_RCC_SAI1_CLKSOURCE) || (SAIxSource == LL_RCC_SAI2_CLKSOURCE))
550   {
551     /* SAI1CLK clock frequency */
552     switch (LL_RCC_GetSAIClockSource(SAIxSource))
553     {
554       case LL_RCC_SAI1_CLKSOURCE_PLLSAI:     /* PLLSAI clock used as SAI1 clock source */
555       case LL_RCC_SAI2_CLKSOURCE_PLLSAI:     /* PLLSAI clock used as SAI2 clock source */
556         if (LL_RCC_PLLSAI_IsReady())
557         {
558           sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI();
559         }
560         break;
561 
562       case LL_RCC_SAI1_CLKSOURCE_PLLI2S:     /* PLLI2S clock used as SAI1 clock source */
563       case LL_RCC_SAI2_CLKSOURCE_PLLI2S:     /* PLLI2S clock used as SAI2 clock source */
564         if (LL_RCC_PLLI2S_IsReady())
565         {
566           sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI();
567         }
568         break;
569 
570       case LL_RCC_SAI1_CLKSOURCE_PLL:        /* PLL clock used as SAI1 clock source */
571       case LL_RCC_SAI2_CLKSOURCE_PLL:        /* PLL clock used as SAI2 clock source */
572         if (LL_RCC_PLL_IsReady())
573         {
574           sai_frequency = RCC_PLL_GetFreqDomain_SAI();
575         }
576         break;
577 
578       case LL_RCC_SAI2_CLKSOURCE_PLLSRC:
579         switch (LL_RCC_PLL_GetMainSource())
580         {
581            case LL_RCC_PLLSOURCE_HSE:        /* HSE clock used as SAI2 clock source */
582              if (LL_RCC_HSE_IsReady())
583              {
584                sai_frequency = HSE_VALUE;
585              }
586              break;
587 
588            case LL_RCC_PLLSOURCE_HSI:        /* HSI clock used as SAI2 clock source */
589            default:
590              if (LL_RCC_HSI_IsReady())
591              {
592                sai_frequency = HSI_VALUE;
593              }
594              break;
595         }
596         break;
597 
598       case LL_RCC_SAI1_CLKSOURCE_PIN:        /* External input clock used as SAI1 clock source */
599       default:
600         sai_frequency = EXTERNAL_CLOCK_VALUE;
601         break;
602     }
603   }
604 #endif /* RCC_DCKCFGR_SAI1SRC */
605 #if defined(RCC_DCKCFGR_SAI1ASRC)
606   if ((SAIxSource == LL_RCC_SAI1_A_CLKSOURCE) || (SAIxSource == LL_RCC_SAI1_B_CLKSOURCE))
607   {
608     /* SAI1CLK clock frequency */
609     switch (LL_RCC_GetSAIClockSource(SAIxSource))
610     {
611 #if defined(RCC_PLLSAI_SUPPORT)
612       case LL_RCC_SAI1_A_CLKSOURCE_PLLSAI:     /* PLLSAI clock used as SAI1 Block A clock source */
613       case LL_RCC_SAI1_B_CLKSOURCE_PLLSAI:     /* PLLSAI clock used as SAI1 Block B clock source */
614         if (LL_RCC_PLLSAI_IsReady())
615         {
616           sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI();
617         }
618         break;
619 #endif /* RCC_PLLSAI_SUPPORT */
620 
621       case LL_RCC_SAI1_A_CLKSOURCE_PLLI2S:     /* PLLI2S clock used as SAI1 Block A clock source */
622       case LL_RCC_SAI1_B_CLKSOURCE_PLLI2S:     /* PLLI2S clock used as SAI1 Block B clock source */
623         if (LL_RCC_PLLI2S_IsReady())
624         {
625           sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI();
626         }
627         break;
628 
629 #if defined(RCC_SAI1A_PLLSOURCE_SUPPORT)
630       case LL_RCC_SAI1_A_CLKSOURCE_PLL:        /* PLL clock used as SAI1 Block A clock source */
631       case LL_RCC_SAI1_B_CLKSOURCE_PLL:        /* PLL clock used as SAI1 Block B clock source */
632         if (LL_RCC_PLL_IsReady())
633         {
634           sai_frequency = RCC_PLL_GetFreqDomain_SAI();
635         }
636         break;
637 
638       case LL_RCC_SAI1_A_CLKSOURCE_PLLSRC:
639       case LL_RCC_SAI1_B_CLKSOURCE_PLLSRC:
640         switch (LL_RCC_PLL_GetMainSource())
641         {
642            case LL_RCC_PLLSOURCE_HSE:          /* HSE clock used as SAI1 Block A or B clock source */
643              if (LL_RCC_HSE_IsReady())
644              {
645                sai_frequency = HSE_VALUE;
646              }
647              break;
648 
649            case LL_RCC_PLLSOURCE_HSI:          /* HSI clock used as SAI1 Block A or B clock source */
650            default:
651              if (LL_RCC_HSI_IsReady())
652              {
653                sai_frequency = HSI_VALUE;
654              }
655              break;
656         }
657         break;
658 #endif /* RCC_SAI1A_PLLSOURCE_SUPPORT */
659 
660       case LL_RCC_SAI1_A_CLKSOURCE_PIN:        /* External input clock used as SAI1 Block A clock source */
661       case LL_RCC_SAI1_B_CLKSOURCE_PIN:        /* External input clock used as SAI1 Block B clock source */
662       default:
663         sai_frequency = EXTERNAL_CLOCK_VALUE;
664         break;
665     }
666   }
667 #endif /* RCC_DCKCFGR_SAI1ASRC */
668 
669   return sai_frequency;
670 }
671 #endif /* SAI1 */
672 
673 #if defined(SDIO)
674 /**
675   * @brief  Return SDIOx clock frequency
676   * @param  SDIOxSource This parameter can be one of the following values:
677   *         @arg @ref LL_RCC_SDIO_CLKSOURCE
678   * @retval SDIO clock frequency (in Hz)
679   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
680   */
LL_RCC_GetSDIOClockFreq(uint32_t SDIOxSource)681 uint32_t LL_RCC_GetSDIOClockFreq(uint32_t SDIOxSource)
682 {
683   uint32_t SDIO_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
684 
685   /* Check parameter */
686   assert_param(IS_LL_RCC_SDIO_CLKSOURCE(SDIOxSource));
687 
688   if (SDIOxSource == LL_RCC_SDIO_CLKSOURCE)
689   {
690 #if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL)
691     /* SDIOCLK clock frequency */
692     switch (LL_RCC_GetSDIOClockSource(SDIOxSource))
693     {
694       case LL_RCC_SDIO_CLKSOURCE_PLL48CLK:         /* PLL48M clock used as SDIO clock source */
695         switch (LL_RCC_GetCK48MClockSource(LL_RCC_CK48M_CLKSOURCE))
696         {
697           case LL_RCC_CK48M_CLKSOURCE_PLL:         /* PLL clock used as 48Mhz domain clock */
698             if (LL_RCC_PLL_IsReady())
699             {
700               SDIO_frequency = RCC_PLL_GetFreqDomain_48M();
701             }
702           break;
703 
704 #if defined(RCC_PLLSAI_SUPPORT)
705           case LL_RCC_CK48M_CLKSOURCE_PLLSAI:      /* PLLSAI clock used as 48Mhz domain clock */
706           default:
707             if (LL_RCC_PLLSAI_IsReady())
708             {
709               SDIO_frequency = RCC_PLLSAI_GetFreqDomain_48M();
710             }
711             break;
712 #endif /* RCC_PLLSAI_SUPPORT */
713 
714 #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
715           case LL_RCC_CK48M_CLKSOURCE_PLLI2S:      /* PLLI2S clock used as 48Mhz domain clock */
716           default:
717             if (LL_RCC_PLLI2S_IsReady())
718             {
719               SDIO_frequency = RCC_PLLI2S_GetFreqDomain_48M();
720             }
721             break;
722 #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
723         }
724         break;
725 
726       case LL_RCC_SDIO_CLKSOURCE_SYSCLK:           /* PLL clock used as SDIO clock source */
727       default:
728       SDIO_frequency = RCC_GetSystemClockFreq();
729       break;
730     }
731 #else
732     /* PLL clock used as 48Mhz domain clock */
733     if (LL_RCC_PLL_IsReady())
734     {
735       SDIO_frequency = RCC_PLL_GetFreqDomain_48M();
736     }
737 #endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */
738   }
739 
740   return SDIO_frequency;
741 }
742 #endif /* SDIO */
743 
744 #if defined(RNG)
745 /**
746   * @brief  Return RNGx clock frequency
747   * @param  RNGxSource This parameter can be one of the following values:
748   *         @arg @ref LL_RCC_RNG_CLKSOURCE
749   * @retval RNG clock frequency (in Hz)
750   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
751   */
LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)752 uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
753 {
754   uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
755 
756   /* Check parameter */
757   assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource));
758 
759 #if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL)
760   /* RNGCLK clock frequency */
761   switch (LL_RCC_GetRNGClockSource(RNGxSource))
762   {
763 #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
764     case LL_RCC_RNG_CLKSOURCE_PLLI2S:        /* PLLI2S clock used as RNG clock source */
765       if (LL_RCC_PLLI2S_IsReady())
766       {
767         rng_frequency = RCC_PLLI2S_GetFreqDomain_48M();
768       }
769       break;
770 #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
771 
772 #if defined(RCC_PLLSAI_SUPPORT)
773     case LL_RCC_RNG_CLKSOURCE_PLLSAI:        /* PLLSAI clock used as RNG clock source */
774       if (LL_RCC_PLLSAI_IsReady())
775       {
776         rng_frequency = RCC_PLLSAI_GetFreqDomain_48M();
777       }
778       break;
779 #endif /* RCC_PLLSAI_SUPPORT */
780 
781     case LL_RCC_RNG_CLKSOURCE_PLL:           /* PLL clock used as RNG clock source */
782     default:
783       if (LL_RCC_PLL_IsReady())
784       {
785         rng_frequency = RCC_PLL_GetFreqDomain_48M();
786       }
787       break;
788   }
789 #else
790   /* PLL clock used as RNG clock source */
791   if (LL_RCC_PLL_IsReady())
792   {
793     rng_frequency = RCC_PLL_GetFreqDomain_48M();
794   }
795 #endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */
796 
797   return rng_frequency;
798 }
799 #endif /* RNG */
800 
801 #if defined(CEC)
802 /**
803   * @brief  Return CEC clock frequency
804   * @param  CECxSource This parameter can be one of the following values:
805   *         @arg @ref LL_RCC_CEC_CLKSOURCE
806   * @retval CEC clock frequency (in Hz)
807   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
808   */
LL_RCC_GetCECClockFreq(uint32_t CECxSource)809 uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource)
810 {
811   uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
812 
813   /* Check parameter */
814   assert_param(IS_LL_RCC_CEC_CLKSOURCE(CECxSource));
815 
816   /* CECCLK clock frequency */
817   switch (LL_RCC_GetCECClockSource(CECxSource))
818   {
819     case LL_RCC_CEC_CLKSOURCE_LSE:           /* CEC Clock is LSE Osc. */
820       if (LL_RCC_LSE_IsReady())
821       {
822         cec_frequency = LSE_VALUE;
823       }
824       break;
825 
826     case LL_RCC_CEC_CLKSOURCE_HSI_DIV488:    /* CEC Clock is HSI Osc. */
827     default:
828       if (LL_RCC_HSI_IsReady())
829       {
830         cec_frequency = HSI_VALUE/488U;
831       }
832       break;
833   }
834 
835   return cec_frequency;
836 }
837 #endif /* CEC */
838 
839 #if defined(USB_OTG_FS) || defined(USB_OTG_HS)
840 /**
841   * @brief  Return USBx clock frequency
842   * @param  USBxSource This parameter can be one of the following values:
843   *         @arg @ref LL_RCC_USB_CLKSOURCE
844   * @retval USB clock frequency (in Hz)
845   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
846   */
LL_RCC_GetUSBClockFreq(uint32_t USBxSource)847 uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
848 {
849   uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
850 
851   /* Check parameter */
852   assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource));
853 
854 #if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL)
855   /* USBCLK clock frequency */
856   switch (LL_RCC_GetUSBClockSource(USBxSource))
857   {
858 #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
859     case LL_RCC_USB_CLKSOURCE_PLLI2S:       /* PLLI2S clock used as USB clock source */
860       if (LL_RCC_PLLI2S_IsReady())
861       {
862         usb_frequency = RCC_PLLI2S_GetFreqDomain_48M();
863       }
864       break;
865 
866 #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
867 
868 #if defined(RCC_PLLSAI_SUPPORT)
869     case LL_RCC_USB_CLKSOURCE_PLLSAI:       /* PLLSAI clock used as USB clock source */
870       if (LL_RCC_PLLSAI_IsReady())
871       {
872         usb_frequency = RCC_PLLSAI_GetFreqDomain_48M();
873       }
874       break;
875 #endif /* RCC_PLLSAI_SUPPORT */
876 
877     case LL_RCC_USB_CLKSOURCE_PLL:          /* PLL clock used as USB clock source */
878     default:
879       if (LL_RCC_PLL_IsReady())
880       {
881         usb_frequency = RCC_PLL_GetFreqDomain_48M();
882       }
883       break;
884   }
885 #else
886   /* PLL clock used as USB clock source */
887   if (LL_RCC_PLL_IsReady())
888   {
889     usb_frequency = RCC_PLL_GetFreqDomain_48M();
890   }
891 #endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */
892 
893   return usb_frequency;
894 }
895 #endif /* USB_OTG_FS || USB_OTG_HS */
896 
897 #if defined(DFSDM1_Channel0)
898 /**
899   * @brief  Return DFSDMx clock frequency
900   * @param  DFSDMxSource This parameter can be one of the following values:
901   *         @arg @ref LL_RCC_DFSDM1_CLKSOURCE
902   *         @arg @ref LL_RCC_DFSDM2_CLKSOURCE (*)
903   *
904   *         (*) value not defined in all devices.
905   * @retval DFSDM clock frequency (in Hz)
906   */
LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource)907 uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource)
908 {
909   uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
910 
911   /* Check parameter */
912   assert_param(IS_LL_RCC_DFSDM_CLKSOURCE(DFSDMxSource));
913 
914   if (DFSDMxSource == LL_RCC_DFSDM1_CLKSOURCE)
915   {
916     /* DFSDM1CLK clock frequency */
917     switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
918     {
919       case LL_RCC_DFSDM1_CLKSOURCE_SYSCLK:      /* DFSDM1 Clock is SYSCLK */
920         dfsdm_frequency = RCC_GetSystemClockFreq();
921         break;
922 
923       case LL_RCC_DFSDM1_CLKSOURCE_PCLK2:       /* DFSDM1 Clock is PCLK2 */
924       default:
925         dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
926         break;
927     }
928   }
929 #if defined(DFSDM2_Channel0)
930   else
931   {
932     /* DFSDM2CLK clock frequency */
933     switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
934     {
935       case LL_RCC_DFSDM2_CLKSOURCE_SYSCLK:      /* DFSDM2 Clock is SYSCLK */
936         dfsdm_frequency = RCC_GetSystemClockFreq();
937         break;
938 
939       case LL_RCC_DFSDM2_CLKSOURCE_PCLK2:       /* DFSDM2 Clock is PCLK2 */
940       default:
941         dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
942         break;
943     }
944   }
945 #endif /* DFSDM2_Channel0 */
946 
947   return dfsdm_frequency;
948 }
949 
950 /**
951   * @brief  Return DFSDMx Audio clock frequency
952   * @param  DFSDMxSource This parameter can be one of the following values:
953   *         @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE
954   *         @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE (*)
955   *
956   *         (*) value not defined in all devices.
957   * @retval DFSDM clock frequency (in Hz)
958   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
959   */
LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource)960 uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource)
961 {
962   uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
963 
964   /* Check parameter */
965   assert_param(IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(DFSDMxSource));
966 
967   if (DFSDMxSource == LL_RCC_DFSDM1_AUDIO_CLKSOURCE)
968   {
969     /* DFSDM1CLK clock frequency */
970     switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource))
971     {
972       case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1:     /* I2S1 clock used as DFSDM1 clock */
973         dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S1_CLKSOURCE);
974         break;
975 
976       case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2:     /* I2S2 clock used as DFSDM1 clock */
977       default:
978         dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S2_CLKSOURCE);
979         break;
980     }
981   }
982 #if defined(DFSDM2_Channel0)
983   else
984   {
985     /* DFSDM2CLK clock frequency */
986     switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource))
987     {
988       case LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1:     /* I2S1 clock used as DFSDM2 clock */
989         dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S1_CLKSOURCE);
990         break;
991 
992       case LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2:     /* I2S2 clock used as DFSDM2 clock */
993       default:
994         dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S2_CLKSOURCE);
995         break;
996     }
997   }
998 #endif /* DFSDM2_Channel0 */
999 
1000   return dfsdm_frequency;
1001 }
1002 #endif /* DFSDM1_Channel0 */
1003 
1004 #if defined(DSI)
1005 /**
1006   * @brief  Return DSI clock frequency
1007   * @param  DSIxSource This parameter can be one of the following values:
1008   *         @arg @ref LL_RCC_DSI_CLKSOURCE
1009   * @retval DSI clock frequency (in Hz)
1010   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
1011   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used
1012   */
LL_RCC_GetDSIClockFreq(uint32_t DSIxSource)1013 uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource)
1014 {
1015   uint32_t dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1016 
1017   /* Check parameter */
1018   assert_param(IS_LL_RCC_DSI_CLKSOURCE(DSIxSource));
1019 
1020   /* DSICLK clock frequency */
1021   switch (LL_RCC_GetDSIClockSource(DSIxSource))
1022   {
1023     case LL_RCC_DSI_CLKSOURCE_PLL:     /* DSI Clock is PLL Osc. */
1024       if (LL_RCC_PLL_IsReady())
1025       {
1026         dsi_frequency = RCC_PLL_GetFreqDomain_DSI();
1027       }
1028       break;
1029 
1030     case LL_RCC_DSI_CLKSOURCE_PHY:    /* DSI Clock is DSI physical clock. */
1031     default:
1032       dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
1033       break;
1034   }
1035 
1036   return dsi_frequency;
1037 }
1038 #endif /* DSI */
1039 
1040 #if defined(LTDC)
1041 /**
1042   * @brief  Return LTDC clock frequency
1043   * @param  LTDCxSource This parameter can be one of the following values:
1044   *         @arg @ref LL_RCC_LTDC_CLKSOURCE
1045   * @retval LTDC clock frequency (in Hz)
1046   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator PLLSAI is not ready
1047   */
LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource)1048 uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource)
1049 {
1050   uint32_t ltdc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1051 
1052   /* Check parameter */
1053   assert_param(IS_LL_RCC_LTDC_CLKSOURCE(LTDCxSource));
1054 
1055   if (LL_RCC_PLLSAI_IsReady())
1056   {
1057      ltdc_frequency = RCC_PLLSAI_GetFreqDomain_LTDC();
1058   }
1059 
1060   return ltdc_frequency;
1061 }
1062 #endif /* LTDC */
1063 
1064 #if defined(SPDIFRX)
1065 /**
1066   * @brief  Return SPDIFRX clock frequency
1067   * @param  SPDIFRXxSource This parameter can be one of the following values:
1068   *         @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE
1069   * @retval SPDIFRX clock frequency (in Hz)
1070   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
1071   */
LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource)1072 uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource)
1073 {
1074   uint32_t spdifrx_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1075 
1076   /* Check parameter */
1077   assert_param(IS_LL_RCC_SPDIFRX_CLKSOURCE(SPDIFRXxSource));
1078 
1079   /* SPDIFRX1CLK clock frequency */
1080   switch (LL_RCC_GetSPDIFRXClockSource(SPDIFRXxSource))
1081   {
1082     case LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S:  /* SPDIFRX Clock is PLLI2S Osc. */
1083       if (LL_RCC_PLLI2S_IsReady())
1084       {
1085         spdifrx_frequency = RCC_PLLI2S_GetFreqDomain_SPDIFRX();
1086       }
1087       break;
1088 
1089     case LL_RCC_SPDIFRX1_CLKSOURCE_PLL:     /* SPDIFRX Clock is PLL Osc. */
1090     default:
1091       if (LL_RCC_PLL_IsReady())
1092       {
1093         spdifrx_frequency = RCC_PLL_GetFreqDomain_SPDIFRX();
1094       }
1095       break;
1096   }
1097 
1098   return spdifrx_frequency;
1099 }
1100 #endif /* SPDIFRX */
1101 
1102 /**
1103   * @}
1104   */
1105 
1106 /**
1107   * @}
1108   */
1109 
1110 /** @addtogroup RCC_LL_Private_Functions
1111   * @{
1112   */
1113 
1114 /**
1115   * @brief  Return SYSTEM clock frequency
1116   * @retval SYSTEM clock frequency (in Hz)
1117   */
RCC_GetSystemClockFreq(void)1118 uint32_t RCC_GetSystemClockFreq(void)
1119 {
1120   uint32_t frequency = 0U;
1121 
1122   /* Get SYSCLK source -------------------------------------------------------*/
1123   switch (LL_RCC_GetSysClkSource())
1124   {
1125     case LL_RCC_SYS_CLKSOURCE_STATUS_HSI:  /* HSI used as system clock  source */
1126       frequency = HSI_VALUE;
1127       break;
1128 
1129     case LL_RCC_SYS_CLKSOURCE_STATUS_HSE:  /* HSE used as system clock  source */
1130       frequency = HSE_VALUE;
1131       break;
1132 
1133     case LL_RCC_SYS_CLKSOURCE_STATUS_PLL:  /* PLL used as system clock  source */
1134       frequency = RCC_PLL_GetFreqDomain_SYS(LL_RCC_SYS_CLKSOURCE_STATUS_PLL);
1135       break;
1136 
1137 #if defined(RCC_PLLR_SYSCLK_SUPPORT)
1138     case LL_RCC_SYS_CLKSOURCE_STATUS_PLLR: /* PLLR used as system clock  source */
1139       frequency = RCC_PLL_GetFreqDomain_SYS(LL_RCC_SYS_CLKSOURCE_STATUS_PLLR);
1140       break;
1141 #endif /* RCC_PLLR_SYSCLK_SUPPORT */
1142 
1143     default:
1144       frequency = HSI_VALUE;
1145       break;
1146   }
1147 
1148   return frequency;
1149 }
1150 
1151 /**
1152   * @brief  Return HCLK clock frequency
1153   * @param  SYSCLK_Frequency SYSCLK clock frequency
1154   * @retval HCLK clock frequency (in Hz)
1155   */
RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)1156 uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
1157 {
1158   /* HCLK clock frequency */
1159   return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
1160 }
1161 
1162 /**
1163   * @brief  Return PCLK1 clock frequency
1164   * @param  HCLK_Frequency HCLK clock frequency
1165   * @retval PCLK1 clock frequency (in Hz)
1166   */
RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)1167 uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
1168 {
1169   /* PCLK1 clock frequency */
1170   return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
1171 }
1172 
1173 /**
1174   * @brief  Return PCLK2 clock frequency
1175   * @param  HCLK_Frequency HCLK clock frequency
1176   * @retval PCLK2 clock frequency (in Hz)
1177   */
RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)1178 uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
1179 {
1180   /* PCLK2 clock frequency */
1181   return __LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
1182 }
1183 
1184 /**
1185   * @brief  Return PLL clock frequency used for system domain
1186   * @param  SYSCLK_Source System clock source
1187   * @retval PLL clock frequency (in Hz)
1188   */
RCC_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source)1189 uint32_t RCC_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source)
1190 {
1191   uint32_t pllinputfreq = 0U, pllsource = 0U, plloutputfreq = 0U;
1192 
1193   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
1194      SYSCLK = PLL_VCO / (PLLP or PLLR)
1195   */
1196   pllsource = LL_RCC_PLL_GetMainSource();
1197 
1198   switch (pllsource)
1199   {
1200     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
1201       pllinputfreq = HSI_VALUE;
1202       break;
1203 
1204     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
1205       pllinputfreq = HSE_VALUE;
1206       break;
1207 
1208     default:
1209       pllinputfreq = HSI_VALUE;
1210       break;
1211   }
1212 
1213   if (SYSCLK_Source == LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
1214   {
1215     plloutputfreq = __LL_RCC_CALC_PLLCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1216                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP());
1217   }
1218 #if defined(RCC_PLLR_SYSCLK_SUPPORT)
1219   else
1220   {
1221     plloutputfreq = __LL_RCC_CALC_PLLRCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1222                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
1223   }
1224 #endif /* RCC_PLLR_SYSCLK_SUPPORT */
1225 
1226   return plloutputfreq;
1227 }
1228 
1229 /**
1230   * @brief  Return PLL clock frequency used for 48 MHz domain
1231   * @retval PLL clock frequency (in Hz)
1232   */
RCC_PLL_GetFreqDomain_48M(void)1233 uint32_t RCC_PLL_GetFreqDomain_48M(void)
1234 {
1235   uint32_t pllinputfreq = 0U, pllsource = 0U;
1236 
1237   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN
1238      48M Domain clock = PLL_VCO / PLLQ
1239   */
1240   pllsource = LL_RCC_PLL_GetMainSource();
1241 
1242   switch (pllsource)
1243   {
1244     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
1245       pllinputfreq = HSI_VALUE;
1246       break;
1247 
1248     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
1249       pllinputfreq = HSE_VALUE;
1250       break;
1251 
1252     default:
1253       pllinputfreq = HSI_VALUE;
1254       break;
1255   }
1256   return __LL_RCC_CALC_PLLCLK_48M_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1257                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
1258 }
1259 
1260 #if defined(DSI)
1261 /**
1262   * @brief  Return PLL clock frequency used for DSI clock
1263   * @retval PLL clock frequency (in Hz)
1264   */
RCC_PLL_GetFreqDomain_DSI(void)1265 uint32_t RCC_PLL_GetFreqDomain_DSI(void)
1266 {
1267   uint32_t pllinputfreq = 0U, pllsource = 0U;
1268 
1269   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
1270      DSICLK = PLL_VCO / PLLR
1271   */
1272   pllsource = LL_RCC_PLL_GetMainSource();
1273 
1274   switch (pllsource)
1275   {
1276     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
1277       pllinputfreq = HSE_VALUE;
1278       break;
1279 
1280     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
1281     default:
1282       pllinputfreq = HSI_VALUE;
1283       break;
1284   }
1285   return __LL_RCC_CALC_PLLCLK_DSI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1286                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
1287 }
1288 #endif /* DSI */
1289 
1290 #if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC)
1291 /**
1292   * @brief  Return PLL clock frequency used for I2S clock
1293   * @retval PLL clock frequency (in Hz)
1294   */
RCC_PLL_GetFreqDomain_I2S(void)1295 uint32_t RCC_PLL_GetFreqDomain_I2S(void)
1296 {
1297   uint32_t pllinputfreq = 0U, pllsource = 0U;
1298 
1299   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
1300      I2SCLK = PLL_VCO / PLLR
1301   */
1302   pllsource = LL_RCC_PLL_GetMainSource();
1303 
1304   switch (pllsource)
1305   {
1306     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
1307       pllinputfreq = HSE_VALUE;
1308       break;
1309 
1310     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
1311     default:
1312       pllinputfreq = HSI_VALUE;
1313       break;
1314   }
1315   return __LL_RCC_CALC_PLLCLK_I2S_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1316                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
1317 }
1318 #endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */
1319 
1320 #if defined(SPDIFRX)
1321 /**
1322   * @brief  Return PLL clock frequency used for SPDIFRX clock
1323   * @retval PLL clock frequency (in Hz)
1324   */
RCC_PLL_GetFreqDomain_SPDIFRX(void)1325 uint32_t RCC_PLL_GetFreqDomain_SPDIFRX(void)
1326 {
1327   uint32_t pllinputfreq = 0U, pllsource = 0U;
1328 
1329   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
1330      SPDIFRXCLK = PLL_VCO / PLLR
1331   */
1332   pllsource = LL_RCC_PLL_GetMainSource();
1333 
1334   switch (pllsource)
1335   {
1336     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
1337       pllinputfreq = HSE_VALUE;
1338       break;
1339 
1340     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
1341     default:
1342       pllinputfreq = HSI_VALUE;
1343       break;
1344   }
1345   return __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1346                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
1347 }
1348 #endif /* SPDIFRX */
1349 
1350 #if defined(RCC_PLLCFGR_PLLR)
1351 #if defined(SAI1)
1352 /**
1353   * @brief  Return PLL clock frequency used for SAI clock
1354   * @retval PLL clock frequency (in Hz)
1355   */
RCC_PLL_GetFreqDomain_SAI(void)1356 uint32_t RCC_PLL_GetFreqDomain_SAI(void)
1357 {
1358   uint32_t pllinputfreq = 0U, pllsource = 0U, plloutputfreq = 0U;
1359 
1360   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
1361      SAICLK = (PLL_VCO / PLLR) / PLLDIVR
1362      or
1363      SAICLK = PLL_VCO / PLLR
1364   */
1365   pllsource = LL_RCC_PLL_GetMainSource();
1366 
1367   switch (pllsource)
1368   {
1369     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
1370       pllinputfreq = HSE_VALUE;
1371       break;
1372 
1373     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
1374     default:
1375       pllinputfreq = HSI_VALUE;
1376       break;
1377   }
1378 
1379 #if defined(RCC_DCKCFGR_PLLDIVR)
1380   plloutputfreq = __LL_RCC_CALC_PLLCLK_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1381                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR(), LL_RCC_PLL_GetDIVR());
1382 #else
1383   plloutputfreq = __LL_RCC_CALC_PLLCLK_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1384                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
1385 #endif /* RCC_DCKCFGR_PLLDIVR */
1386 
1387   return plloutputfreq;
1388 }
1389 #endif /* SAI1 */
1390 #endif /* RCC_PLLCFGR_PLLR */
1391 
1392 #if defined(RCC_PLLSAI_SUPPORT)
1393 /**
1394   * @brief  Return PLLSAI clock frequency used for SAI domain
1395   * @retval PLLSAI clock frequency (in Hz)
1396   */
RCC_PLLSAI_GetFreqDomain_SAI(void)1397 uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void)
1398 {
1399   uint32_t pllinputfreq = 0U, pllsource = 0U;
1400 
1401   /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN
1402      SAI domain clock  = (PLLSAI_VCO / PLLSAIQ) / PLLSAIDIVQ
1403   */
1404   pllsource = LL_RCC_PLL_GetMainSource();
1405 
1406   switch (pllsource)
1407   {
1408     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI clock source */
1409       pllinputfreq = HSI_VALUE;
1410       break;
1411 
1412     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI clock source */
1413       pllinputfreq = HSE_VALUE;
1414       break;
1415 
1416     default:
1417       pllinputfreq = HSI_VALUE;
1418       break;
1419   }
1420   return __LL_RCC_CALC_PLLSAI_SAI_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(),
1421                                         LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetQ(), LL_RCC_PLLSAI_GetDIVQ());
1422 }
1423 
1424 #if defined(RCC_PLLSAICFGR_PLLSAIP)
1425 /**
1426   * @brief  Return PLLSAI clock frequency used for 48Mhz domain
1427   * @retval PLLSAI clock frequency (in Hz)
1428   */
RCC_PLLSAI_GetFreqDomain_48M(void)1429 uint32_t RCC_PLLSAI_GetFreqDomain_48M(void)
1430 {
1431   uint32_t pllinputfreq = 0U, pllsource = 0U;
1432 
1433   /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN
1434      48M Domain clock  = PLLSAI_VCO / PLLSAIP
1435   */
1436   pllsource = LL_RCC_PLL_GetMainSource();
1437 
1438   switch (pllsource)
1439   {
1440     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI clock source */
1441       pllinputfreq = HSI_VALUE;
1442       break;
1443 
1444     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI clock source */
1445       pllinputfreq = HSE_VALUE;
1446       break;
1447 
1448     default:
1449       pllinputfreq = HSI_VALUE;
1450       break;
1451   }
1452   return __LL_RCC_CALC_PLLSAI_48M_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(),
1453                                         LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetP());
1454 }
1455 #endif /* RCC_PLLSAICFGR_PLLSAIP */
1456 
1457 #if defined(LTDC)
1458 /**
1459   * @brief  Return PLLSAI clock frequency used for LTDC domain
1460   * @retval PLLSAI clock frequency (in Hz)
1461   */
RCC_PLLSAI_GetFreqDomain_LTDC(void)1462 uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void)
1463 {
1464   uint32_t pllinputfreq = 0U, pllsource = 0U;
1465 
1466   /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN
1467      LTDC Domain clock  = (PLLSAI_VCO / PLLSAIR) / PLLSAIDIVR
1468   */
1469   pllsource = LL_RCC_PLL_GetMainSource();
1470 
1471   switch (pllsource)
1472   {
1473     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI clock source */
1474       pllinputfreq = HSI_VALUE;
1475       break;
1476 
1477     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI clock source */
1478       pllinputfreq = HSE_VALUE;
1479       break;
1480 
1481     default:
1482       pllinputfreq = HSI_VALUE;
1483       break;
1484   }
1485   return __LL_RCC_CALC_PLLSAI_LTDC_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(),
1486                                         LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetR(), LL_RCC_PLLSAI_GetDIVR());
1487 }
1488 #endif /* LTDC */
1489 #endif /* RCC_PLLSAI_SUPPORT */
1490 
1491 #if defined(RCC_PLLI2S_SUPPORT)
1492 #if defined(SAI1)
1493 /**
1494   * @brief  Return PLLI2S clock frequency used for SAI domains
1495   * @retval PLLI2S clock frequency (in Hz)
1496   */
RCC_PLLI2S_GetFreqDomain_SAI(void)1497 uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void)
1498 {
1499   uint32_t plli2sinputfreq = 0U, plli2ssource = 0U, plli2soutputfreq = 0U;
1500 
1501   /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
1502      SAI domain clock  = (PLLI2S_VCO / PLLI2SQ) / PLLI2SDIVQ
1503      or
1504      SAI domain clock  = (PLLI2S_VCO / PLLI2SR) / PLLI2SDIVR
1505   */
1506   plli2ssource = LL_RCC_PLLI2S_GetMainSource();
1507 
1508   switch (plli2ssource)
1509   {
1510     case LL_RCC_PLLSOURCE_HSE:     /* HSE used as PLLI2S clock source */
1511       plli2sinputfreq = HSE_VALUE;
1512       break;
1513 
1514 #if defined(RCC_PLLI2SCFGR_PLLI2SSRC)
1515     case LL_RCC_PLLI2SSOURCE_PIN:  /* External pin input clock used as PLLI2S clock source */
1516       plli2sinputfreq = EXTERNAL_CLOCK_VALUE;
1517       break;
1518 #endif /* RCC_PLLI2SCFGR_PLLI2SSRC */
1519 
1520     case LL_RCC_PLLSOURCE_HSI:     /* HSI used as PLLI2S clock source */
1521     default:
1522       plli2sinputfreq = HSI_VALUE;
1523       break;
1524   }
1525 
1526 #if defined(RCC_DCKCFGR_PLLI2SDIVQ)
1527   plli2soutputfreq = __LL_RCC_CALC_PLLI2S_SAI_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
1528                                           LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetQ(), LL_RCC_PLLI2S_GetDIVQ());
1529 #else
1530   plli2soutputfreq = __LL_RCC_CALC_PLLI2S_SAI_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
1531                                           LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetR(), LL_RCC_PLLI2S_GetDIVR());
1532 #endif /* RCC_DCKCFGR_PLLI2SDIVQ */
1533 
1534   return plli2soutputfreq;
1535 }
1536 #endif /* SAI1 */
1537 
1538 #if defined(SPDIFRX)
1539 /**
1540   * @brief  Return PLLI2S clock frequency used for SPDIFRX domain
1541   * @retval PLLI2S clock frequency (in Hz)
1542   */
RCC_PLLI2S_GetFreqDomain_SPDIFRX(void)1543 uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void)
1544 {
1545   uint32_t pllinputfreq = 0U, pllsource = 0U;
1546 
1547   /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
1548      SPDIFRX Domain clock  = PLLI2S_VCO / PLLI2SP
1549   */
1550   pllsource = LL_RCC_PLLI2S_GetMainSource();
1551 
1552   switch (pllsource)
1553   {
1554     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLI2S clock source */
1555       pllinputfreq = HSE_VALUE;
1556       break;
1557 
1558     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLI2S clock source */
1559     default:
1560       pllinputfreq = HSI_VALUE;
1561       break;
1562   }
1563 
1564   return __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(pllinputfreq, LL_RCC_PLLI2S_GetDivider(),
1565                                            LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetP());
1566 }
1567 #endif /* SPDIFRX */
1568 
1569 /**
1570   * @brief  Return PLLI2S clock frequency used for I2S domain
1571   * @retval PLLI2S clock frequency (in Hz)
1572   */
RCC_PLLI2S_GetFreqDomain_I2S(void)1573 uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void)
1574 {
1575   uint32_t plli2sinputfreq = 0U, plli2ssource = 0U, plli2soutputfreq = 0U;
1576 
1577   /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
1578      I2S Domain clock  = PLLI2S_VCO / PLLI2SR
1579   */
1580   plli2ssource = LL_RCC_PLLI2S_GetMainSource();
1581 
1582   switch (plli2ssource)
1583   {
1584     case LL_RCC_PLLSOURCE_HSE:     /* HSE used as PLLI2S clock source */
1585       plli2sinputfreq = HSE_VALUE;
1586       break;
1587 
1588 #if defined(RCC_PLLI2SCFGR_PLLI2SSRC)
1589     case LL_RCC_PLLI2SSOURCE_PIN:  /* External pin input clock used as PLLI2S clock source */
1590       plli2sinputfreq = EXTERNAL_CLOCK_VALUE;
1591       break;
1592 #endif /* RCC_PLLI2SCFGR_PLLI2SSRC */
1593 
1594     case LL_RCC_PLLSOURCE_HSI:     /* HSI used as PLLI2S clock source */
1595     default:
1596       plli2sinputfreq = HSI_VALUE;
1597       break;
1598   }
1599 
1600   plli2soutputfreq = __LL_RCC_CALC_PLLI2S_I2S_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
1601                                                    LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetR());
1602 
1603   return plli2soutputfreq;
1604 }
1605 
1606 #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
1607 /**
1608   * @brief  Return PLLI2S clock frequency used for 48Mhz domain
1609   * @retval PLLI2S clock frequency (in Hz)
1610   */
RCC_PLLI2S_GetFreqDomain_48M(void)1611 uint32_t RCC_PLLI2S_GetFreqDomain_48M(void)
1612 {
1613   uint32_t plli2sinputfreq = 0U, plli2ssource = 0U, plli2soutputfreq = 0U;
1614 
1615   /* PLL48M_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
1616      48M Domain clock  = PLLI2S_VCO / PLLI2SQ
1617   */
1618   plli2ssource = LL_RCC_PLLI2S_GetMainSource();
1619 
1620   switch (plli2ssource)
1621   {
1622     case LL_RCC_PLLSOURCE_HSE:     /* HSE used as PLLI2S clock source */
1623       plli2sinputfreq = HSE_VALUE;
1624       break;
1625 
1626 #if defined(RCC_PLLI2SCFGR_PLLI2SSRC)
1627     case LL_RCC_PLLI2SSOURCE_PIN:  /* External pin input clock used as PLLI2S clock source */
1628       plli2sinputfreq = EXTERNAL_CLOCK_VALUE;
1629       break;
1630 #endif /* RCC_PLLI2SCFGR_PLLI2SSRC */
1631 
1632     case LL_RCC_PLLSOURCE_HSI:     /* HSI used as PLLI2S clock source */
1633     default:
1634       plli2sinputfreq = HSI_VALUE;
1635       break;
1636   }
1637 
1638   plli2soutputfreq = __LL_RCC_CALC_PLLI2S_48M_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
1639                                                    LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetQ());
1640 
1641   return plli2soutputfreq;
1642 }
1643 #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
1644 #endif /* RCC_PLLI2S_SUPPORT */
1645 /**
1646   * @}
1647   */
1648 
1649 /**
1650   * @}
1651   */
1652 
1653 #endif /* defined(RCC) */
1654 
1655 /**
1656   * @}
1657   */
1658 
1659 #endif /* USE_FULL_LL_DRIVER */
1660 
1661