1 /**
2 ******************************************************************************
3 * @file stm32h5xx_ll_rcc.c
4 * @author MCD Application Team
5 * @brief RCC LL module driver.
6 ******************************************************************************
7 * @attention
8 *
9 * Copyright (c) 2023 STMicroelectronics.
10 * All rights reserved.
11 *
12 * This software is licensed under terms that can be found in the LICENSE file
13 * in the root directory of this software component.
14 * If no LICENSE file comes with this software, it is provided AS-IS.
15 *
16 ******************************************************************************
17 */
18 #if defined(USE_FULL_LL_DRIVER)
19
20 /* Includes ------------------------------------------------------------------*/
21 #include "stm32h5xx_ll_rcc.h"
22 #ifdef USE_FULL_ASSERT
23 #include "stm32_assert.h"
24 #else
25 #define assert_param(expr) ((void)0U)
26 #endif /* USE_FULL_ASSERT */
27 /** @addtogroup STM32H5xx_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 #if defined(USART10)
45 #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
46 || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \
47 || ((__VALUE__) == LL_RCC_USART3_CLKSOURCE) \
48 || ((__VALUE__) == LL_RCC_USART6_CLKSOURCE) \
49 || ((__VALUE__) == LL_RCC_USART10_CLKSOURCE) \
50 || ((__VALUE__) == LL_RCC_USART11_CLKSOURCE))
51 #elif defined(USART6)
52 #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
53 || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \
54 || ((__VALUE__) == LL_RCC_USART3_CLKSOURCE) \
55 || ((__VALUE__) == LL_RCC_USART6_CLKSOURCE))
56 #else
57 #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
58 || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \
59 || ((__VALUE__) == LL_RCC_USART3_CLKSOURCE))
60 #endif /* USART6 */
61
62 #if defined(UART7)
63 #define IS_LL_RCC_UART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_UART4_CLKSOURCE) \
64 || ((__VALUE__) == LL_RCC_UART5_CLKSOURCE) \
65 || ((__VALUE__) == LL_RCC_UART7_CLKSOURCE) \
66 || ((__VALUE__) == LL_RCC_UART8_CLKSOURCE) \
67 || ((__VALUE__) == LL_RCC_UART9_CLKSOURCE) \
68 || ((__VALUE__) == LL_RCC_UART12_CLKSOURCE))
69 #elif defined(UART5)
70 #define IS_LL_RCC_UART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_UART4_CLKSOURCE) \
71 || ((__VALUE__) == LL_RCC_UART5_CLKSOURCE))
72 #endif /* UART7 */
73
74 #define IS_LL_RCC_LPUART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPUART1_CLKSOURCE))
75
76 #if defined(I2C4)
77 #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
78 || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
79 || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE) \
80 || ((__VALUE__) == LL_RCC_I2C4_CLKSOURCE))
81 #elif defined(I2C3)
82 #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
83 || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
84 || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE))
85 #else
86 #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
87 || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE))
88 #endif /* I2C3*/
89
90 #if defined(I3C2)
91 #define IS_LL_RCC_I3C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I3C1_CLKSOURCE) \
92 || ((__VALUE__) == LL_RCC_I3C2_CLKSOURCE))
93 #else
94 #define IS_LL_RCC_I3C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I3C1_CLKSOURCE))
95 #endif /* I3C2 */
96
97 #if defined(SPI5)
98 #define IS_LL_RCC_SPI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPI1_CLKSOURCE) \
99 || ((__VALUE__) == LL_RCC_SPI2_CLKSOURCE) \
100 || ((__VALUE__) == LL_RCC_SPI3_CLKSOURCE) \
101 || ((__VALUE__) == LL_RCC_SPI4_CLKSOURCE) \
102 || ((__VALUE__) == LL_RCC_SPI5_CLKSOURCE) \
103 || ((__VALUE__) == LL_RCC_SPI6_CLKSOURCE))
104 #elif defined(SPI4)
105 #define IS_LL_RCC_SPI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPI1_CLKSOURCE) \
106 || ((__VALUE__) == LL_RCC_SPI2_CLKSOURCE) \
107 || ((__VALUE__) == LL_RCC_SPI3_CLKSOURCE) \
108 || ((__VALUE__) == LL_RCC_SPI4_CLKSOURCE))
109 #else
110 #define IS_LL_RCC_SPI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPI1_CLKSOURCE) \
111 || ((__VALUE__) == LL_RCC_SPI2_CLKSOURCE) \
112 || ((__VALUE__) == LL_RCC_SPI3_CLKSOURCE))
113 #endif /* SPI5 */
114
115 #if defined(LPTIM3)
116 #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE) \
117 || ((__VALUE__) == LL_RCC_LPTIM2_CLKSOURCE) \
118 || ((__VALUE__) == LL_RCC_LPTIM3_CLKSOURCE) \
119 || ((__VALUE__) == LL_RCC_LPTIM4_CLKSOURCE) \
120 || ((__VALUE__) == LL_RCC_LPTIM5_CLKSOURCE) \
121 || ((__VALUE__) == LL_RCC_LPTIM6_CLKSOURCE))
122 #else
123 #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE) \
124 || ((__VALUE__) == LL_RCC_LPTIM2_CLKSOURCE))
125 #endif /* LPTIM3 */
126
127 #if defined(SAI1)
128 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
129 || ((__VALUE__) == LL_RCC_SAI2_CLKSOURCE))
130 #endif /* SAI1 */
131
132 #if defined (SDMMC2)
133 #define IS_LL_RCC_SDMMC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SDMMC1_CLKSOURCE) \
134 || ((__VALUE__) == LL_RCC_SDMMC2_CLKSOURCE))
135 #elif defined (SDMMC1)
136 #define IS_LL_RCC_SDMMC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SDMMC1_CLKSOURCE))
137 #endif /* SDMMC2*/
138
139 #define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_RNG_CLKSOURCE))
140
141 #if defined(USB_DRD_FS)
142 #define IS_LL_RCC_USB_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USB_CLKSOURCE))
143 #endif /* USB_DRD_FS */
144
145 #define IS_LL_RCC_ADCDAC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_ADCDAC_CLKSOURCE))
146
147 #define IS_LL_RCC_DAC_LP_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DAC_LP_CLKSOURCE))
148
149 #define IS_LL_RCC_OCTOSPI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_OCTOSPI_CLKSOURCE))
150
151 #define IS_LL_RCC_FDCAN_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_FDCAN_CLKSOURCE)
152
153 #if defined(CEC)
154 #define IS_LL_RCC_CEC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_CEC_CLKSOURCE))
155 #endif /* CEC */
156
157 /**
158 * @}
159 */
160
161 /* Private function prototypes -----------------------------------------------*/
162 /** @defgroup RCC_LL_Private_Functions RCC Private functions
163 * @{
164 */
165 uint32_t RCC_GetSystemClockFreq(void);
166 uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
167 uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
168 uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
169 uint32_t RCC_GetPCLK3ClockFreq(uint32_t HCLK_Frequency);
170 uint32_t RCC_PLL1_GetFreqSystem(void);
171 /**
172 * @}
173 */
174
175 /* Exported functions --------------------------------------------------------*/
176 /** @addtogroup RCC_LL_Exported_Functions
177 * @{
178 */
179
180 /** @addtogroup RCC_LL_EF_Init
181 * @{
182 */
183
184 /**
185 * @brief Reset the RCC clock configuration to the default reset state.
186 * @note The default reset state of the clock configuration is given below:
187 * - HSI ON and used as system clock source
188 * - HSE, CSI, PLL1, PLL2 and PLL3 OFF
189 * - AHB, APB1, APB2 and APB3 prescaler set to 1.
190 * - CSS OFF
191 * - All interrupts disabled
192 * @note This function doesn't modify the configuration of the
193 * - Peripheral clocks
194 * - LSI, LSE and RTC clocks
195 * @retval An ErrorStatus enumeration value:
196 * - SUCCESS: RCC registers are de-initialized
197 * - ERROR: not applicable
198 */
LL_RCC_DeInit(void)199 ErrorStatus LL_RCC_DeInit(void)
200 {
201
202 /* Set HSION bit */
203 LL_RCC_HSI_Enable();
204
205 /* Wait for HSI READY bit */
206 while (LL_RCC_HSI_IsReady() == 0U)
207 {
208 }
209
210 /* Set HSIDIV Default value */
211 CLEAR_BIT(RCC->CR, RCC_CR_HSIDIV);
212
213 /* Set HSITRIM bits to the reset value*/
214 LL_RCC_HSI_SetCalibTrimming(0x40U);
215
216 /* Reset CFGR register */
217 LL_RCC_WriteReg(CFGR1, 0x00000000U);
218 LL_RCC_WriteReg(CFGR2, 0x00000000U);
219
220 /* Wait till clock switch is ready */
221 while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
222 {
223 }
224
225 #if defined(RCC_CR_PLL3ON)
226 /* Reset HSECSSON, HSEON, HSIKERON, CSION, CSIKERON, HSI48ON, PLL1ON, PLL2ON and PLL3ON bits */
227 CLEAR_BIT(RCC->CR, RCC_CR_CSION | RCC_CR_CSIKERON | RCC_CR_HSECSSON | RCC_CR_HSIKERON | RCC_CR_HSI48ON |
228 RCC_CR_HSEON | RCC_CR_PLL1ON | RCC_CR_PLL2ON | RCC_CR_PLL3ON);
229 #else
230 /* Reset HSECSSON, HSEON, HSIKERON, CSION, CSIKERON, HSI48ON, PLL1ON, PLL2ON and PLL3ON bits */
231 CLEAR_BIT(RCC->CR, RCC_CR_CSION | RCC_CR_CSIKERON | RCC_CR_HSECSSON | RCC_CR_HSIKERON | RCC_CR_HSI48ON |
232 RCC_CR_HSEON | RCC_CR_PLL1ON | RCC_CR_PLL2ON);
233 #endif /* PLL3 */
234
235 /* Wait for PLL1 READY bit to be reset */
236 while (LL_RCC_PLL1_IsReady() != 0U)
237 {}
238
239 /* Wait for PLL2 READY bit to be reset */
240 while (LL_RCC_PLL2_IsReady() != 0U)
241 {}
242
243 #if defined(RCC_CR_PLL3ON)
244 /* Wait for PLL3 READY bit to be reset */
245 while (LL_RCC_PLL3_IsReady() != 0U)
246 {}
247 #endif /* PLL3 */
248
249 /* Reset PLL1CFGR register */
250 CLEAR_REG(RCC->PLL1CFGR);
251
252 /* Reset PLL1DIVR register */
253 LL_RCC_WriteReg(PLL1DIVR, 0x01010280U);
254
255 /* Reset PLL1FRACR register */
256 CLEAR_REG(RCC->PLL1FRACR);
257
258 /* Reset PLL2CFGR register */
259 CLEAR_REG(RCC->PLL2CFGR);
260
261 /* Reset PLL2DIVR register */
262 LL_RCC_WriteReg(PLL2DIVR, 0x01010280U);
263
264 /* Reset PLL2FRACR register */
265 CLEAR_REG(RCC->PLL2FRACR);
266
267 #if defined(RCC_CR_PLL3ON)
268 /* Reset PLL3CFGR register */
269 CLEAR_REG(RCC->PLL3CFGR);
270
271 /* Reset PLL3DIVR register */
272 LL_RCC_WriteReg(PLL3DIVR, 0x01010280U);
273
274 /* Reset PLL3FRACR register */
275 CLEAR_REG(RCC->PLL3FRACR);
276 #endif /* PLL3 */
277
278 /* Reset HSEBYP bit */
279 CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP);
280
281 /* Reset HSEEXT bit */
282 CLEAR_BIT(RCC->CR, RCC_CR_HSEEXT);
283
284 #if defined(RCC_CR_PLL3ON)
285 /* Disable all interrupts */
286 CLEAR_BIT(RCC->CIER, RCC_CIER_LSIRDYIE | RCC_CIER_LSERDYIE | RCC_CIER_HSIRDYIE | RCC_CIER_HSERDYIE
287 | RCC_CIER_CSIRDYIE | RCC_CIER_HSI48RDYIE | RCC_CIER_PLL1RDYIE | RCC_CIER_PLL2RDYIE
288 | RCC_CIER_PLL3RDYIE);
289
290 /* Clear all interrupt flags */
291 SET_BIT(RCC->CICR, RCC_CICR_LSIRDYC | RCC_CICR_LSERDYC | RCC_CICR_HSIRDYC | RCC_CICR_HSERDYC
292 | RCC_CICR_CSIRDYC | RCC_CICR_HSI48RDYC | RCC_CICR_PLL1RDYC | RCC_CICR_PLL2RDYC
293 | RCC_CICR_PLL3RDYC | RCC_CICR_HSECSSC);
294 #else
295 /* Disable all interrupts */
296 CLEAR_BIT(RCC->CIER, RCC_CIER_LSIRDYIE | RCC_CIER_LSERDYIE | RCC_CIER_HSIRDYIE | RCC_CIER_HSERDYIE
297 | RCC_CIER_CSIRDYIE | RCC_CIER_HSI48RDYIE | RCC_CIER_PLL1RDYIE | RCC_CIER_PLL2RDYIE);
298
299 /* Clear all interrupt flags */
300 SET_BIT(RCC->CICR, RCC_CICR_LSIRDYC | RCC_CICR_LSERDYC | RCC_CICR_HSIRDYC | RCC_CICR_HSERDYC
301 | RCC_CICR_CSIRDYC | RCC_CICR_HSI48RDYC | RCC_CICR_PLL1RDYC | RCC_CICR_PLL2RDYC
302 | RCC_CICR_HSECSSC);
303 #endif /* PLL3 */
304
305
306 /* Clear all reset flags */
307 LL_RCC_ClearResetFlags();
308
309 /* Update the SystemCoreClock global variable */
310 SystemCoreClock = HSI_VALUE;
311
312 return SUCCESS;
313 }
314
315 /**
316 * @}
317 */
318
319 /** @addtogroup RCC_LL_EF_Get_Freq
320 * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks
321 * and different peripheral clocks available on the device.
322 * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*)
323 * @note If SYSCLK source is CSI, function returns values based on CSI_VALUE(**)
324 * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(***)
325 * @note If SYSCLK source is PLL1, function returns values based on HSE_VALUE(***)
326 * or HSI_VALUE(**) or CSI_VALUE(*) multiplied/divided by the main PLL factors.
327 * @note (*) HSI_VALUE is a constant defined in this file (default value
328 * 64 MHz) but the real value may vary depending on the variations
329 * in voltage and temperature.
330 * @note (**) CSI_VALUE is a constant defined in this file (default value
331 * 4 MHz) but the real value may vary depending on the variations
332 * in voltage and temperature.
333 * @note (***) HSE_VALUE is a constant defined in this file (default value
334 * 32 MHz), user has to ensure that HSE_VALUE is same as the real
335 * frequency of the crystal used. Otherwise, this function may
336 * have wrong result.
337 * @note The result of this function could be incorrect when using fractional
338 * value for HSE crystal.
339 * @note This function can be used by the user application to compute the
340 * baud-rate for the communication peripherals or configure other parameters.
341 * @{
342 */
343
344 /**
345 * @brief Return the frequencies of different on chip clocks; System, AHB, APB1, APB2 and APB3 buses clocks
346 * @note Each time SYSCLK, HCLK, PCLK1, PCLK2 and PCLK3 clock changes, this function
347 * must be called to update structure fields. Otherwise, any
348 * configuration based on this function will be incorrect.
349 * @param pRCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
350 * @retval None
351 */
LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef * pRCC_Clocks)352 void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *pRCC_Clocks)
353 {
354 /* Get SYSCLK frequency */
355 pRCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
356
357 /* HCLK clock frequency */
358 pRCC_Clocks->HCLK_Frequency = RCC_GetHCLKClockFreq(pRCC_Clocks->SYSCLK_Frequency);
359
360 /* PCLK1 clock frequency */
361 pRCC_Clocks->PCLK1_Frequency = RCC_GetPCLK1ClockFreq(pRCC_Clocks->HCLK_Frequency);
362
363 /* PCLK2 clock frequency */
364 pRCC_Clocks->PCLK2_Frequency = RCC_GetPCLK2ClockFreq(pRCC_Clocks->HCLK_Frequency);
365
366 /* PCLK3 clock frequency */
367 pRCC_Clocks->PCLK3_Frequency = RCC_GetPCLK3ClockFreq(pRCC_Clocks->HCLK_Frequency);
368 }
369
370 /**
371 * @brief Return PLL1 clocks frequencies
372 * @note LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
373 * @retval None
374 */
LL_RCC_GetPLL1ClockFreq(LL_PLL_ClocksTypeDef * pPLL_Clocks)375 void LL_RCC_GetPLL1ClockFreq(LL_PLL_ClocksTypeDef *pPLL_Clocks)
376 {
377 uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
378 uint32_t pllsource;
379 uint32_t pllm;
380 uint32_t plln;
381 uint32_t fracn = 0U;
382
383 /* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
384 SYSCLK = PLL_VCO / PLLP
385 */
386
387 pPLL_Clocks->PLL_P_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
388 pPLL_Clocks->PLL_Q_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
389 pPLL_Clocks->PLL_R_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
390
391 if (LL_RCC_PLL1_IsReady() != 0U)
392 {
393
394 pllsource = LL_RCC_PLL1_GetSource();
395
396 switch (pllsource)
397 {
398 case LL_RCC_PLL1SOURCE_HSI:
399 if (LL_RCC_HSI_IsReady() != 0U)
400 {
401 pllinputfreq = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
402 }
403 break;
404
405 case LL_RCC_PLL1SOURCE_CSI:
406 if (LL_RCC_CSI_IsReady() != 0U)
407 {
408 pllinputfreq = CSI_VALUE;
409 }
410 break;
411
412 case LL_RCC_PLL1SOURCE_HSE:
413 if (LL_RCC_HSE_IsReady() != 0U)
414 {
415 pllinputfreq = HSE_VALUE;
416 }
417 break;
418
419 case LL_RCC_PLL1SOURCE_NONE:
420 default:
421 /* PLL clock disabled */
422 break;
423 }
424
425 pllm = LL_RCC_PLL1_GetM();
426 plln = LL_RCC_PLL1_GetN();
427
428 if (LL_RCC_PLL1FRACN_IsEnabled() != 0U)
429 {
430 fracn = LL_RCC_PLL1_GetFRACN();
431 }
432
433 if ((pllinputfreq != LL_RCC_PERIPH_FREQUENCY_NO) && (pllm != 0U))
434 {
435 if (LL_RCC_PLL1P_IsEnabled() != 0U)
436 {
437 pPLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL1_GetP());
438 }
439
440 if (LL_RCC_PLL1Q_IsEnabled() != 0U)
441 {
442 pPLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL1_GetQ());
443 }
444
445 if (LL_RCC_PLL1R_IsEnabled() != 0U)
446 {
447 pPLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL1_GetR());
448 }
449 }
450 }
451 }
452
453 /**
454 * @brief Return PLL2 clocks frequencies
455 * @note LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
456 * @retval None
457 */
LL_RCC_GetPLL2ClockFreq(LL_PLL_ClocksTypeDef * pPLL_Clocks)458 void LL_RCC_GetPLL2ClockFreq(LL_PLL_ClocksTypeDef *pPLL_Clocks)
459 {
460 uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
461 uint32_t pllsource;
462 uint32_t pllm;
463 uint32_t plln;
464 uint32_t fracn = 0U;
465
466 /* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
467 SYSCLK = PLL_VCO / PLLP
468 */
469
470 pPLL_Clocks->PLL_P_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
471 pPLL_Clocks->PLL_Q_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
472 pPLL_Clocks->PLL_R_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
473
474 if (LL_RCC_PLL2_IsReady() != 0U)
475 {
476
477 pllsource = LL_RCC_PLL2_GetSource();
478
479 switch (pllsource)
480 {
481 case LL_RCC_PLL2SOURCE_HSI:
482 if (LL_RCC_HSI_IsReady() != 0U)
483 {
484 pllinputfreq = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
485 }
486 break;
487
488 case LL_RCC_PLL2SOURCE_CSI:
489 if (LL_RCC_CSI_IsReady() != 0U)
490 {
491 pllinputfreq = CSI_VALUE;
492 }
493 break;
494
495 case LL_RCC_PLL2SOURCE_HSE:
496 if (LL_RCC_HSE_IsReady() != 0U)
497 {
498 pllinputfreq = HSE_VALUE;
499 }
500 break;
501
502 case LL_RCC_PLL2SOURCE_NONE:
503 default:
504 /* PLL clock disabled */
505 break;
506 }
507
508 pllm = LL_RCC_PLL2_GetM();
509 plln = LL_RCC_PLL2_GetN();
510
511 if (LL_RCC_PLL2FRACN_IsEnabled() != 0U)
512 {
513 fracn = LL_RCC_PLL2_GetFRACN();
514 }
515
516 if ((pllinputfreq != LL_RCC_PERIPH_FREQUENCY_NO) && (pllm != 0U))
517 {
518 if (LL_RCC_PLL2P_IsEnabled() != 0U)
519 {
520 pPLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL2_GetP());
521 }
522
523 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
524 {
525 pPLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL2_GetQ());
526 }
527
528 if (LL_RCC_PLL2R_IsEnabled() != 0U)
529 {
530 pPLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL2_GetR());
531 }
532 }
533 }
534 }
535
536 #if defined(RCC_CR_PLL3ON)
537 /**
538 * @brief Return PLL3 clocks frequencies
539 * @note LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
540 * @retval None
541 */
LL_RCC_GetPLL3ClockFreq(LL_PLL_ClocksTypeDef * pPLL_Clocks)542 void LL_RCC_GetPLL3ClockFreq(LL_PLL_ClocksTypeDef *pPLL_Clocks)
543 {
544 uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO;
545 uint32_t pllsource;
546 uint32_t pllm;
547 uint32_t plln;
548 uint32_t fracn = 0U;
549
550 /* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
551 SYSCLK = PLL_VCO / PLLP
552 */
553
554 pPLL_Clocks->PLL_P_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
555 pPLL_Clocks->PLL_Q_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
556 pPLL_Clocks->PLL_R_Frequency = LL_RCC_PERIPH_FREQUENCY_NO;
557
558 if (LL_RCC_PLL3_IsReady() != 0U)
559 {
560
561 pllsource = LL_RCC_PLL3_GetSource();
562
563 switch (pllsource)
564 {
565 case LL_RCC_PLL3SOURCE_HSI:
566 if (LL_RCC_HSI_IsReady() != 0U)
567 {
568 pllinputfreq = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
569 }
570 break;
571
572 case LL_RCC_PLL3SOURCE_CSI:
573 if (LL_RCC_CSI_IsReady() != 0U)
574 {
575 pllinputfreq = CSI_VALUE;
576 }
577 break;
578
579 case LL_RCC_PLL3SOURCE_HSE:
580 if (LL_RCC_HSE_IsReady() != 0U)
581 {
582 pllinputfreq = HSE_VALUE;
583 }
584 break;
585
586 case LL_RCC_PLL3SOURCE_NONE:
587 default:
588 /* PLL clock disabled */
589 break;
590 }
591
592 pllm = LL_RCC_PLL3_GetM();
593 plln = LL_RCC_PLL3_GetN();
594 if (LL_RCC_PLL3FRACN_IsEnabled() != 0U)
595 {
596 fracn = LL_RCC_PLL3_GetFRACN();
597 }
598
599 if ((pllinputfreq != LL_RCC_PERIPH_FREQUENCY_NO) && (pllm != 0U))
600 {
601 if (LL_RCC_PLL3P_IsEnabled() != 0U)
602 {
603 pPLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL3_GetP());
604 }
605
606 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
607 {
608 pPLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL3_GetQ());
609 }
610
611 if (LL_RCC_PLL3R_IsEnabled() != 0U)
612 {
613 pPLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, pllm, plln, fracn, LL_RCC_PLL3_GetR());
614 }
615 }
616 }
617 }
618 #endif /* PLL3 */
619
620 /**
621 * @brief Helper function to calculate the PLL1 frequency output
622 * @note ex: @ref LL_RCC_CalcPLLClockFreq (HSE_VALUE, @ref LL_RCC_PLL1_GetM (),
623 * @ref LL_RCC_PLL1_GetN (), @ref LL_RCC_PLL1_GetFRACN (), @ref LL_RCC_PLL1_GetP ());
624 * @param PLLInputFreq PLL Input frequency (based on HSE/(HSI/HSIDIV)/CSI)
625 * @param M Between 1 and 63
626 * @param N Between 4 and 512
627 * @param FRACN Between 0 and 0x1FFF
628 * @param PQR VCO output divider (P, Q or R)
629 * Between 1 and 128, except for PLL1P Odd value not allowed
630 * @retval PLL1 output clock frequency (in Hz)
631 */
LL_RCC_CalcPLLClockFreq(uint32_t PLLInputFreq,uint32_t M,uint32_t N,uint32_t FRACN,uint32_t PQR)632 uint32_t LL_RCC_CalcPLLClockFreq(uint32_t PLLInputFreq, uint32_t M, uint32_t N, uint32_t FRACN, uint32_t PQR)
633 {
634 float_t freq;
635
636 freq = ((float_t)PLLInputFreq / (float_t)M) * ((float_t)N + ((float_t)FRACN / (float_t)0x2000));
637
638 freq = freq / (float_t)PQR;
639
640 return (uint32_t)freq;
641 }
642
643
644 /**
645 * @brief Return USARTx clock frequency
646 * @param USARTxSource This parameter can be one of the following values:
647 * @arg @ref LL_RCC_USART1_CLKSOURCE
648 * @arg @ref LL_RCC_USART2_CLKSOURCE
649 * @arg @ref LL_RCC_USART3_CLKSOURCE
650 * @arg @ref LL_RCC_USART6_CLKSOURCE (*)
651 * @arg @ref LL_RCC_USART10_CLKSOURCE (*)
652 * @arg @ref LL_RCC_USART11_CLKSOURCE (*)
653 *
654 * (*) : For stm32h56xxx and stm32h57xxx family lines only.
655 * @retval USART clock frequency (in Hz)
656 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
657 */
LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)658 uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)
659 {
660 uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
661 LL_PLL_ClocksTypeDef PLL_Clocks;
662
663 /* Check parameter */
664 assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource));
665
666 if (USARTxSource == LL_RCC_USART1_CLKSOURCE)
667 {
668 /* USART1CLK clock frequency */
669 switch (LL_RCC_GetUSARTClockSource(USARTxSource))
670 {
671 case LL_RCC_USART1_CLKSOURCE_PCLK2: /* USART1 Clock is PCLK2 */
672 usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
673 break;
674
675 case LL_RCC_USART1_CLKSOURCE_PLL2Q: /* USART1 Clock is PLL2 Q */
676 if (LL_RCC_PLL2_IsReady() != 0U)
677 {
678 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
679 {
680 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
681 usart_frequency = PLL_Clocks.PLL_Q_Frequency;
682 }
683 }
684 break;
685
686 #if defined(LL_RCC_USART1_CLKSOURCE_PLL3Q)
687 case LL_RCC_USART1_CLKSOURCE_PLL3Q: /* USART1 Clock is PLL3 Q */
688 if (LL_RCC_PLL3_IsReady() != 0U)
689 {
690 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
691 {
692 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
693 usart_frequency = PLL_Clocks.PLL_Q_Frequency;
694 }
695 }
696 break;
697 #endif /* LL_RCC_USART1_CLKSOURCE_PLL3 */
698
699 case LL_RCC_USART1_CLKSOURCE_HSI: /* USART1 Clock is HSI Osc. */
700 if (LL_RCC_HSI_IsReady() == 1U)
701 {
702 usart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
703 }
704 break;
705
706 case LL_RCC_USART1_CLKSOURCE_CSI: /* USART1 Clock is CSI Osc. */
707 if (LL_RCC_CSI_IsReady() == 1U)
708 {
709 usart_frequency = CSI_VALUE;
710 }
711 break;
712
713 case LL_RCC_USART1_CLKSOURCE_LSE: /* USART1 Clock is LSE Osc. */
714 if (LL_RCC_LSE_IsReady() == 1U)
715 {
716 usart_frequency = LSE_VALUE;
717 }
718 break;
719
720 default:
721 /* unreachable code */
722 break;
723 }
724 }
725 else if (USARTxSource == LL_RCC_USART2_CLKSOURCE)
726 {
727 /* USART2CLK clock frequency */
728 switch (LL_RCC_GetUSARTClockSource(USARTxSource))
729 {
730 case LL_RCC_USART2_CLKSOURCE_PCLK1: /* USART2 Clock is PCLK1 */
731 usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
732 break;
733
734 case LL_RCC_USART2_CLKSOURCE_PLL2Q: /* USART2 Clock is PLL2 Q */
735 if (LL_RCC_PLL2_IsReady() != 0U)
736 {
737 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
738 {
739 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
740 usart_frequency = PLL_Clocks.PLL_Q_Frequency;
741 }
742 }
743 break;
744
745 #if defined(LL_RCC_USART2_CLKSOURCE_PLL3Q)
746 case LL_RCC_USART2_CLKSOURCE_PLL3Q: /* USART2 Clock is PLL3 Q */
747 if (LL_RCC_PLL3_IsReady() != 0U)
748 {
749 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
750 {
751 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
752 usart_frequency = PLL_Clocks.PLL_Q_Frequency;
753 }
754 }
755 break;
756 #endif /* LL_RCC_USART2_CLKSOURCE_PLL3 */
757
758 case LL_RCC_USART2_CLKSOURCE_HSI: /* USART2 Clock is HSI Osc. */
759 if (LL_RCC_HSI_IsReady() == 1U)
760 {
761 usart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
762 }
763 break;
764
765 case LL_RCC_USART2_CLKSOURCE_CSI: /* USART2 Clock is CSI Osc. */
766 if (LL_RCC_CSI_IsReady() == 1U)
767 {
768 usart_frequency = CSI_VALUE;
769 }
770 break;
771
772 case LL_RCC_USART2_CLKSOURCE_LSE: /* USART2 Clock is LSE Osc. */
773 if (LL_RCC_LSE_IsReady() == 1U)
774 {
775 usart_frequency = LSE_VALUE;
776 }
777 break;
778
779 default:
780 /* unreachable code */
781 break;
782 }
783 }
784 else if (USARTxSource == LL_RCC_USART3_CLKSOURCE)
785 {
786 /* USART3CLK clock frequency */
787 switch (LL_RCC_GetUSARTClockSource(USARTxSource))
788 {
789 case LL_RCC_USART3_CLKSOURCE_PCLK1: /* USART3 Clock is PCLK1 */
790 usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
791 break;
792
793 case LL_RCC_USART3_CLKSOURCE_PLL2Q: /* USART3 Clock is PLL2 Q */
794 if (LL_RCC_PLL2_IsReady() != 0U)
795 {
796 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
797 {
798 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
799 usart_frequency = PLL_Clocks.PLL_Q_Frequency;
800 }
801 }
802 break;
803
804 #if defined(LL_RCC_USART3_CLKSOURCE_PLL3Q)
805 case LL_RCC_USART3_CLKSOURCE_PLL3Q: /* USART3 Clock is PLL3 Q */
806 if (LL_RCC_PLL3_IsReady() != 0U)
807 {
808 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
809 {
810 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
811 usart_frequency = PLL_Clocks.PLL_Q_Frequency;
812 }
813 }
814 break;
815 #endif /* LL_RCC_USART3_CLKSOURCE_PLL3 */
816
817 case LL_RCC_USART3_CLKSOURCE_HSI: /* USART3 Clock is HSI Osc. */
818 if (LL_RCC_HSI_IsReady() == 1U)
819 {
820 usart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
821 }
822 break;
823
824 case LL_RCC_USART3_CLKSOURCE_CSI: /* USART3 Clock is CSI Osc. */
825 if (LL_RCC_CSI_IsReady() == 1U)
826 {
827 usart_frequency = CSI_VALUE;
828 }
829 break;
830
831 case LL_RCC_USART3_CLKSOURCE_LSE: /* USART3 Clock is LSE Osc. */
832 if (LL_RCC_LSE_IsReady() == 1U)
833 {
834 usart_frequency = LSE_VALUE;
835 }
836 break;
837
838 default:
839 /* unreachable code */
840 break;
841 }
842 }
843
844 #if defined(USART6)
845 else if (USARTxSource == LL_RCC_USART6_CLKSOURCE)
846 {
847 /* USART6CLK clock frequency */
848 switch (LL_RCC_GetUSARTClockSource(USARTxSource))
849 {
850 case LL_RCC_USART6_CLKSOURCE_PCLK1: /* USART6 Clock is PCLK1 */
851 usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
852 break;
853
854 case LL_RCC_USART6_CLKSOURCE_PLL2Q: /* USART6 Clock is PLL2 Q */
855 if (LL_RCC_PLL2_IsReady() != 0U)
856 {
857 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
858 {
859 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
860 usart_frequency = PLL_Clocks.PLL_Q_Frequency;
861 }
862 }
863 break;
864
865 case LL_RCC_USART6_CLKSOURCE_PLL3Q: /* USART6 Clock is PLL3 Q */
866 if (LL_RCC_PLL3_IsReady() != 0U)
867 {
868 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
869 {
870 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
871 usart_frequency = PLL_Clocks.PLL_Q_Frequency;
872 }
873 }
874 break;
875
876 case LL_RCC_USART6_CLKSOURCE_HSI: /* USART6 Clock is HSI Osc. */
877 if (LL_RCC_HSI_IsReady() == 1U)
878 {
879 usart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
880 }
881 break;
882
883 case LL_RCC_USART6_CLKSOURCE_CSI: /* USART6 Clock is CSI Osc. */
884 if (LL_RCC_CSI_IsReady() == 1U)
885 {
886 usart_frequency = CSI_VALUE;
887 }
888 break;
889
890 case LL_RCC_USART6_CLKSOURCE_LSE: /* USART6 Clock is LSE Osc. */
891 if (LL_RCC_LSE_IsReady() == 1U)
892 {
893 usart_frequency = LSE_VALUE;
894 }
895 break;
896
897 default:
898 /* unreachable code */
899 break;
900 }
901 }
902 #endif /* USART6 */
903
904 #if defined(USART10)
905 else if (USARTxSource == LL_RCC_USART10_CLKSOURCE)
906 {
907 /* USART10CLK clock frequency */
908 switch (LL_RCC_GetUSARTClockSource(USARTxSource))
909 {
910 case LL_RCC_USART10_CLKSOURCE_PCLK1: /* USART10 Clock is PCLK1 */
911 usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
912 break;
913
914 case LL_RCC_USART10_CLKSOURCE_PLL2Q: /* USART10 Clock is PLL2 Q */
915 if (LL_RCC_PLL2_IsReady() != 0U)
916 {
917 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
918 {
919 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
920 usart_frequency = PLL_Clocks.PLL_Q_Frequency;
921 }
922 }
923 break;
924
925 case LL_RCC_USART10_CLKSOURCE_PLL3Q: /* USART10 Clock is PLL3 Q */
926 if (LL_RCC_PLL3_IsReady() != 0U)
927 {
928 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
929 {
930 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
931 usart_frequency = PLL_Clocks.PLL_Q_Frequency;
932 }
933 }
934 break;
935
936 case LL_RCC_USART10_CLKSOURCE_HSI: /* USART10 Clock is HSI Osc. */
937 if (LL_RCC_HSI_IsReady() == 1U)
938 {
939 usart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
940 }
941 break;
942
943 case LL_RCC_USART10_CLKSOURCE_CSI: /* USART10 Clock is CSI Osc. */
944 if (LL_RCC_CSI_IsReady() == 1U)
945 {
946 usart_frequency = CSI_VALUE;
947 }
948 break;
949
950 case LL_RCC_USART10_CLKSOURCE_LSE: /* USART10 Clock is LSE Osc. */
951 if (LL_RCC_LSE_IsReady() == 1U)
952 {
953 usart_frequency = LSE_VALUE;
954 }
955 break;
956
957 default:
958 /* unreachable code */
959 break;
960 }
961 }
962 #endif /* USART10 */
963
964 #if defined(USART11)
965 else if (USARTxSource == LL_RCC_USART11_CLKSOURCE)
966 {
967 /* USART11CLK clock frequency */
968 switch (LL_RCC_GetUSARTClockSource(USARTxSource))
969 {
970 case LL_RCC_USART11_CLKSOURCE_PCLK1: /* USART11 Clock is PCLK1 */
971 usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
972 break;
973
974 case LL_RCC_USART11_CLKSOURCE_PLL2Q: /* USART11 Clock is PLL2 Q */
975 if (LL_RCC_PLL2_IsReady() != 0U)
976 {
977 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
978 {
979 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
980 usart_frequency = PLL_Clocks.PLL_Q_Frequency;
981 }
982 }
983 break;
984
985 case LL_RCC_USART11_CLKSOURCE_PLL3Q: /* USART11 Clock is PLL3 Q */
986 if (LL_RCC_PLL3_IsReady() != 0U)
987 {
988 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
989 {
990 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
991 usart_frequency = PLL_Clocks.PLL_Q_Frequency;
992 }
993 }
994 break;
995
996 case LL_RCC_USART11_CLKSOURCE_HSI: /* USART11 Clock is HSI Osc. */
997 if (LL_RCC_HSI_IsReady() == 1U)
998 {
999 usart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1000 }
1001 break;
1002
1003 case LL_RCC_USART11_CLKSOURCE_CSI: /* USART11 Clock is CSI Osc. */
1004 if (LL_RCC_CSI_IsReady() == 1U)
1005 {
1006 usart_frequency = CSI_VALUE;
1007 }
1008 break;
1009
1010 case LL_RCC_USART11_CLKSOURCE_LSE: /* USART11 Clock is LSE Osc. */
1011 if (LL_RCC_LSE_IsReady() == 1U)
1012 {
1013 usart_frequency = LSE_VALUE;
1014 }
1015 break;
1016
1017 default:
1018 /* unreachable code */
1019 break;
1020 }
1021 }
1022 #endif /* USART11 */
1023 else
1024 {
1025 /* nothing to do */
1026 }
1027
1028 return usart_frequency;
1029 }
1030
1031 #if defined(UART4)
1032 /**
1033 * @brief Return UARTx clock frequency
1034 * @param UARTxSource This parameter can be one of the following values:
1035 * @arg @ref LL_RCC_UART4_CLKSOURCE
1036 * @arg @ref LL_RCC_UART5_CLKSOURCE
1037 * @arg @ref LL_RCC_UART7_CLKSOURCE
1038 * @arg @ref LL_RCC_UART8_CLKSOURCE
1039 * @arg @ref LL_RCC_UART9_CLKSOURCE
1040 * @arg @ref LL_RCC_UART12_CLKSOURCE
1041 * @retval UART clock frequency (in Hz)
1042 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
1043 */
LL_RCC_GetUARTClockFreq(uint32_t UARTxSource)1044 uint32_t LL_RCC_GetUARTClockFreq(uint32_t UARTxSource)
1045 {
1046 uint32_t uart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1047 LL_PLL_ClocksTypeDef PLL_Clocks;
1048
1049 /* Check parameter */
1050 assert_param(IS_LL_RCC_UART_CLKSOURCE(UARTxSource));
1051
1052 if (UARTxSource == LL_RCC_UART4_CLKSOURCE)
1053 {
1054 /* UART4CLK clock frequency */
1055 switch (LL_RCC_GetUARTClockSource(UARTxSource))
1056 {
1057 case LL_RCC_UART4_CLKSOURCE_PCLK1: /* UART4 Clock is PCLK1 */
1058 uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1059 break;
1060
1061 case LL_RCC_UART4_CLKSOURCE_PLL2Q: /* UART4 Clock is PLL2 Q */
1062 if (LL_RCC_PLL2_IsReady() != 0U)
1063 {
1064 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
1065 {
1066 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1067 uart_frequency = PLL_Clocks.PLL_Q_Frequency;
1068 }
1069 }
1070 break;
1071
1072 case LL_RCC_UART4_CLKSOURCE_PLL3Q: /* UART4 Clock is PLL3 Q */
1073 if (LL_RCC_PLL3_IsReady() != 0U)
1074 {
1075 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
1076 {
1077 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1078 uart_frequency = PLL_Clocks.PLL_Q_Frequency;
1079 }
1080 }
1081 break;
1082
1083 case LL_RCC_UART4_CLKSOURCE_HSI: /* UART4 Clock is HSI Osc. */
1084 if (LL_RCC_HSI_IsReady() == 1U)
1085 {
1086 uart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1087 }
1088 break;
1089
1090 case LL_RCC_UART4_CLKSOURCE_CSI: /* UART4 Clock is CSI Osc. */
1091 if (LL_RCC_CSI_IsReady() == 1U)
1092 {
1093 uart_frequency = CSI_VALUE;
1094 }
1095 break;
1096
1097 case LL_RCC_UART4_CLKSOURCE_LSE: /* UART4 Clock is LSE Osc. */
1098 if (LL_RCC_LSE_IsReady() == 1U)
1099 {
1100 uart_frequency = LSE_VALUE;
1101 }
1102 break;
1103
1104 default:
1105 /* unreachable code */
1106 break;
1107 }
1108 }
1109 else if (UARTxSource == LL_RCC_UART5_CLKSOURCE)
1110 {
1111 /* UART5CLK clock frequency */
1112 switch (LL_RCC_GetUARTClockSource(UARTxSource))
1113 {
1114 case LL_RCC_UART5_CLKSOURCE_PCLK1: /* UART5 Clock is PCLK1 */
1115 uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1116 break;
1117
1118 case LL_RCC_UART5_CLKSOURCE_PLL2Q: /* UART5 Clock is PLL2 Q */
1119 if (LL_RCC_PLL2_IsReady() != 0U)
1120 {
1121 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
1122 {
1123 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1124 uart_frequency = PLL_Clocks.PLL_Q_Frequency;
1125 }
1126 }
1127 break;
1128
1129 case LL_RCC_UART5_CLKSOURCE_PLL3Q: /* UART5 Clock is PLL3 Q */
1130 if (LL_RCC_PLL3_IsReady() != 0U)
1131 {
1132 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
1133 {
1134 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1135 uart_frequency = PLL_Clocks.PLL_Q_Frequency;
1136 }
1137 }
1138 break;
1139
1140 case LL_RCC_UART5_CLKSOURCE_HSI: /* UART5 Clock is HSI Osc. */
1141 if (LL_RCC_HSI_IsReady() == 1U)
1142 {
1143 uart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1144 }
1145 break;
1146
1147 case LL_RCC_UART5_CLKSOURCE_CSI: /* UART5 Clock is CSI Osc. */
1148 if (LL_RCC_CSI_IsReady() == 1U)
1149 {
1150 uart_frequency = CSI_VALUE;
1151 }
1152 break;
1153
1154 case LL_RCC_UART5_CLKSOURCE_LSE: /* UART5 Clock is LSE Osc. */
1155 if (LL_RCC_LSE_IsReady() == 1U)
1156 {
1157 uart_frequency = LSE_VALUE;
1158 }
1159 break;
1160
1161 default:
1162 /* unreachable code */
1163 break;
1164 }
1165 }
1166 #if defined(UART7)
1167 else if (UARTxSource == LL_RCC_UART7_CLKSOURCE)
1168 {
1169 /* UART7CLK clock frequency */
1170 switch (LL_RCC_GetUARTClockSource(UARTxSource))
1171 {
1172 case LL_RCC_UART7_CLKSOURCE_PCLK1: /* UART7 Clock is PCLK1 */
1173 uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1174 break;
1175
1176 case LL_RCC_UART7_CLKSOURCE_PLL2Q: /* UART7 Clock is PLL2 Q */
1177 if (LL_RCC_PLL2_IsReady() != 0U)
1178 {
1179 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
1180 {
1181 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1182 uart_frequency = PLL_Clocks.PLL_Q_Frequency;
1183 }
1184 }
1185 break;
1186
1187 case LL_RCC_UART7_CLKSOURCE_PLL3Q: /* UART7 Clock is PLL3 Q */
1188 if (LL_RCC_PLL3_IsReady() != 0U)
1189 {
1190 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
1191 {
1192 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1193 uart_frequency = PLL_Clocks.PLL_Q_Frequency;
1194 }
1195 }
1196 break;
1197
1198 case LL_RCC_UART7_CLKSOURCE_HSI: /* UART7 Clock is HSI Osc. */
1199 if (LL_RCC_HSI_IsReady() == 1U)
1200 {
1201 uart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1202 }
1203 break;
1204
1205 case LL_RCC_UART7_CLKSOURCE_CSI: /* UART7 Clock is CSI Osc. */
1206 if (LL_RCC_CSI_IsReady() == 1U)
1207 {
1208 uart_frequency = CSI_VALUE;
1209 }
1210 break;
1211
1212 case LL_RCC_UART7_CLKSOURCE_LSE: /* UART7 Clock is LSE Osc. */
1213 if (LL_RCC_LSE_IsReady() == 1U)
1214 {
1215 uart_frequency = LSE_VALUE;
1216 }
1217 break;
1218
1219 default:
1220 /* unreachable code */
1221 break;
1222 }
1223 }
1224 #endif /* UART7 */
1225 #if defined(UART8)
1226 else if (UARTxSource == LL_RCC_UART8_CLKSOURCE)
1227 {
1228 /* UART8CLK clock frequency */
1229 switch (LL_RCC_GetUARTClockSource(UARTxSource))
1230 {
1231 case LL_RCC_UART8_CLKSOURCE_PCLK1: /* UART8 Clock is PCLK1 */
1232 uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1233 break;
1234
1235 case LL_RCC_UART8_CLKSOURCE_PLL2Q: /* UART8 Clock is PLL2 Q */
1236 if (LL_RCC_PLL2_IsReady() != 0U)
1237 {
1238 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
1239 {
1240 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1241 uart_frequency = PLL_Clocks.PLL_Q_Frequency;
1242 }
1243 }
1244 break;
1245
1246 case LL_RCC_UART8_CLKSOURCE_PLL3Q: /* UART8 Clock is PLL3 Q */
1247 if (LL_RCC_PLL3_IsReady() != 0U)
1248 {
1249 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
1250 {
1251 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1252 uart_frequency = PLL_Clocks.PLL_Q_Frequency;
1253 }
1254 }
1255 break;
1256
1257 case LL_RCC_UART8_CLKSOURCE_HSI: /* UART8 Clock is HSI Osc. */
1258 if (LL_RCC_HSI_IsReady() == 1U)
1259 {
1260 uart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1261 }
1262 break;
1263
1264 case LL_RCC_UART8_CLKSOURCE_CSI: /* UART8 Clock is CSI Osc. */
1265 if (LL_RCC_CSI_IsReady() == 1U)
1266 {
1267 uart_frequency = CSI_VALUE;
1268 }
1269 break;
1270
1271 case LL_RCC_UART8_CLKSOURCE_LSE: /* UART8 Clock is LSE Osc. */
1272 if (LL_RCC_LSE_IsReady() == 1U)
1273 {
1274 uart_frequency = LSE_VALUE;
1275 }
1276 break;
1277
1278 default:
1279 /* unreachable code */
1280 break;
1281 }
1282 }
1283 #endif /* UART8 */
1284 #if defined(UART9)
1285 else if (UARTxSource == LL_RCC_UART9_CLKSOURCE)
1286 {
1287 /* UART9CLK clock frequency */
1288 switch (LL_RCC_GetUARTClockSource(UARTxSource))
1289 {
1290 case LL_RCC_UART9_CLKSOURCE_PCLK1: /* UART9 Clock is PCLK1 */
1291 uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1292 break;
1293
1294 case LL_RCC_UART9_CLKSOURCE_PLL2Q: /* UART9 Clock is PLL2 Q */
1295 if (LL_RCC_PLL2_IsReady() != 0U)
1296 {
1297 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
1298 {
1299 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1300 uart_frequency = PLL_Clocks.PLL_Q_Frequency;
1301 }
1302 }
1303 break;
1304
1305 case LL_RCC_UART9_CLKSOURCE_PLL3Q: /* UART9 Clock is PLL3 Q */
1306 if (LL_RCC_PLL3_IsReady() != 0U)
1307 {
1308 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
1309 {
1310 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1311 uart_frequency = PLL_Clocks.PLL_Q_Frequency;
1312 }
1313 }
1314 break;
1315
1316 case LL_RCC_UART9_CLKSOURCE_HSI: /* UART9 Clock is HSI Osc. */
1317 if (LL_RCC_HSI_IsReady() == 1U)
1318 {
1319 uart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1320 }
1321 break;
1322
1323 case LL_RCC_UART9_CLKSOURCE_CSI: /* UART9 Clock is CSI Osc. */
1324 if (LL_RCC_CSI_IsReady() == 1U)
1325 {
1326 uart_frequency = CSI_VALUE;
1327 }
1328 break;
1329
1330 case LL_RCC_UART9_CLKSOURCE_LSE: /* UART9 Clock is LSE Osc. */
1331 if (LL_RCC_LSE_IsReady() == 1U)
1332 {
1333 uart_frequency = LSE_VALUE;
1334 }
1335 break;
1336
1337 default:
1338 /* unreachable code */
1339 break;
1340 }
1341 }
1342 #endif /* UART9 */
1343 #if defined(UART12)
1344 else if (UARTxSource == LL_RCC_UART12_CLKSOURCE)
1345 {
1346 /* UART12CLK clock frequency */
1347 switch (LL_RCC_GetUARTClockSource(UARTxSource))
1348 {
1349 case LL_RCC_UART12_CLKSOURCE_PCLK1: /* UART12 Clock is PCLK1 */
1350 uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1351 break;
1352
1353 case LL_RCC_UART12_CLKSOURCE_PLL2Q: /* UART12 Clock is PLL2 Q */
1354 if (LL_RCC_PLL2_IsReady() != 0U)
1355 {
1356 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
1357 {
1358 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1359 uart_frequency = PLL_Clocks.PLL_Q_Frequency;
1360 }
1361 }
1362 break;
1363
1364 case LL_RCC_UART12_CLKSOURCE_PLL3Q: /* UART12 Clock is PLL3 Q */
1365 if (LL_RCC_PLL3_IsReady() != 0U)
1366 {
1367 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
1368 {
1369 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1370 uart_frequency = PLL_Clocks.PLL_Q_Frequency;
1371 }
1372 }
1373 break;
1374
1375 case LL_RCC_UART12_CLKSOURCE_HSI: /* UART12 Clock is HSI Osc. */
1376 if (LL_RCC_HSI_IsReady() == 1U)
1377 {
1378 uart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1379 }
1380 break;
1381
1382 case LL_RCC_UART12_CLKSOURCE_CSI: /* UART12 Clock is CSI Osc. */
1383 if (LL_RCC_CSI_IsReady() == 1U)
1384 {
1385 uart_frequency = CSI_VALUE;
1386 }
1387 break;
1388
1389 case LL_RCC_UART12_CLKSOURCE_LSE: /* UART12 Clock is LSE Osc. */
1390 if (LL_RCC_LSE_IsReady() == 1U)
1391 {
1392 uart_frequency = LSE_VALUE;
1393 }
1394 break;
1395
1396 default:
1397 /* unreachable code */
1398 break;
1399 }
1400 }
1401 #endif /* UART12 */
1402 else
1403 {
1404 /* nothing to do */
1405 }
1406
1407 return uart_frequency;
1408 }
1409 #endif /* UART4 */
1410
1411 /**
1412 * @brief Return SPIx clock frequency
1413 * @param SPIxSource This parameter can be one of the following values:
1414 * @arg @ref LL_RCC_SPI1_CLKSOURCE
1415 * @arg @ref LL_RCC_SPI2_CLKSOURCE
1416 * @arg @ref LL_RCC_SPI3_CLKSOURCE
1417 * @arg @ref LL_RCC_SPI4_CLKSOURCE (*)
1418 * @arg @ref LL_RCC_SPI5_CLKSOURCE (*)
1419 * @arg @ref LL_RCC_SPI6_CLKSOURCE (*)
1420 *
1421 * (*) : For stm32h56xxx and stm32h57xxx family lines only.
1422 * @retval SPI clock frequency (in Hz)
1423 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
1424 */
LL_RCC_GetSPIClockFreq(uint32_t SPIxSource)1425 uint32_t LL_RCC_GetSPIClockFreq(uint32_t SPIxSource)
1426 {
1427 uint32_t spi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1428 LL_PLL_ClocksTypeDef PLL_Clocks;
1429
1430 /* Check parameter */
1431 assert_param(IS_LL_RCC_SPI_CLKSOURCE(SPIxSource));
1432
1433 if (SPIxSource == LL_RCC_SPI1_CLKSOURCE)
1434 {
1435 /* SPI1 CLK clock frequency */
1436 switch (LL_RCC_GetSPIClockSource(SPIxSource))
1437 {
1438 case LL_RCC_SPI1_CLKSOURCE_PLL1Q: /* SPI1 Clock is PLL1 Q */
1439 if (LL_RCC_PLL1_IsReady() != 0U)
1440 {
1441 if (LL_RCC_PLL1Q_IsEnabled() != 0U)
1442 {
1443 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
1444 spi_frequency = PLL_Clocks.PLL_Q_Frequency;
1445 }
1446 }
1447 break;
1448
1449 case LL_RCC_SPI1_CLKSOURCE_PLL2P: /* SPI1 Clock is PLL2 P */
1450 if (LL_RCC_PLL2_IsReady() != 0U)
1451 {
1452 if (LL_RCC_PLL2P_IsEnabled() != 0U)
1453 {
1454 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1455 spi_frequency = PLL_Clocks.PLL_P_Frequency;
1456 }
1457 }
1458 break;
1459
1460 #if defined(LL_RCC_SPI1_CLKSOURCE_PLL3P)
1461 case LL_RCC_SPI1_CLKSOURCE_PLL3P: /* SPI1 Clock is PLL3 P */
1462 if (LL_RCC_PLL3_IsReady() != 0U)
1463 {
1464 if (LL_RCC_PLL3P_IsEnabled() != 0U)
1465 {
1466 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1467 spi_frequency = PLL_Clocks.PLL_P_Frequency;
1468 }
1469 }
1470 break;
1471 #endif /* PLL3 */
1472
1473 case LL_RCC_SPI1_CLKSOURCE_PIN: /* SPI1 Clock is External Clock */
1474 spi_frequency = EXTERNAL_CLOCK_VALUE;
1475 break;
1476
1477 case LL_RCC_SPI1_CLKSOURCE_CLKP: /* SPI1 Clock is CLKP */
1478 spi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
1479 break;
1480
1481 default:
1482 /* unreachable code */
1483 break;
1484 }
1485 }
1486 else if (SPIxSource == LL_RCC_SPI2_CLKSOURCE)
1487 {
1488 /* SPI2 CLK clock frequency */
1489 switch (LL_RCC_GetSPIClockSource(SPIxSource))
1490 {
1491 case LL_RCC_SPI2_CLKSOURCE_PLL1Q: /* SPI2 Clock is PLL1 Q */
1492 if (LL_RCC_PLL1_IsReady() != 0U)
1493 {
1494 if (LL_RCC_PLL1Q_IsEnabled() != 0U)
1495 {
1496 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
1497 spi_frequency = PLL_Clocks.PLL_Q_Frequency;
1498 }
1499 }
1500 break;
1501
1502 case LL_RCC_SPI2_CLKSOURCE_PLL2P: /* SPI2 Clock is PLL2 P */
1503 if (LL_RCC_PLL2_IsReady() != 0U)
1504 {
1505 if (LL_RCC_PLL2P_IsEnabled() != 0U)
1506 {
1507 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1508 spi_frequency = PLL_Clocks.PLL_P_Frequency;
1509 }
1510 }
1511 break;
1512
1513 #if defined(LL_RCC_SPI2_CLKSOURCE_PLL3P)
1514 case LL_RCC_SPI2_CLKSOURCE_PLL3P: /* SPI2 Clock is PLL3 P */
1515 if (LL_RCC_PLL3_IsReady() != 0U)
1516 {
1517 if (LL_RCC_PLL3P_IsEnabled() != 0U)
1518 {
1519 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1520 spi_frequency = PLL_Clocks.PLL_P_Frequency;
1521 }
1522 }
1523 break;
1524 #endif /* PLL3 */
1525
1526 case LL_RCC_SPI2_CLKSOURCE_PIN: /* SPI2 Clock is External Clock */
1527 spi_frequency = EXTERNAL_CLOCK_VALUE;
1528 break;
1529
1530 case LL_RCC_SPI2_CLKSOURCE_CLKP: /* SPI2 Clock is CLKP */
1531 spi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
1532 break;
1533
1534 default:
1535 /* unreachable code */
1536 break;
1537 }
1538 }
1539 else if (SPIxSource == LL_RCC_SPI3_CLKSOURCE)
1540 {
1541 /* SPI3 CLK clock frequency */
1542 switch (LL_RCC_GetSPIClockSource(SPIxSource))
1543 {
1544 case LL_RCC_SPI3_CLKSOURCE_PLL1Q: /* SPI3 Clock is PLL1 Q */
1545 if (LL_RCC_PLL1_IsReady() != 0U)
1546 {
1547 if (LL_RCC_PLL1Q_IsEnabled() != 0U)
1548 {
1549 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
1550 spi_frequency = PLL_Clocks.PLL_Q_Frequency;
1551 }
1552 }
1553 break;
1554
1555 case LL_RCC_SPI3_CLKSOURCE_PLL2P: /* SPI3 Clock is PLL2 P*/
1556 if (LL_RCC_PLL2_IsReady() != 0U)
1557 {
1558 if (LL_RCC_PLL2P_IsEnabled() != 0U)
1559 {
1560 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1561 spi_frequency = PLL_Clocks.PLL_P_Frequency;
1562 }
1563 }
1564 break;
1565
1566 #if defined(LL_RCC_SPI3_CLKSOURCE_PLL3P)
1567 case LL_RCC_SPI3_CLKSOURCE_PLL3P: /* SPI3 Clock is PLL3 P*/
1568 if (LL_RCC_PLL3_IsReady() != 0U)
1569 {
1570 if (LL_RCC_PLL3P_IsEnabled() != 0U)
1571 {
1572 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1573 spi_frequency = PLL_Clocks.PLL_P_Frequency;
1574 }
1575 }
1576 break;
1577 #endif /* PLL3 */
1578 case LL_RCC_SPI3_CLKSOURCE_PIN: /* SPI3 Clock is External Clock */
1579 spi_frequency = EXTERNAL_CLOCK_VALUE;
1580 break;
1581
1582 case LL_RCC_SPI3_CLKSOURCE_CLKP: /* SPI3 Clock is CLKP */
1583 spi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
1584 break;
1585
1586 default:
1587 /* unreachable code */
1588 break;
1589 }
1590 }
1591 #if defined(SPI4)
1592 else if (SPIxSource == LL_RCC_SPI4_CLKSOURCE)
1593 {
1594 /* SPI4 CLK clock frequency */
1595 switch (LL_RCC_GetSPIClockSource(SPIxSource))
1596 {
1597 case LL_RCC_SPI4_CLKSOURCE_PCLK2: /* SPI4 Clock is PCLK2 */
1598 spi_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1599 break;
1600
1601 case LL_RCC_SPI4_CLKSOURCE_PLL2Q: /* SPI4 Clock is PLL2 Q*/
1602 if (LL_RCC_PLL2_IsReady() != 0U)
1603 {
1604 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
1605 {
1606 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1607 spi_frequency = PLL_Clocks.PLL_Q_Frequency;
1608 }
1609 }
1610 break;
1611
1612 case LL_RCC_SPI4_CLKSOURCE_PLL3Q: /* SPI4 Clock is PLL3 Q*/
1613 if (LL_RCC_PLL3_IsReady() != 0U)
1614 {
1615 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
1616 {
1617 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1618 spi_frequency = PLL_Clocks.PLL_Q_Frequency;
1619 }
1620 }
1621 break;
1622
1623 case LL_RCC_SPI4_CLKSOURCE_HSI: /* SPI4 Clock is HSI Osc. */
1624 if (LL_RCC_HSI_IsReady() == 1U)
1625 {
1626 spi_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1627 }
1628 break;
1629
1630 case LL_RCC_SPI4_CLKSOURCE_CSI: /* SPI4 Clock is CSI Osc. */
1631 if (LL_RCC_CSI_IsReady() == 1U)
1632 {
1633 spi_frequency = CSI_VALUE;
1634 }
1635 break;
1636
1637 case LL_RCC_SPI4_CLKSOURCE_HSE: /* SPI4 Clock is HSE Osc. */
1638 if (LL_RCC_HSE_IsReady() == 1U)
1639 {
1640 spi_frequency = HSE_VALUE;
1641 }
1642 break;
1643
1644 default:
1645 /* unreachable code */
1646 break;
1647 }
1648 }
1649 #endif /* SPI4 */
1650 #if defined(SPI5)
1651 else if (SPIxSource == LL_RCC_SPI5_CLKSOURCE)
1652 {
1653 /* SPI5 CLK clock frequency */
1654 switch (LL_RCC_GetSPIClockSource(SPIxSource))
1655 {
1656 case LL_RCC_SPI5_CLKSOURCE_PCLK3: /* SPI5 Clock is PCLK3 */
1657 spi_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1658 break;
1659
1660 case LL_RCC_SPI5_CLKSOURCE_PLL2Q: /* SPI5 Clock is PLL2 Q*/
1661 if (LL_RCC_PLL2_IsReady() != 0U)
1662 {
1663 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
1664 {
1665 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1666 spi_frequency = PLL_Clocks.PLL_Q_Frequency;
1667 }
1668 }
1669 break;
1670
1671 case LL_RCC_SPI5_CLKSOURCE_PLL3Q: /* SPI5 Clock is PLL3 Q*/
1672 if (LL_RCC_PLL3_IsReady() != 0U)
1673 {
1674 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
1675 {
1676 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1677 spi_frequency = PLL_Clocks.PLL_Q_Frequency;
1678 }
1679 }
1680 break;
1681
1682 case LL_RCC_SPI5_CLKSOURCE_HSI: /* SPI5 Clock is HSI Osc. */
1683 if (LL_RCC_HSI_IsReady() == 1U)
1684 {
1685 spi_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1686 }
1687 break;
1688
1689 case LL_RCC_SPI5_CLKSOURCE_CSI: /* SPI5 Clock is CSI Osc. */
1690 if (LL_RCC_CSI_IsReady() == 1U)
1691 {
1692 spi_frequency = CSI_VALUE;
1693 }
1694 break;
1695
1696 case LL_RCC_SPI5_CLKSOURCE_HSE: /* SPI5 Clock is HSE Osc. */
1697 if (LL_RCC_HSE_IsReady() == 1U)
1698 {
1699 spi_frequency = HSE_VALUE;
1700 }
1701 break;
1702
1703 default:
1704 /* unreachable code */
1705 break;
1706 }
1707 }
1708 #endif /* SPI5 */
1709 #if defined(SPI6)
1710 else if (SPIxSource == LL_RCC_SPI6_CLKSOURCE)
1711 {
1712 /* SPI6 CLK clock frequency */
1713 switch (LL_RCC_GetSPIClockSource(SPIxSource))
1714 {
1715 case LL_RCC_SPI6_CLKSOURCE_PCLK2: /* SPI6 Clock is PCLK2 */
1716 spi_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1717 break;
1718
1719 case LL_RCC_SPI6_CLKSOURCE_PLL2Q: /* SPI6 Clock is PLL2 Q*/
1720 if (LL_RCC_PLL2_IsReady() != 0U)
1721 {
1722 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
1723 {
1724 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1725 spi_frequency = PLL_Clocks.PLL_Q_Frequency;
1726 }
1727 }
1728 break;
1729
1730 case LL_RCC_SPI6_CLKSOURCE_PLL3Q: /* SPI6 Clock is PLL3 Q*/
1731 if (LL_RCC_PLL3_IsReady() != 0U)
1732 {
1733 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
1734 {
1735 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1736 spi_frequency = PLL_Clocks.PLL_Q_Frequency;
1737 }
1738 }
1739 break;
1740
1741 case LL_RCC_SPI6_CLKSOURCE_HSI: /* SPI6 Clock is HSI Osc. */
1742 if (LL_RCC_HSI_IsReady() == 1U)
1743 {
1744 spi_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1745 }
1746 break;
1747
1748 case LL_RCC_SPI6_CLKSOURCE_CSI: /* SPI6 Clock is CSI Osc. */
1749 if (LL_RCC_CSI_IsReady() == 1U)
1750 {
1751 spi_frequency = CSI_VALUE;
1752 }
1753 break;
1754
1755 case LL_RCC_SPI6_CLKSOURCE_HSE: /* SPI6 Clock is HSE Osc. */
1756 if (LL_RCC_HSE_IsReady() == 1U)
1757 {
1758 spi_frequency = HSE_VALUE;
1759 }
1760 break;
1761
1762 default:
1763 /* unreachable code */
1764 break;
1765 }
1766 }
1767 #endif /* SPI6 */
1768
1769 else
1770 {
1771 /* nothing to do */
1772 }
1773
1774 return spi_frequency;
1775 }
1776
1777 /**
1778 * @brief Return I2Cx clock frequency
1779 * @param I2CxSource This parameter can be one of the following values:
1780 * @arg @ref LL_RCC_I2C1_CLKSOURCE
1781 * @arg @ref LL_RCC_I2C2_CLKSOURCE
1782 * @arg @ref LL_RCC_I2C3_CLKSOURCE (*)
1783 * @arg @ref LL_RCC_I2C4_CLKSOURCE (*)
1784 *
1785 * (*) : For stm32h56xxx and stm32h57xxx family lines only.
1786 * @retval I2C clock frequency (in Hz)
1787 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
1788 */
LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)1789 uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)
1790 {
1791 uint32_t i2c_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
1792 LL_PLL_ClocksTypeDef PLL_Clocks;
1793
1794 /* Check parameter */
1795 assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource));
1796
1797 if (I2CxSource == LL_RCC_I2C1_CLKSOURCE)
1798 {
1799 /* I2C1 CLK clock frequency */
1800 switch (LL_RCC_GetI2CClockSource(I2CxSource))
1801 {
1802 case LL_RCC_I2C1_CLKSOURCE_PCLK1: /* I2C1 Clock is PCLK1 */
1803 i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1804 break;
1805
1806 #if defined(LL_RCC_I2C1_CLKSOURCE_PLL3R)
1807 case LL_RCC_I2C1_CLKSOURCE_PLL3R: /* I2C1 Clock is PLL3 R */
1808 if (LL_RCC_PLL3_IsReady() != 0U)
1809 {
1810 if (LL_RCC_PLL3R_IsEnabled() != 0U)
1811 {
1812 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1813 i2c_frequency = PLL_Clocks.PLL_R_Frequency;
1814 }
1815 }
1816 break;
1817 #else
1818 case LL_RCC_I2C1_CLKSOURCE_PLL2R: /* I2C1 Clock is PLL2 R */
1819 if (LL_RCC_PLL2_IsReady() != 0U)
1820 {
1821 if (LL_RCC_PLL2R_IsEnabled() != 0U)
1822 {
1823 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1824 i2c_frequency = PLL_Clocks.PLL_R_Frequency;
1825 }
1826 }
1827 break;
1828 #endif /* PLL3 */
1829
1830 case LL_RCC_I2C1_CLKSOURCE_HSI: /* I2C1 Clock is HSI Osc. */
1831 if (LL_RCC_HSI_IsReady() == 1U)
1832 {
1833 i2c_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1834 }
1835 break;
1836
1837 case LL_RCC_I2C1_CLKSOURCE_CSI: /* I2C1 Clock is CSI Osc. */
1838 if (LL_RCC_CSI_IsReady() == 1U)
1839 {
1840 i2c_frequency = CSI_VALUE;
1841 }
1842 break;
1843
1844 default:
1845 /* unreachable code */
1846 break;
1847 }
1848 }
1849 else if (I2CxSource == LL_RCC_I2C2_CLKSOURCE)
1850 {
1851 /* I2C2 CLK clock frequency */
1852 switch (LL_RCC_GetI2CClockSource(I2CxSource))
1853 {
1854 case LL_RCC_I2C2_CLKSOURCE_PCLK1: /* I2C2 Clock is PCLK1 */
1855 i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1856 break;
1857
1858 #if defined(LL_RCC_I2C2_CLKSOURCE_PLL3R)
1859 case LL_RCC_I2C2_CLKSOURCE_PLL3R: /* I2C2 Clock is PLL3 R */
1860 if (LL_RCC_PLL3_IsReady() != 0U)
1861 {
1862 if (LL_RCC_PLL3R_IsEnabled() != 0U)
1863 {
1864 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1865 i2c_frequency = PLL_Clocks.PLL_R_Frequency;
1866 }
1867 }
1868 break;
1869 #else
1870 case LL_RCC_I2C2_CLKSOURCE_PLL2R: /* I2C2 Clock is PLL2 R */
1871 if (LL_RCC_PLL2_IsReady() != 0U)
1872 {
1873 if (LL_RCC_PLL2R_IsEnabled() != 0U)
1874 {
1875 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
1876 i2c_frequency = PLL_Clocks.PLL_R_Frequency;
1877 }
1878 }
1879 break;
1880 #endif /* PLL3 */
1881
1882 case LL_RCC_I2C2_CLKSOURCE_HSI: /* I2C2 Clock is HSI Osc. */
1883 if (LL_RCC_HSI_IsReady() == 1U)
1884 {
1885 i2c_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1886 }
1887 break;
1888
1889 case LL_RCC_I2C2_CLKSOURCE_CSI: /* I2C2 Clock is CSI Osc. */
1890 if (LL_RCC_CSI_IsReady() == 1U)
1891 {
1892 i2c_frequency = CSI_VALUE;
1893 }
1894 break;
1895
1896 default:
1897 /* unreachable code */
1898 break;
1899 }
1900 }
1901 #if defined(I2C3)
1902 else if (I2CxSource == LL_RCC_I2C3_CLKSOURCE)
1903 {
1904 /* I2C3 CLK clock frequency */
1905 switch (LL_RCC_GetI2CClockSource(I2CxSource))
1906
1907 {
1908 case LL_RCC_I2C3_CLKSOURCE_PCLK3: /* I2C3 Clock is PCLK3 */
1909 i2c_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1910 break;
1911
1912 case LL_RCC_I2C3_CLKSOURCE_PLL3R: /* I2C3 Clock is PLL3 R */
1913 if (LL_RCC_PLL3_IsReady() != 0U)
1914 {
1915 if (LL_RCC_PLL3R_IsEnabled() != 0U)
1916 {
1917 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1918 i2c_frequency = PLL_Clocks.PLL_R_Frequency;
1919 }
1920 }
1921 break;
1922
1923 case LL_RCC_I2C3_CLKSOURCE_HSI: /* I2C3 Clock is HSI Osc. */
1924 if (LL_RCC_HSI_IsReady() == 1U)
1925 {
1926 i2c_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1927 }
1928 break;
1929
1930 case LL_RCC_I2C3_CLKSOURCE_CSI: /* I2C3 Clock is CSI Osc. */
1931 if (LL_RCC_CSI_IsReady() == 1U)
1932 {
1933 i2c_frequency = CSI_VALUE;
1934 }
1935 break;
1936
1937 default:
1938 /* unreachable code */
1939 break;
1940 }
1941 }
1942 #endif /* I2C3 */
1943 #if defined(I2C4)
1944 else if (I2CxSource == LL_RCC_I2C4_CLKSOURCE)
1945 {
1946 /* I2C4 CLK clock frequency */
1947 switch (LL_RCC_GetI2CClockSource(I2CxSource))
1948 {
1949 case LL_RCC_I2C4_CLKSOURCE_PCLK3: /* I2C4 Clock is PCLK3 */
1950 i2c_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
1951 break;
1952
1953 case LL_RCC_I2C4_CLKSOURCE_PLL3R: /* I2C4 Clock is PLL3 R */
1954 if (LL_RCC_PLL3_IsReady() != 0U)
1955 {
1956 if (LL_RCC_PLL3R_IsEnabled() != 0U)
1957 {
1958 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
1959 i2c_frequency = PLL_Clocks.PLL_R_Frequency;
1960 }
1961 }
1962 break;
1963
1964 case LL_RCC_I2C4_CLKSOURCE_HSI: /* I2C4 Clock is HSI Osc. */
1965 if (LL_RCC_HSI_IsReady() == 1U)
1966 {
1967 i2c_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
1968 }
1969 break;
1970
1971 case LL_RCC_I2C4_CLKSOURCE_CSI: /* I2C4 Clock is CSI Osc. */
1972 if (LL_RCC_CSI_IsReady() == 1U)
1973 {
1974 i2c_frequency = CSI_VALUE;
1975 }
1976 break;
1977
1978 default:
1979 /* unreachable code */
1980 break;
1981 }
1982 }
1983 #endif /* I2C4 */
1984 else
1985 {
1986 /* nothing to do */
1987 }
1988
1989 return i2c_frequency;
1990 }
1991
1992 /**
1993 * @brief Return I3Cx clock frequency
1994 * @param I3CxSource This parameter can be one of the following values:
1995 * @arg @ref LL_RCC_I3C1_CLKSOURCE
1996 * @arg @ref LL_RCC_I3C2_CLKSOURCE (*)
1997 *
1998 * (*) : For stm32h503xx family line only.
1999 * @retval I3C clock frequency (in Hz)
2000 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready or no clock is selected
2001 */
LL_RCC_GetI3CClockFreq(uint32_t I3CxSource)2002 uint32_t LL_RCC_GetI3CClockFreq(uint32_t I3CxSource)
2003 {
2004 uint32_t I3C_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2005 LL_PLL_ClocksTypeDef PLL_Clocks;
2006
2007 /* Check parameter */
2008 assert_param(IS_LL_RCC_I3C_CLKSOURCE(I3CxSource));
2009
2010
2011 if (I3CxSource == LL_RCC_I3C1_CLKSOURCE)
2012 {
2013 /* I3C1 CLK clock frequency */
2014 switch (LL_RCC_GetI3CClockSource(I3CxSource))
2015 {
2016 case LL_RCC_I3C1_CLKSOURCE_PCLK1: /* I3C1 Clock is PCLK1 */
2017 I3C_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
2018 break;
2019
2020 #if defined(LL_RCC_I3C1_CLKSOURCE_PLL3R)
2021 case LL_RCC_I3C1_CLKSOURCE_PLL3R: /* I3C1 Clock is PLL3 R */
2022 if (LL_RCC_PLL3_IsReady() != 0U)
2023 {
2024 if (LL_RCC_PLL3R_IsEnabled() != 0U)
2025 {
2026 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
2027 I3C_frequency = PLL_Clocks.PLL_R_Frequency;
2028 }
2029 }
2030 break;
2031 #else
2032 case LL_RCC_I3C1_CLKSOURCE_PLL2R: /* I3C1 Clock is PLL2 R */
2033 if (LL_RCC_PLL2_IsReady() != 0U)
2034 {
2035 if (LL_RCC_PLL2R_IsEnabled() != 0U)
2036 {
2037 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2038 I3C_frequency = PLL_Clocks.PLL_R_Frequency;
2039 }
2040 }
2041 break;
2042 #endif /* LL_RCC_I3C1_CLKSOURCE_PLL3R */
2043
2044 case LL_RCC_I3C1_CLKSOURCE_HSI: /* I3C1 Clock is HSI Osc. */
2045 if (LL_RCC_HSI_IsReady() == 1U)
2046 {
2047 I3C_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
2048 }
2049 break;
2050
2051 case LL_RCC_I3C1_CLKSOURCE_NONE: /* No Clock used for I3C1 */
2052 break;
2053
2054 default:
2055 /* unreachable code */
2056 break;
2057 }
2058
2059 }
2060
2061 #if defined (I3C2)
2062 else if (I3CxSource == LL_RCC_I3C2_CLKSOURCE)
2063 {
2064 /* I3C2 CLK clock frequency */
2065 switch (LL_RCC_GetI3CClockSource(I3CxSource))
2066 {
2067 case LL_RCC_I3C2_CLKSOURCE_PCLK3: /* I3C2 Clock is PCLK3 */
2068 I3C_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
2069 break;
2070
2071 #if defined(RCC_CR_PLL3ON)
2072 case LL_RCC_I3C2_CLKSOURCE_PLL3R: /* I3C2 Clock is PLL3 R */
2073 if (LL_RCC_PLL3_IsReady() != 0U)
2074 {
2075 if (LL_RCC_PLL3R_IsEnabled() != 0U)
2076 {
2077 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
2078 I3C_frequency = PLL_Clocks.PLL_R_Frequency;
2079 }
2080 }
2081 #else
2082 case LL_RCC_I3C2_CLKSOURCE_PLL2R: /* I3C2 Clock is PLL2 R */
2083 if (LL_RCC_PLL2_IsReady() != 0U)
2084 {
2085 if (LL_RCC_PLL2R_IsEnabled() != 0U)
2086 {
2087 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2088 I3C_frequency = PLL_Clocks.PLL_R_Frequency;
2089 }
2090 }
2091 #endif /* PLL3 */
2092 break;
2093
2094 case LL_RCC_I3C2_CLKSOURCE_HSI: /* I3C2 Clock is HSI Osc. */
2095 if (LL_RCC_HSI_IsReady() == 1U)
2096 {
2097 I3C_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
2098 }
2099 break;
2100
2101
2102 case LL_RCC_I3C2_CLKSOURCE_NONE: /* No Clock used for I3C2 */
2103 break;
2104
2105 default:
2106 /* unreachable code */
2107 break;
2108 }
2109 }
2110 #endif /* I3C2 */
2111 else
2112 {
2113 /* nothing to do */
2114 }
2115
2116 return I3C_frequency;
2117 }
2118
2119 /**
2120 * @brief Return LPUARTx clock frequency
2121 * @param LPUARTxSource This parameter can be one of the following values:
2122 * @arg @ref LL_RCC_LPUART1_CLKSOURCE
2123 * @retval LPUART clock frequency (in Hz)
2124 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
2125 */
LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource)2126 uint32_t LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource)
2127 {
2128 uint32_t lpuart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2129 LL_PLL_ClocksTypeDef PLL_Clocks;
2130
2131 /* Check parameter */
2132 assert_param(IS_LL_RCC_LPUART_CLKSOURCE(LPUARTxSource));
2133
2134 /* LPUART1CLK clock frequency */
2135 switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource))
2136 {
2137 case LL_RCC_LPUART1_CLKSOURCE_PCLK3: /* LPUART1 Clock is is PCLK3 */
2138 lpuart_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
2139 break;
2140
2141 case LL_RCC_LPUART1_CLKSOURCE_PLL2Q: /* LPUART1 Clock is PLL2 Q */
2142 if (LL_RCC_PLL2_IsReady() != 0U)
2143 {
2144 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
2145 {
2146 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2147 lpuart_frequency = PLL_Clocks.PLL_Q_Frequency;
2148 }
2149 }
2150 break;
2151
2152 #if defined(LL_RCC_LPUART1_CLKSOURCE_PLL3Q)
2153 case LL_RCC_LPUART1_CLKSOURCE_PLL3Q: /* LPUART1 Clock is PLL3 Q */
2154 if (LL_RCC_PLL3_IsReady() != 0U)
2155 {
2156 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
2157 {
2158 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
2159 lpuart_frequency = PLL_Clocks.PLL_Q_Frequency;
2160 }
2161 }
2162 break;
2163 #endif /* PLL3 */
2164
2165 case LL_RCC_LPUART1_CLKSOURCE_HSI: /* LPUART1 Clock is HSI Osc. */
2166 if (LL_RCC_HSI_IsReady() == 1U)
2167 {
2168 lpuart_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
2169 }
2170 break;
2171
2172 case LL_RCC_LPUART1_CLKSOURCE_CSI: /* LPUART1 Clock is CSI Osc. */
2173 if (LL_RCC_CSI_IsReady() == 1U)
2174 {
2175 lpuart_frequency = CSI_VALUE;
2176 }
2177 break;
2178
2179 case LL_RCC_LPUART1_CLKSOURCE_LSE: /* LPUART1 Clock is LSE Osc. */
2180 if (LL_RCC_LSE_IsReady() == 1U)
2181 {
2182 lpuart_frequency = LSE_VALUE;
2183 }
2184 break;
2185
2186 default:
2187 /* unreachable code */
2188 break;
2189 }
2190
2191 return lpuart_frequency;
2192 }
2193
2194 /**
2195 * @brief Return LPTIMx clock frequency
2196 * @param LPTIMxSource This parameter can be one of the following values:
2197 * @arg @ref LL_RCC_LPTIM1_CLKSOURCE
2198 * @arg @ref LL_RCC_LPTIM2_CLKSOURCE
2199 * @arg @ref LL_RCC_LPTIM3_CLKSOURCE (*)
2200 * @arg @ref LL_RCC_LPTIM4_CLKSOURCE (*)
2201 * @arg @ref LL_RCC_LPTIM5_CLKSOURCE (*)
2202 * @arg @ref LL_RCC_LPTIM6_CLKSOURCE (*)
2203 *
2204 * (*) : For stm32h56xxx and stm32h57xxx family lines only.
2205 * @retval LPTIM clock frequency (in Hz)
2206 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
2207 */
LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)2208 uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
2209 {
2210 uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2211 LL_PLL_ClocksTypeDef PLL_Clocks;
2212
2213 /* Check parameter */
2214 assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
2215
2216 if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE)
2217 {
2218 /* LPTIM1CLK clock frequency */
2219 switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
2220 {
2221 case LL_RCC_LPTIM1_CLKSOURCE_PCLK3: /* LPTIM1 Clock is is PCLK3 */
2222 lptim_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
2223 break;
2224
2225 case LL_RCC_LPTIM1_CLKSOURCE_PLL2P: /* LPTIM1 Clock is PLL2 P */
2226 if (LL_RCC_PLL2_IsReady() != 0U)
2227 {
2228 if (LL_RCC_PLL2P_IsEnabled() != 0U)
2229 {
2230 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2231 lptim_frequency = PLL_Clocks.PLL_P_Frequency;
2232 }
2233 }
2234 break;
2235
2236 #if defined(LL_RCC_LPTIM1_CLKSOURCE_PLL3R)
2237 case LL_RCC_LPTIM1_CLKSOURCE_PLL3R: /* LPTIM1 Clock is PLL3 R */
2238 if (LL_RCC_PLL3_IsReady() != 0U)
2239 {
2240 if (LL_RCC_PLL3R_IsEnabled() != 0U)
2241 {
2242 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
2243 lptim_frequency = PLL_Clocks.PLL_R_Frequency;
2244 }
2245 }
2246 break;
2247 #endif /* PLL3 */
2248
2249 case LL_RCC_LPTIM1_CLKSOURCE_LSE: /* LPTIM1 Clock is LSE Osc. */
2250 if (LL_RCC_LSE_IsReady() == 1U)
2251 {
2252 lptim_frequency = LSE_VALUE;
2253 }
2254 break;
2255
2256 case LL_RCC_LPTIM1_CLKSOURCE_LSI: /* LPTIM1 Clock is LSI Osc. */
2257 if (LL_RCC_LSI_IsReady() == 1U)
2258 {
2259 lptim_frequency = LSI_VALUE;
2260 }
2261 break;
2262
2263 case LL_RCC_LPTIM1_CLKSOURCE_CLKP: /* LPTIM1 Clock is CLKP */
2264 lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
2265 break;
2266
2267 default:
2268 /* unreachable code */
2269 break;
2270 }
2271 }
2272 else if (LPTIMxSource == LL_RCC_LPTIM2_CLKSOURCE)
2273 {
2274 /* LPTIM2CLK clock frequency */
2275 switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
2276 {
2277 case LL_RCC_LPTIM2_CLKSOURCE_PCLK1: /* LPTIM2 Clock is is PCLK1 */
2278 lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
2279 break;
2280
2281 case LL_RCC_LPTIM2_CLKSOURCE_PLL2P: /* LPTIM2 Clock is PLL2 P */
2282 if (LL_RCC_PLL2_IsReady() != 0U)
2283 {
2284 if (LL_RCC_PLL2P_IsEnabled() != 0U)
2285 {
2286 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2287 lptim_frequency = PLL_Clocks.PLL_P_Frequency;
2288 }
2289 }
2290 break;
2291
2292 #if defined(LL_RCC_LPTIM2_CLKSOURCE_PLL3R)
2293 case LL_RCC_LPTIM2_CLKSOURCE_PLL3R: /* LPTIM2 Clock is PLL3 R */
2294 if (LL_RCC_PLL3_IsReady() != 0U)
2295 {
2296 if (LL_RCC_PLL3R_IsEnabled() != 0U)
2297 {
2298 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
2299 lptim_frequency = PLL_Clocks.PLL_R_Frequency;
2300 }
2301 }
2302 break;
2303 #endif /* PLL3 */
2304
2305 case LL_RCC_LPTIM2_CLKSOURCE_LSE: /* LPTIM2 Clock is LSE Osc. */
2306 if (LL_RCC_LSE_IsReady() == 1U)
2307 {
2308 lptim_frequency = LSE_VALUE;
2309 }
2310 break;
2311
2312 case LL_RCC_LPTIM2_CLKSOURCE_LSI: /* LPTIM2 Clock is LSI Osc. */
2313 if (LL_RCC_LSI_IsReady() == 1U)
2314 {
2315 lptim_frequency = LSI_VALUE;
2316 }
2317 break;
2318
2319 case LL_RCC_LPTIM2_CLKSOURCE_CLKP: /* LPTIM2 Clock is CLKP */
2320 lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
2321 break;
2322
2323 default:
2324 /* unreachable code */
2325 break;
2326 }
2327 }
2328 #if defined(LPTIM3)
2329 else if (LPTIMxSource == LL_RCC_LPTIM3_CLKSOURCE)
2330 {
2331 /* LPTIM3CLK clock frequency */
2332 switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
2333 {
2334 case LL_RCC_LPTIM3_CLKSOURCE_PCLK3: /* LPTIM3 Clock is is PCLK3 */
2335 lptim_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
2336 break;
2337
2338 case LL_RCC_LPTIM3_CLKSOURCE_PLL2P: /* LPTIM3 Clock is PLL2 P */
2339 if (LL_RCC_PLL2_IsReady() != 0U)
2340 {
2341 if (LL_RCC_PLL2P_IsEnabled() != 0U)
2342 {
2343 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2344 lptim_frequency = PLL_Clocks.PLL_P_Frequency;
2345 }
2346 }
2347 break;
2348
2349 case LL_RCC_LPTIM3_CLKSOURCE_PLL3R: /* LPTIM3 Clock is PLL3 R */
2350 if (LL_RCC_PLL3_IsReady() != 0U)
2351 {
2352 if (LL_RCC_PLL3R_IsEnabled() != 0U)
2353 {
2354 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
2355 lptim_frequency = PLL_Clocks.PLL_R_Frequency;
2356 }
2357 }
2358 break;
2359
2360 case LL_RCC_LPTIM3_CLKSOURCE_LSE: /* LPTIM3 Clock is LSE Osc. */
2361 if (LL_RCC_LSE_IsReady() == 1U)
2362 {
2363 lptim_frequency = LSE_VALUE;
2364 }
2365 break;
2366
2367 case LL_RCC_LPTIM3_CLKSOURCE_LSI: /* LPTIM3 Clock is LSI Osc. */
2368 if (LL_RCC_LSI_IsReady() == 1U)
2369 {
2370 lptim_frequency = LSI_VALUE;
2371 }
2372 break;
2373
2374 case LL_RCC_LPTIM3_CLKSOURCE_CLKP: /* LPTIM3 Clock is CLKP */
2375 lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
2376 break;
2377
2378 default:
2379 /* unreachable code */
2380 break;
2381 }
2382 }
2383 #endif /* LPTIM3 */
2384 #if defined(LPTIM4)
2385 else if (LPTIMxSource == LL_RCC_LPTIM4_CLKSOURCE)
2386 {
2387 /* LPTIM4CLK clock frequency */
2388 switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
2389 {
2390 case LL_RCC_LPTIM4_CLKSOURCE_PCLK3: /* LPTIM4 Clock is is PCLK3 */
2391 lptim_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
2392 break;
2393
2394 case LL_RCC_LPTIM4_CLKSOURCE_PLL2P: /* LPTIM4 Clock is PLL2 P */
2395 if (LL_RCC_PLL2_IsReady() != 0U)
2396 {
2397 if (LL_RCC_PLL2P_IsEnabled() != 0U)
2398 {
2399 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2400 lptim_frequency = PLL_Clocks.PLL_P_Frequency;
2401 }
2402 }
2403 break;
2404
2405 case LL_RCC_LPTIM4_CLKSOURCE_PLL3R: /* LPTIM4 Clock is PLL3 R */
2406 if (LL_RCC_PLL3_IsReady() != 0U)
2407 {
2408 if (LL_RCC_PLL3R_IsEnabled() != 0U)
2409 {
2410 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
2411 lptim_frequency = PLL_Clocks.PLL_R_Frequency;
2412 }
2413 }
2414 break;
2415
2416 case LL_RCC_LPTIM4_CLKSOURCE_LSE: /* LPTIM4 Clock is LSE Osc. */
2417 if (LL_RCC_LSE_IsReady() == 1U)
2418 {
2419 lptim_frequency = LSE_VALUE;
2420 }
2421 break;
2422
2423 case LL_RCC_LPTIM4_CLKSOURCE_LSI: /* LPTIM4 Clock is LSI Osc. */
2424 if (LL_RCC_LSI_IsReady() == 1U)
2425 {
2426 lptim_frequency = LSI_VALUE;
2427 }
2428 break;
2429
2430 case LL_RCC_LPTIM4_CLKSOURCE_CLKP: /* LPTIM4 Clock is CLKP */
2431 lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
2432 break;
2433
2434 default:
2435 /* unreachable code */
2436 break;
2437 }
2438 }
2439 #endif /* LPTIM4 */
2440 #if defined(LPTIM5)
2441 else if (LPTIMxSource == LL_RCC_LPTIM5_CLKSOURCE)
2442 {
2443 /* LPTIM5CLK clock frequency */
2444 switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
2445 {
2446 case LL_RCC_LPTIM5_CLKSOURCE_PCLK3: /* LPTIM5 Clock is is PCLK3 */
2447 lptim_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
2448 break;
2449
2450 case LL_RCC_LPTIM5_CLKSOURCE_PLL2P: /* LPTIM5 Clock is PLL2 P */
2451 if (LL_RCC_PLL2_IsReady() != 0U)
2452 {
2453 if (LL_RCC_PLL2P_IsEnabled() != 0U)
2454 {
2455 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2456 lptim_frequency = PLL_Clocks.PLL_P_Frequency;
2457 }
2458 }
2459 break;
2460
2461 case LL_RCC_LPTIM5_CLKSOURCE_PLL3R: /* LPTIM5 Clock is PLL3 R */
2462 if (LL_RCC_PLL3_IsReady() != 0U)
2463 {
2464 if (LL_RCC_PLL3R_IsEnabled() != 0U)
2465 {
2466 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
2467 lptim_frequency = PLL_Clocks.PLL_R_Frequency;
2468 }
2469 }
2470 break;
2471
2472 case LL_RCC_LPTIM5_CLKSOURCE_LSE: /* LPTIM5 Clock is LSE Osc. */
2473 if (LL_RCC_LSE_IsReady() == 1U)
2474 {
2475 lptim_frequency = LSE_VALUE;
2476 }
2477 break;
2478
2479 case LL_RCC_LPTIM5_CLKSOURCE_LSI: /* LPTIM5 Clock is LSI Osc. */
2480 if (LL_RCC_LSI_IsReady() == 1U)
2481 {
2482 lptim_frequency = LSI_VALUE;
2483 }
2484 break;
2485
2486 case LL_RCC_LPTIM5_CLKSOURCE_CLKP: /* LPTIM5 Clock is CLKP */
2487 lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
2488 break;
2489
2490 default:
2491 /* unreachable code */
2492 break;
2493 }
2494 }
2495 #endif /* LPTIM5 */
2496 #if defined(LPTIM6)
2497 else if (LPTIMxSource == LL_RCC_LPTIM6_CLKSOURCE)
2498 {
2499 /* LPTIM6CLK clock frequency */
2500 switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
2501 {
2502 case LL_RCC_LPTIM6_CLKSOURCE_PCLK3: /* LPTIM6 Clock is is PCLK3 */
2503 lptim_frequency = RCC_GetPCLK3ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
2504 break;
2505
2506 case LL_RCC_LPTIM6_CLKSOURCE_PLL2P: /* LPTIM6 Clock is PLL2 P */
2507 if (LL_RCC_PLL2_IsReady() != 0U)
2508 {
2509 if (LL_RCC_PLL2P_IsEnabled() != 0U)
2510 {
2511 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2512 lptim_frequency = PLL_Clocks.PLL_P_Frequency;
2513 }
2514 }
2515 break;
2516
2517 case LL_RCC_LPTIM6_CLKSOURCE_PLL3R: /* LPTIM6 Clock is PLL3 R */
2518 if (LL_RCC_PLL3_IsReady() != 0U)
2519 {
2520 if (LL_RCC_PLL3R_IsEnabled() != 0U)
2521 {
2522 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
2523 lptim_frequency = PLL_Clocks.PLL_R_Frequency;
2524 }
2525 }
2526 break;
2527
2528 case LL_RCC_LPTIM6_CLKSOURCE_LSE: /* LPTIM6 Clock is LSE Osc. */
2529 if (LL_RCC_LSE_IsReady() == 1U)
2530 {
2531 lptim_frequency = LSE_VALUE;
2532 }
2533 break;
2534
2535 case LL_RCC_LPTIM6_CLKSOURCE_LSI: /* LPTIM6 Clock is LSI Osc. */
2536 if (LL_RCC_LSI_IsReady() == 1U)
2537 {
2538 lptim_frequency = LSI_VALUE;
2539 }
2540 break;
2541
2542 case LL_RCC_LPTIM6_CLKSOURCE_CLKP: /* LPTIM6 Clock is CLKP */
2543 lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
2544 break;
2545
2546 default:
2547 /* unreachable code */
2548 break;
2549 }
2550 }
2551 #endif /* LPTIM6 */
2552 else
2553 {
2554 /* nothing to do */
2555 }
2556
2557 return lptim_frequency;
2558 }
2559
2560 #if defined(SAI1)
2561 /**
2562 * @brief Return SAIx clock frequency
2563 * @param SAIxSource This parameter can be one of the following values:
2564 * @arg @ref LL_RCC_SAI1_CLKSOURCE
2565 * @arg @ref LL_RCC_SAI2_CLKSOURCE
2566 * @retval SAI clock frequency (in Hz)
2567 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that PLL is not ready
2568 */
LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)2569 uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
2570 {
2571 uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2572 LL_PLL_ClocksTypeDef PLL_Clocks;
2573
2574 /* Check parameter */
2575 assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
2576
2577 if (SAIxSource == LL_RCC_SAI1_CLKSOURCE)
2578 {
2579 /* SAI1CLK clock frequency */
2580 switch (LL_RCC_GetSAIClockSource(SAIxSource))
2581 {
2582 case LL_RCC_SAI1_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as SAI1 clock source */
2583 if (LL_RCC_PLL1_IsReady() != 0U)
2584 {
2585 if (LL_RCC_PLL1Q_IsEnabled() != 0U)
2586 {
2587 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
2588 sai_frequency = PLL_Clocks.PLL_Q_Frequency;
2589 }
2590 }
2591 break;
2592
2593 case LL_RCC_SAI1_CLKSOURCE_PLL2P: /* PLL2 P clock used as SAI1 clock source */
2594 if (LL_RCC_PLL2_IsReady() != 0U)
2595 {
2596 if (LL_RCC_PLL2P_IsEnabled() != 0U)
2597 {
2598 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2599 sai_frequency = PLL_Clocks.PLL_P_Frequency;
2600 }
2601 }
2602 break;
2603
2604 case LL_RCC_SAI1_CLKSOURCE_PLL3P: /* PLL3 P clock used as SAI1 clock source */
2605 if (LL_RCC_PLL3_IsReady() != 0U)
2606 {
2607 if (LL_RCC_PLL3P_IsEnabled() != 0U)
2608 {
2609 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
2610 sai_frequency = PLL_Clocks.PLL_P_Frequency;
2611 }
2612 }
2613 break;
2614
2615 case LL_RCC_SAI1_CLKSOURCE_PIN: /* External input clock used as SAI1 clock source */
2616 sai_frequency = EXTERNAL_CLOCK_VALUE;
2617 break;
2618
2619 case LL_RCC_SAI1_CLKSOURCE_CLKP: /* CLKP used as SAI1 clock source */
2620 sai_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
2621 break;
2622
2623 default:
2624 /* unreachable code */
2625 break;
2626 }
2627 }
2628 else if (SAIxSource == LL_RCC_SAI2_CLKSOURCE)
2629 {
2630 /* SAI2CLK clock frequency */
2631 switch (LL_RCC_GetSAIClockSource(SAIxSource))
2632 {
2633 case LL_RCC_SAI2_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as SAI2 clock source */
2634 if (LL_RCC_PLL1_IsReady() != 0U)
2635 {
2636 if (LL_RCC_PLL1Q_IsEnabled() != 0U)
2637 {
2638 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
2639 sai_frequency = PLL_Clocks.PLL_Q_Frequency;
2640 }
2641 }
2642 break;
2643
2644 case LL_RCC_SAI2_CLKSOURCE_PLL2P: /* PLL2 P clock used as SAI2 clock source */
2645 if (LL_RCC_PLL2_IsReady() != 0U)
2646 {
2647 if (LL_RCC_PLL2P_IsEnabled() != 0U)
2648 {
2649 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2650 sai_frequency = PLL_Clocks.PLL_P_Frequency;
2651 }
2652 }
2653 break;
2654
2655 case LL_RCC_SAI2_CLKSOURCE_PLL3P: /* PLL3 P clock used as SAI2 clock source */
2656 if (LL_RCC_PLL3_IsReady() != 0U)
2657 {
2658 if (LL_RCC_PLL3P_IsEnabled() != 0U)
2659 {
2660 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
2661 sai_frequency = PLL_Clocks.PLL_P_Frequency;
2662 }
2663 }
2664 break;
2665
2666 case LL_RCC_SAI2_CLKSOURCE_PIN: /* External input clock used as SAI2 clock source */
2667 sai_frequency = EXTERNAL_CLOCK_VALUE;
2668 break;
2669
2670 case LL_RCC_SAI2_CLKSOURCE_CLKP: /* SAI2 Clock is CLKP */
2671 sai_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
2672 break;
2673
2674 default:
2675 /* unreachable code */
2676 break;
2677 }
2678 }
2679 else
2680 {
2681 /* nothing to do */
2682 }
2683
2684 return sai_frequency;
2685 }
2686 #endif /* SAI1 */
2687
2688 #if defined(SDMMC1)
2689 /**
2690 * @brief Return SDMMCx clock frequency
2691 * @param SDMMCxSource This parameter can be one of the following values:
2692 * @arg @ref LL_RCC_SDMMC1_CLKSOURCE
2693 * @arg @ref LL_RCC_SDMMC2_CLKSOURCE (*)
2694 * @retval SDMMC clock frequency (in Hz)
2695 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
2696 *
2697 * (*) : Available on some STM32H5 lines only.
2698 */
LL_RCC_GetSDMMCClockFreq(uint32_t SDMMCxSource)2699 uint32_t LL_RCC_GetSDMMCClockFreq(uint32_t SDMMCxSource)
2700 {
2701 uint32_t sdmmc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2702 LL_PLL_ClocksTypeDef PLL_Clocks;
2703
2704 /* Check parameter */
2705 assert_param(IS_LL_RCC_SDMMC_CLKSOURCE(SDMMCxSource));
2706
2707 if (SDMMCxSource == LL_RCC_SDMMC1_CLKSOURCE)
2708 {
2709 /* SDMMC1CLK clock frequency */
2710 switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
2711 {
2712 case LL_RCC_SDMMC1_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as SDMMC1 clock source */
2713 if (LL_RCC_PLL1_IsReady() != 0U)
2714 {
2715 if (LL_RCC_PLL1Q_IsEnabled() != 0U)
2716 {
2717 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
2718 sdmmc_frequency = PLL_Clocks.PLL_Q_Frequency;
2719 }
2720 }
2721 break;
2722
2723 case LL_RCC_SDMMC1_CLKSOURCE_PLL2R: /* PLL2 R clock used as SDMMC1 clock source */
2724 if (LL_RCC_PLL2_IsReady() != 0U)
2725 {
2726 if (LL_RCC_PLL2R_IsEnabled() != 0U)
2727 {
2728 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2729 sdmmc_frequency = PLL_Clocks.PLL_R_Frequency;
2730 }
2731 }
2732 break;
2733
2734 default:
2735 /* unreachable code */
2736 break;
2737 }
2738 }
2739
2740 #if defined(SDMMC2)
2741 else if (SDMMCxSource == LL_RCC_SDMMC2_CLKSOURCE)
2742 {
2743 /* SDMMC2CLK clock frequency */
2744 switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
2745 {
2746 case LL_RCC_SDMMC2_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as SDMMC2 clock source */
2747 if (LL_RCC_PLL1_IsReady() != 0U)
2748 {
2749 if (LL_RCC_PLL1Q_IsEnabled() != 0U)
2750 {
2751 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
2752 sdmmc_frequency = PLL_Clocks.PLL_Q_Frequency;
2753 }
2754 }
2755 break;
2756
2757 case LL_RCC_SDMMC2_CLKSOURCE_PLL2R: /* PLL2 R clock used as SDMMC2 clock source */
2758 if (LL_RCC_PLL2_IsReady() != 0U)
2759 {
2760 if (LL_RCC_PLL2R_IsEnabled() != 0U)
2761 {
2762 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2763 sdmmc_frequency = PLL_Clocks.PLL_R_Frequency;
2764 }
2765 }
2766 break;
2767
2768 default:
2769 /* unreachable code */
2770 break;
2771 }
2772 }
2773 #endif /* SDMMC2 */
2774
2775 else
2776 {
2777 /* nothing to do */
2778 }
2779
2780 return sdmmc_frequency;
2781 }
2782 #endif /* SDMMC1 */
2783
2784 /**
2785 * @brief Return RNGx clock frequency
2786 * @param RNGxSource This parameter can be one of the following values:
2787 * @arg @ref LL_RCC_RNG_CLKSOURCE
2788 * @retval RNG clock frequency (in Hz)
2789 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
2790 */
LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)2791 uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
2792 {
2793 uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2794 LL_PLL_ClocksTypeDef PLL_Clocks;
2795
2796 /* Check parameter */
2797 assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource));
2798
2799 /* RNGCLK clock frequency */
2800 switch (LL_RCC_GetRNGClockSource(RNGxSource))
2801 {
2802 case LL_RCC_RNG_CLKSOURCE_HSI48: /* HSI48 clock used as RNG clock source */
2803 if (LL_RCC_HSI48_IsReady() == 1U)
2804 {
2805 rng_frequency = HSI48_VALUE;
2806 }
2807 break;
2808
2809 case LL_RCC_RNG_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as RNG clock source */
2810 if (LL_RCC_PLL1_IsReady() != 0U)
2811 {
2812 if (LL_RCC_PLL1Q_IsEnabled() != 0U)
2813 {
2814 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
2815 rng_frequency = PLL_Clocks.PLL_Q_Frequency;
2816 }
2817 }
2818 break;
2819
2820 case LL_RCC_RNG_CLKSOURCE_LSE: /* LSE clock used as RNG clock source */
2821 if (LL_RCC_LSE_IsReady() == 1U)
2822 {
2823 rng_frequency = LSE_VALUE;
2824 }
2825 break;
2826
2827 case LL_RCC_RNG_CLKSOURCE_LSI: /* LSI clock used as RNG clock source */
2828 if (LL_RCC_LSI_IsReady() == 1U)
2829 {
2830 rng_frequency = LSI_VALUE;
2831 }
2832 break;
2833
2834 default:
2835 /* unreachable code */
2836 break;
2837
2838 }
2839
2840 return rng_frequency;
2841 }
2842
2843 #if defined(USB_DRD_FS)
2844 /**
2845 * @brief Return USBx clock frequency
2846 * @param USBxSource This parameter can be one of the following values:
2847 * @arg @ref LL_RCC_USB_CLKSOURCE
2848 * @retval USB clock frequency (in Hz)
2849 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready or no clock is selected
2850 */
LL_RCC_GetUSBClockFreq(uint32_t USBxSource)2851 uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
2852 {
2853 uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2854 LL_PLL_ClocksTypeDef PLL_Clocks;
2855
2856 /* Check parameter */
2857 assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource));
2858
2859 /* USBCLK clock frequency */
2860 switch (LL_RCC_GetUSBClockSource(USBxSource))
2861 {
2862
2863 case LL_RCC_USB_CLKSOURCE_NONE: /* NO clock used as USB clock source */
2864 break;
2865
2866 case LL_RCC_USB_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as USB clock source */
2867 if (LL_RCC_PLL1_IsReady() != 0U)
2868 {
2869 if (LL_RCC_PLL1Q_IsEnabled() != 0U)
2870 {
2871 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
2872 usb_frequency = PLL_Clocks.PLL_Q_Frequency;
2873 }
2874 }
2875 break;
2876
2877 #if defined(LL_RCC_USB_CLKSOURCE_PLL3Q)
2878 case LL_RCC_USB_CLKSOURCE_PLL3Q: /* PLL3 Q clock used as USB clock source */
2879 if (LL_RCC_PLL3_IsReady() != 0U)
2880 {
2881 if (LL_RCC_PLL3Q_IsEnabled() != 0U)
2882 {
2883 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
2884 usb_frequency = PLL_Clocks.PLL_Q_Frequency;
2885 }
2886 }
2887 break;
2888 #else
2889 case LL_RCC_USB_CLKSOURCE_PLL2Q: /* PLL2 Q clock used as USB clock source */
2890 if (LL_RCC_PLL2_IsReady() != 0U)
2891 {
2892 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
2893 {
2894 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2895 usb_frequency = PLL_Clocks.PLL_Q_Frequency;
2896 }
2897 }
2898 break;
2899 #endif /* LL_RCC_USB_CLKSOURCE_PLL3Q */
2900
2901 case LL_RCC_USB_CLKSOURCE_HSI48: /* HSI48 clock used as USB clock source */
2902 if (LL_RCC_HSI48_IsReady() == 1U)
2903 {
2904 usb_frequency = HSI48_VALUE;
2905 }
2906 break;
2907
2908 default:
2909 /* unreachable code */
2910 break;
2911 }
2912
2913 return usb_frequency;
2914 }
2915 #endif /* USB_DRD_FS */
2916
2917 /**
2918 * @brief Return ADCxDAC clock frequency
2919 * @param ADCDACxSource This parameter can be one of the following values:
2920 * @arg @ref LL_RCC_ADCDAC_CLKSOURCE
2921 * @retval ADCDAC clock frequency (in Hz)
2922 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
2923 */
LL_RCC_GetADCDACClockFreq(uint32_t ADCDACxSource)2924 uint32_t LL_RCC_GetADCDACClockFreq(uint32_t ADCDACxSource)
2925 {
2926 uint32_t adcdac_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2927 LL_PLL_ClocksTypeDef PLL_Clocks;
2928
2929 /* Check parameter */
2930 assert_param(IS_LL_RCC_ADCDAC_CLKSOURCE(ADCDACxSource));
2931
2932 /* ADCCLK clock frequency */
2933 switch (LL_RCC_GetADCDACClockSource(ADCDACxSource))
2934 {
2935 case LL_RCC_ADCDAC_CLKSOURCE_HCLK: /* ADCDAC Clock is AHB clock */
2936 adcdac_frequency = RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq());
2937 break;
2938
2939 case LL_RCC_ADCDAC_CLKSOURCE_SYSCLK: /* ADCDAC Clock is SYSCLK clock */
2940 adcdac_frequency = RCC_GetSystemClockFreq();
2941 break;
2942
2943 case LL_RCC_ADCDAC_CLKSOURCE_PLL2R: /* ADCDAC Clock is PLL2 R */
2944 if (LL_RCC_PLL2_IsReady() != 0U)
2945 {
2946 if (LL_RCC_PLL2R_IsEnabled() != 0U)
2947 {
2948 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
2949 adcdac_frequency = PLL_Clocks.PLL_R_Frequency;
2950 }
2951 }
2952 break;
2953
2954 case LL_RCC_ADCDAC_CLKSOURCE_HSE: /* ADCDAC Clock is HSE Osc. */
2955 if (LL_RCC_HSE_IsReady() == 1U)
2956 {
2957 adcdac_frequency = HSE_VALUE;
2958 }
2959 break;
2960
2961 case LL_RCC_ADCDAC_CLKSOURCE_HSI: /* ADCDAC Clock is HSI Osc. */
2962 if (LL_RCC_HSI_IsReady() == 1U)
2963 {
2964 adcdac_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
2965 }
2966 break;
2967
2968 case LL_RCC_ADCDAC_CLKSOURCE_CSI: /* ADCDAC Clock is CSI Osc. */
2969 if (LL_RCC_CSI_IsReady() == 1U)
2970 {
2971 adcdac_frequency = CSI_VALUE;
2972 }
2973 break;
2974
2975 default:
2976 /* unreachable code */
2977 break;
2978 }
2979
2980 return adcdac_frequency;
2981 }
2982
2983 /**
2984 * @brief Return DAC low-power clock frequency
2985 * @param DACLPxSource This parameter can be one of the following values:
2986 * @arg @ref LL_RCC_DAC_LP_CLKSOURCE
2987 * @retval DAC low-power clock frequency (in Hz)
2988 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that LSI or LSE oscillator is not ready
2989 */
LL_RCC_GetDACLPClockFreq(uint32_t DACLPxSource)2990 uint32_t LL_RCC_GetDACLPClockFreq(uint32_t DACLPxSource)
2991 {
2992 uint32_t daclp_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
2993
2994 /* Check parameter */
2995 assert_param(IS_LL_RCC_DAC_LP_CLKSOURCE(DACLPxSource));
2996
2997 /* DAC clock frequency */
2998 switch (LL_RCC_GetDACLPClockSource(DACLPxSource))
2999 {
3000 case LL_RCC_DAC_LP_CLKSOURCE_LSE: /* DAC low-power Clock is LSE Osc. */
3001 if (LL_RCC_LSE_IsReady() == 1U)
3002 {
3003 daclp_frequency = LSE_VALUE;
3004 }
3005 break;
3006
3007 case LL_RCC_DAC_LP_CLKSOURCE_LSI: /* DAC low-power Clock is LSI Osc. */
3008 if (LL_RCC_LSI_IsReady() == 1U)
3009 {
3010 daclp_frequency = LSI_VALUE;
3011 }
3012 break;
3013
3014 default:
3015 /* unreachable code */
3016 break;
3017 }
3018
3019 return daclp_frequency;
3020 }
3021
3022 #if defined( OCTOSPI1)
3023 /**
3024 * @brief Return OCTOSPI clock frequency
3025 * @param OCTOSPIxSource This parameter can be one of the following values:
3026 * @arg @ref LL_RCC_OCTOSPI_CLKSOURCE
3027 * @retval OCTOSPI clock frequency (in Hz)
3028 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready
3029 */
LL_RCC_GetOCTOSPIClockFreq(uint32_t OCTOSPIxSource)3030 uint32_t LL_RCC_GetOCTOSPIClockFreq(uint32_t OCTOSPIxSource)
3031 {
3032 uint32_t octospi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
3033 LL_PLL_ClocksTypeDef PLL_Clocks;
3034
3035 /* Check parameter */
3036 assert_param(IS_LL_RCC_OCTOSPI_CLKSOURCE(OCTOSPIxSource));
3037
3038 /* OCTOSPI clock frequency */
3039 switch (LL_RCC_GetOCTOSPIClockSource(OCTOSPIxSource))
3040 {
3041 case LL_RCC_OSPI_CLKSOURCE_HCLK: /* OCTOSPI clock is SYSCLK */
3042 octospi_frequency = RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq());
3043 break;
3044
3045 case LL_RCC_OSPI_CLKSOURCE_PLL1Q: /* OSPI Clock is PLL1 Q */
3046 if (LL_RCC_PLL1_IsReady() != 0U)
3047 {
3048 if (LL_RCC_PLL1Q_IsEnabled() != 0U)
3049 {
3050 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
3051 octospi_frequency = PLL_Clocks.PLL_Q_Frequency;
3052 }
3053 }
3054 break;
3055
3056 case LL_RCC_OSPI_CLKSOURCE_PLL2R: /* OSPI Clock is PLL2 R */
3057 if (LL_RCC_PLL2_IsReady() != 0U)
3058 {
3059 if (LL_RCC_PLL2R_IsEnabled() != 0U)
3060 {
3061 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
3062 octospi_frequency = PLL_Clocks.PLL_R_Frequency;
3063 }
3064 }
3065 break;
3066
3067 case LL_RCC_OSPI_CLKSOURCE_CLKP: /* OSPI Clock is CLKP */
3068 octospi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_GetCLKPClockSource(LL_RCC_CLKP_CLKSOURCE));
3069 break;
3070
3071 default:
3072 /* unreachable code */
3073 break;
3074 }
3075
3076 return octospi_frequency;
3077 }
3078 #endif /* OCTOSPI1 */
3079
3080 /**
3081 * @brief Return FDCAN kernel clock frequency
3082 * @param FDCANxSource This parameter can be one of the following values:
3083 * @arg @ref LL_RCC_FDCAN_CLKSOURCE
3084 * @retval FDCAN kernel clock frequency (in Hz)
3085 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator or PLL is not ready or no clock is selected
3086 *
3087 */
LL_RCC_GetFDCANClockFreq(uint32_t FDCANxSource)3088 uint32_t LL_RCC_GetFDCANClockFreq(uint32_t FDCANxSource)
3089 {
3090 uint32_t fdcan_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
3091 LL_PLL_ClocksTypeDef PLL_Clocks;
3092
3093 /* Check parameter */
3094 assert_param(IS_LL_RCC_FDCAN_CLKSOURCE(FDCANxSource));
3095
3096 /* FDCANCLK clock frequency */
3097 switch (LL_RCC_GetFDCANClockSource(FDCANxSource))
3098 {
3099 case LL_RCC_FDCAN_CLKSOURCE_HSE: /* HSE clock used as FDCAN clock source */
3100 if (LL_RCC_HSE_IsReady() == 1U)
3101 {
3102 fdcan_frequency = HSE_VALUE;
3103 }
3104 break;
3105
3106 case LL_RCC_FDCAN_CLKSOURCE_PLL1Q: /* PLL1 Q clock used as FDCAN clock source */
3107 if (LL_RCC_PLL1_IsReady() != 0U)
3108 {
3109 if (LL_RCC_PLL1Q_IsEnabled() != 0U)
3110 {
3111 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
3112 fdcan_frequency = PLL_Clocks.PLL_Q_Frequency;
3113 }
3114 }
3115 break;
3116
3117 case LL_RCC_FDCAN_CLKSOURCE_PLL2Q: /* PLL2 Q clock used as FDCAN clock source */
3118 if (LL_RCC_PLL2_IsReady() != 0U)
3119 {
3120 if (LL_RCC_PLL2Q_IsEnabled() != 0U)
3121 {
3122 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
3123 fdcan_frequency = PLL_Clocks.PLL_Q_Frequency;
3124 }
3125 }
3126 break;
3127
3128 case LL_RCC_FDCAN_CLKSOURCE_NONE: /* No clock used as FDCAN clock source */
3129 break;
3130
3131 default:
3132 /* unreachable code */
3133 break;
3134 }
3135
3136 return fdcan_frequency;
3137 }
3138
3139 #if defined(CEC)
3140 /**
3141 * @brief Return CEC clock frequency
3142 * @param CECxSource This parameter can be one of the following values:
3143 * @arg @ref LL_RCC_CEC_CLKSOURCE
3144 * @retval CEC clock frequency (in Hz)
3145 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready or no clock is selected
3146 */
LL_RCC_GetCECClockFreq(uint32_t CECxSource)3147 uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource)
3148 {
3149 uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
3150
3151 switch (LL_RCC_GetCECClockSource(CECxSource))
3152 {
3153 case LL_RCC_CEC_CLKSOURCE_LSE: /* CEC Clock is LSE */
3154 if (LL_RCC_LSE_IsReady() != 0U)
3155 {
3156 cec_frequency = LSE_VALUE;
3157 }
3158 break;
3159
3160 case LL_RCC_CEC_CLKSOURCE_LSI: /* CEC Clock is LSI */
3161 if (LL_RCC_LSI_IsReady() != 0U)
3162 {
3163 cec_frequency = LSI_VALUE;
3164 }
3165 break;
3166
3167 case LL_RCC_CEC_CLKSOURCE_CSI_DIV122: /* CEC Clock is CSI divided by 122 */
3168 if (LL_RCC_CSI_IsReady() != 0U)
3169 {
3170 cec_frequency = CSI_VALUE / 122U;
3171 }
3172 break;
3173
3174 case LL_RCC_CEC_CLKSOURCE_NONE: /* No Clock selected for CEC */
3175 break;
3176
3177 default:
3178 /* Kernel clock disabled */
3179 break;
3180 }
3181
3182 return cec_frequency;
3183 }
3184 #endif /* CEC */
3185
3186 /**
3187 * @brief Return CLKP clock frequency
3188 * @param CLKPxSource This parameter can be one of the following values:
3189 * @arg @ref LL_RCC_CLKP_CLKSOURCE
3190 * @retval CLKP clock frequency (in Hz)
3191 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready or no clock is selected
3192 */
LL_RCC_GetCLKPClockFreq(uint32_t CLKPxSource)3193 uint32_t LL_RCC_GetCLKPClockFreq(uint32_t CLKPxSource)
3194 {
3195 uint32_t clkp_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
3196
3197 switch (LL_RCC_GetCLKPClockSource(CLKPxSource))
3198 {
3199 case LL_RCC_CLKP_CLKSOURCE_HSI: /* HSI used as CLKP clock source */
3200 if (LL_RCC_HSI_IsReady() != 0U)
3201 {
3202 clkp_frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
3203 }
3204 break;
3205
3206 case LL_RCC_CLKP_CLKSOURCE_CSI: /* CSI used as CLKP clock source */
3207 if (LL_RCC_CSI_IsReady() != 0U)
3208 {
3209 clkp_frequency = CSI_VALUE;
3210 }
3211 break;
3212
3213 case LL_RCC_CLKP_CLKSOURCE_HSE: /* HSE used as CLKP clock source */
3214 if (LL_RCC_HSE_IsReady() != 0U)
3215 {
3216 clkp_frequency = HSE_VALUE;
3217 }
3218 break;
3219
3220 case LL_RCC_CLKP_CLKSOURCE_NONE: /* NO clock used as CLKP clock source */
3221 break;
3222
3223 default:
3224 /* CLKP clock disabled */
3225 break;
3226 }
3227
3228 return clkp_frequency;
3229 }
3230
3231 /**
3232 * @}
3233 */
3234
3235 /**
3236 * @}
3237 */
3238
3239 /** @addtogroup RCC_LL_Private_Functions
3240 * @{
3241 */
3242
3243 /**
3244 * @brief Return SYSTEM clock frequency
3245 * @retval SYSTEM clock frequency (in Hz)
3246 */
RCC_GetSystemClockFreq(void)3247 uint32_t RCC_GetSystemClockFreq(void)
3248 {
3249 uint32_t frequency;
3250
3251 /* Get SYSCLK source -------------------------------------------------------*/
3252 switch (LL_RCC_GetSysClkSource())
3253 {
3254 case LL_RCC_SYS_CLKSOURCE_STATUS_HSI: /* HSI used as system clock source */
3255 frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
3256 break;
3257
3258 case LL_RCC_SYS_CLKSOURCE_STATUS_CSI: /* CSI used as system clock source */
3259 frequency = CSI_VALUE;
3260 break;
3261
3262 case LL_RCC_SYS_CLKSOURCE_STATUS_HSE: /* HSE used as system clock source */
3263 frequency = HSE_VALUE;
3264 break;
3265
3266 case LL_RCC_SYS_CLKSOURCE_STATUS_PLL1: /* PLL1 used as system clock source */
3267 frequency = RCC_PLL1_GetFreqSystem();
3268 break;
3269
3270 default:
3271 frequency = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
3272 break;
3273 }
3274
3275 return frequency;
3276 }
3277
3278 /**
3279 * @brief Return HCLK clock frequency
3280 * @param SYSCLK_Frequency SYSCLK clock frequency
3281 * @retval HCLK clock frequency (in Hz)
3282 */
RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)3283 uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
3284 {
3285 /* HCLK clock frequency */
3286 return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
3287 }
3288
3289 /**
3290 * @brief Return PCLK1 clock frequency
3291 * @param HCLK_Frequency HCLK clock frequency
3292 * @retval PCLK1 clock frequency (in Hz)
3293 */
RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)3294 uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
3295 {
3296 /* PCLK1 clock frequency */
3297 return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
3298 }
3299
3300 /**
3301 * @brief Return PCLK2 clock frequency
3302 * @param HCLK_Frequency HCLK clock frequency
3303 * @retval PCLK2 clock frequency (in Hz)
3304 */
RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)3305 uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
3306 {
3307 /* PCLK2 clock frequency */
3308 return __LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
3309 }
3310
3311
3312 /**
3313 * @brief Return PCLK3 clock frequency
3314 * @param HCLK_Frequency HCLK clock frequency
3315 * @retval PCLK3 clock frequency (in Hz)
3316 */
RCC_GetPCLK3ClockFreq(uint32_t HCLK_Frequency)3317 uint32_t RCC_GetPCLK3ClockFreq(uint32_t HCLK_Frequency)
3318 {
3319 /* PCLK3 clock frequency */
3320 return __LL_RCC_CALC_PCLK3_FREQ(HCLK_Frequency, LL_RCC_GetAPB3Prescaler());
3321 }
3322
3323 /**
3324 * @brief Return PLL1 clock frequency used for system clock
3325 * @retval PLL1 clock frequency (in Hz)
3326 */
RCC_PLL1_GetFreqSystem(void)3327 uint32_t RCC_PLL1_GetFreqSystem(void)
3328 {
3329 uint32_t pllinputfreq;
3330 uint32_t pllsource;
3331
3332 /* PLL_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLLM) * PLLN
3333 SYSCLK = PLL_VCO / PLLP
3334 */
3335 pllsource = LL_RCC_PLL1_GetSource();
3336
3337 switch (pllsource)
3338 {
3339 case LL_RCC_PLL1SOURCE_HSI: /* HSI used as PLL1 clock source */
3340 pllinputfreq = __LL_RCC_CALC_HSI_FREQ(LL_RCC_HSI_GetDivider());
3341 break;
3342
3343 case LL_RCC_PLL1SOURCE_CSI: /* CSI used as PLL1 clock source */
3344 pllinputfreq = CSI_VALUE;
3345 break;
3346
3347 case LL_RCC_PLL1SOURCE_HSE: /* HSE used as PLL1 clock source */
3348 pllinputfreq = HSE_VALUE;
3349 break;
3350
3351 default:
3352 pllinputfreq = 0;
3353 break;
3354 }
3355 return __LL_RCC_CALC_PLL1CLK_P_FREQ(pllinputfreq, LL_RCC_PLL1_GetM(),
3356 LL_RCC_PLL1_GetN(), LL_RCC_PLL1_GetP());
3357 }
3358
3359
3360 /**
3361 * @}
3362 */
3363
3364
3365 /**
3366 * @}
3367 */
3368
3369 #endif /* defined(RCC) */
3370
3371 /**
3372 * @}
3373 */
3374
3375 #endif /* USE_FULL_LL_DRIVER */
3376