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