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