1 /**
2 ******************************************************************************
3 * @file stm32g0xx_ll_rcc.c
4 * @author MCD Application Team
5 * @brief RCC LL module driver.
6 ******************************************************************************
7 * @attention
8 *
9 * Copyright (c) 2018 STMicroelectronics.
10 * All rights reserved.
11 *
12 * This software is licensed under terms that can be found in the LICENSE file in
13 * the root directory of this software component.
14 * If no LICENSE file comes with this software, it is provided AS-IS.
15 ******************************************************************************
16 */
17 #if defined(USE_FULL_LL_DRIVER)
18
19 /* Includes ------------------------------------------------------------------*/
20 #include "stm32g0xx_ll_rcc.h"
21 #ifdef USE_FULL_ASSERT
22 #include "stm32_assert.h"
23 #else
24 #define assert_param(expr) ((void)0U)
25 #endif /* USE_FULL_ASSERT */
26 /** @addtogroup STM32G0xx_LL_Driver
27 * @{
28 */
29
30 #if defined(RCC)
31
32 /** @addtogroup RCC_LL
33 * @{
34 */
35
36 /* Private types -------------------------------------------------------------*/
37 /* Private variables ---------------------------------------------------------*/
38 /* Private constants ---------------------------------------------------------*/
39 /* Private macros ------------------------------------------------------------*/
40 /** @addtogroup RCC_LL_Private_Macros
41 * @{
42 */
43 #if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx)
44 #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
45 || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \
46 || ((__VALUE__) == LL_RCC_USART3_CLKSOURCE))
47 #elif defined(STM32G081xx) || defined(STM32G071xx) || defined(STM32G070xx)
48 #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
49 || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE))
50 #else
51 #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_USART1_CLKSOURCE)
52 #endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */
53
54 #if defined(LPUART1) && defined(LPUART2)
55 #define IS_LL_RCC_LPUART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPUART1_CLKSOURCE) \
56 || ((__VALUE__) == LL_RCC_LPUART2_CLKSOURCE))
57 #elif defined(LPUART1)
58 #define IS_LL_RCC_LPUART_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_LPUART1_CLKSOURCE)
59 #endif /* LPUART1 && LPUART2 */
60
61 #if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx)
62 #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
63 || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE))
64 #else
65 #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_I2C1_CLKSOURCE)
66 #endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */
67
68 #if defined(LPTIM1) || defined(LPTIM2)
69 #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE) \
70 || ((__VALUE__) == LL_RCC_LPTIM2_CLKSOURCE))
71 #endif /* LPTIM1 || LPTIM2 */
72
73 #if defined(RNG)
74 #define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_RNG_CLKSOURCE))
75 #endif /* RNG */
76
77 #define IS_LL_RCC_ADC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_ADC_CLKSOURCE))
78
79 #if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx)
80 #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE) \
81 || ((__VALUE__) == LL_RCC_I2S2_CLKSOURCE))
82 #else
83 #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE))
84 #endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */
85
86 #if defined(CEC)
87 #define IS_LL_RCC_CEC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_CEC_CLKSOURCE))
88 #endif /* CEC */
89
90 #if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx)
91 #define IS_LL_RCC_USB_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USB_CLKSOURCE))
92 #endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */
93
94 #if defined(FDCAN1) || defined(FDCAN2)
95 #define IS_LL_RCC_FDCAN_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_FDCAN_CLKSOURCE))
96 #endif /* FDCAN1 || FDCAN2 */
97
98 #if defined(RCC_CCIPR_TIM1SEL) && defined(RCC_CCIPR_TIM15SEL)
99 #define IS_LL_RCC_TIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_TIM1_CLKSOURCE) \
100 || ((__VALUE__) == LL_RCC_TIM15_CLKSOURCE))
101 #elif defined(RCC_CCIPR_TIM1SEL)
102 #define IS_LL_RCC_TIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_TIM1_CLKSOURCE))
103 #endif /* RCC_CCIPR_TIM1SEL */
104
105
106
107 /**
108 * @}
109 */
110
111 /* Private function prototypes -----------------------------------------------*/
112 /** @defgroup RCC_LL_Private_Functions RCC Private functions
113 * @{
114 */
115 static uint32_t RCC_GetSystemClockFreq(void);
116 static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
117 static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
118 static uint32_t RCC_PLL_GetFreqDomain_SYS(void);
119 static uint32_t RCC_PLL_GetFreqDomain_ADC(void);
120 static uint32_t RCC_PLL_GetFreqDomain_I2S1(void);
121 #if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx)
122 static uint32_t RCC_PLL_GetFreqDomain_I2S2(void);
123 static uint32_t RCC_PLL_GetFreqDomain_USB(void);
124 #endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */
125 #if defined(FDCAN1) || defined(FDCAN2)
126 static uint32_t RCC_PLL_GetFreqDomain_FDCAN(void);
127 #endif /* FDCAN1 || FDCAN2 */
128 #if defined(RNG)
129 static uint32_t RCC_PLL_GetFreqDomain_RNG(void);
130 #endif /* RNG */
131 #if defined(RCC_PLLQ_SUPPORT) && defined(RCC_CCIPR_TIM1SEL)
132 static uint32_t RCC_PLL_GetFreqDomain_TIM1(void);
133 #endif /* RCC_PLLQ_SUPPORT && RCC_CCIPR_TIM1SEL */
134 #if defined(RCC_CCIPR_TIM15SEL)
135 static uint32_t RCC_PLL_GetFreqDomain_TIM15(void);
136 #endif /* RCC_CCIPR_TIM15SEL */
137 /**
138 * @}
139 */
140
141
142 /* Exported functions --------------------------------------------------------*/
143 /** @addtogroup RCC_LL_Exported_Functions
144 * @{
145 */
146
147 /** @addtogroup RCC_LL_EF_Init
148 * @{
149 */
150
151 /**
152 * @brief Reset the RCC clock configuration to the default reset state.
153 * @note The default reset state of the clock configuration is given below:
154 * - HSI ON and used as system clock source
155 * - HSE and PLL OFF
156 * - AHB and APB1 prescaler set to 1.
157 * - CSS, MCO OFF
158 * - All interrupts disabled
159 * @note This function does not modify the configuration of the
160 * - Peripheral clocks
161 * - LSI, LSE and RTC clocks
162 * @retval An ErrorStatus enumeration value:
163 * - SUCCESS: RCC registers are de-initialized
164 * - ERROR: not applicable
165 */
LL_RCC_DeInit(void)166 ErrorStatus LL_RCC_DeInit(void)
167 {
168 /* Set HSION bit and wait for HSI READY bit */
169 LL_RCC_HSI_Enable();
170 while (LL_RCC_HSI_IsReady() != 1U)
171 {}
172
173 /* Set HSITRIM bits to reset value*/
174 LL_RCC_HSI_SetCalibTrimming(0x40U);
175
176 /* Reset CFGR register */
177 LL_RCC_WriteReg(CFGR, 0x00000000U);
178
179 /* Reset whole CR register but HSI in 2 steps in case HSEBYP is set */
180 LL_RCC_WriteReg(CR, RCC_CR_HSION);
181 while (LL_RCC_HSE_IsReady() != 0U)
182 {}
183 LL_RCC_WriteReg(CR, RCC_CR_HSION);
184
185 /* Wait for PLL READY bit to be reset */
186 while (LL_RCC_PLL_IsReady() != 0U)
187 {}
188
189 /* Reset PLLCFGR register */
190 LL_RCC_WriteReg(PLLCFGR, 16U << RCC_PLLCFGR_PLLN_Pos);
191
192 /* Disable all interrupts */
193 LL_RCC_WriteReg(CIER, 0x00000000U);
194
195 /* Clear all interrupts flags */
196 LL_RCC_WriteReg(CICR, 0xFFFFFFFFU);
197
198 return SUCCESS;
199 }
200
201 /**
202 * @}
203 */
204
205 /** @addtogroup RCC_LL_EF_Get_Freq
206 * @brief Return the frequencies of different on chip clocks; System, AHB and APB1 buses clocks
207 * and different peripheral clocks available on the device.
208 * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE divided by HSI division factor(**)
209 * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(***)
210 * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(***)
211 * or HSI_VALUE(**) multiplied/divided by the PLL factors.
212 * @note (**) HSI_VALUE is a constant defined in this file (default value
213 * 16 MHz) but the real value may vary depending on the variations
214 * in voltage and temperature.
215 * @note (***) HSE_VALUE is a constant defined in this file (default value
216 * 8 MHz), user has to ensure that HSE_VALUE is same as the real
217 * frequency of the crystal used. Otherwise, this function may
218 * have wrong result.
219 * @note The result of this function could be incorrect when using fractional
220 * value for HSE crystal.
221 * @note This function can be used by the user application to compute the
222 * baud-rate for the communication peripherals or configure other parameters.
223 * @{
224 */
225
226 /**
227 * @brief Return the frequencies of different on chip clocks; System, AHB and APB1 buses clocks
228 * @note Each time SYSCLK, HCLK and/or PCLK1 clock changes, this function
229 * must be called to update structure fields. Otherwise, any
230 * configuration based on this function will be incorrect.
231 * @param RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
232 * @retval None
233 */
LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef * RCC_Clocks)234 void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks)
235 {
236 /* Get SYSCLK frequency */
237 RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
238
239 /* HCLK clock frequency */
240 RCC_Clocks->HCLK_Frequency = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
241
242 /* PCLK1 clock frequency */
243 RCC_Clocks->PCLK1_Frequency = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
244 }
245
246 /**
247 * @brief Return USARTx clock frequency
248 * @param USARTxSource This parameter can be one of the following values:
249 * @arg @ref LL_RCC_USART1_CLKSOURCE
250 * @arg @ref LL_RCC_USART2_CLKSOURCE
251 * @arg @ref LL_RCC_USART3_CLKSOURCE
252 * @retval USART clock frequency (in Hz)
253 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
254 */
LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)255 uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)
256 {
257 uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
258
259 /* Check parameter */
260 assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource));
261
262 if (USARTxSource == LL_RCC_USART1_CLKSOURCE)
263 {
264 /* USART1CLK clock frequency */
265 switch (LL_RCC_GetUSARTClockSource(USARTxSource))
266 {
267 case LL_RCC_USART1_CLKSOURCE_SYSCLK: /* USART1 Clock is System Clock */
268 usart_frequency = RCC_GetSystemClockFreq();
269 break;
270
271 case LL_RCC_USART1_CLKSOURCE_HSI: /* USART1 Clock is HSI Osc. */
272 if (LL_RCC_HSI_IsReady() == 1U)
273 {
274 usart_frequency = HSI_VALUE;
275 }
276 break;
277
278 case LL_RCC_USART1_CLKSOURCE_LSE: /* USART1 Clock is LSE Osc. */
279 if (LL_RCC_LSE_IsReady() == 1U)
280 {
281 usart_frequency = LSE_VALUE;
282 }
283 break;
284
285 case LL_RCC_USART1_CLKSOURCE_PCLK1: /* USART1 Clock is PCLK1 */
286 default:
287 usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
288 break;
289 }
290 }
291 #if defined(RCC_CCIPR_USART2SEL)
292 else if (USARTxSource == LL_RCC_USART2_CLKSOURCE)
293 {
294 /* USART2CLK clock frequency */
295 switch (LL_RCC_GetUSARTClockSource(USARTxSource))
296 {
297 case LL_RCC_USART2_CLKSOURCE_SYSCLK: /* USART2 Clock is System Clock */
298 usart_frequency = RCC_GetSystemClockFreq();
299 break;
300
301 case LL_RCC_USART2_CLKSOURCE_HSI: /* USART2 Clock is HSI Osc. */
302 if (LL_RCC_HSI_IsReady() == 1U)
303 {
304 usart_frequency = HSI_VALUE;
305 }
306 break;
307
308 case LL_RCC_USART2_CLKSOURCE_LSE: /* USART2 Clock is LSE Osc. */
309 if (LL_RCC_LSE_IsReady() == 1U)
310 {
311 usart_frequency = LSE_VALUE;
312 }
313 break;
314
315 case LL_RCC_USART2_CLKSOURCE_PCLK1: /* USART2 Clock is PCLK1 */
316 default:
317 usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
318 break;
319 }
320 }
321 #endif /* RCC_CCIPR_USART2SEL */
322 #if defined(RCC_CCIPR_USART3SEL)
323 else if (USARTxSource == LL_RCC_USART3_CLKSOURCE)
324 {
325 /* USART3CLK clock frequency */
326 switch (LL_RCC_GetUSARTClockSource(USARTxSource))
327 {
328 case LL_RCC_USART3_CLKSOURCE_SYSCLK: /* USART3 Clock is System Clock */
329 usart_frequency = RCC_GetSystemClockFreq();
330 break;
331
332 case LL_RCC_USART3_CLKSOURCE_HSI: /* USART3 Clock is HSI Osc. */
333 if (LL_RCC_HSI_IsReady() == 1U)
334 {
335 usart_frequency = HSI_VALUE;
336 }
337 break;
338
339 case LL_RCC_USART3_CLKSOURCE_LSE: /* USART3 Clock is LSE Osc. */
340 if (LL_RCC_LSE_IsReady() == 1U)
341 {
342 usart_frequency = LSE_VALUE;
343 }
344 break;
345
346 case LL_RCC_USART3_CLKSOURCE_PCLK1: /* USART3 Clock is PCLK1 */
347 default:
348 usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
349 break;
350 }
351 }
352 #endif /* RCC_CCIPR_USART3SEL */
353 else
354 {
355 /* nothing to do */
356 }
357 return usart_frequency;
358 }
359
360 /**
361 * @brief Return I2Cx clock frequency
362 * @param I2CxSource This parameter can be one of the following values:
363 * @arg @ref LL_RCC_I2C1_CLKSOURCE
364 * @retval I2C clock frequency (in Hz)
365 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that HSI oscillator is not ready
366 */
LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)367 uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)
368 {
369 uint32_t i2c_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
370
371 /* Check parameter */
372 assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource));
373
374 if (I2CxSource == LL_RCC_I2C1_CLKSOURCE)
375 {
376 /* I2C1 CLK clock frequency */
377 switch (LL_RCC_GetI2CClockSource(I2CxSource))
378 {
379 case LL_RCC_I2C1_CLKSOURCE_SYSCLK: /* I2C1 Clock is System Clock */
380 i2c_frequency = RCC_GetSystemClockFreq();
381 break;
382
383 case LL_RCC_I2C1_CLKSOURCE_HSI: /* I2C1 Clock is HSI Osc. */
384 if (LL_RCC_HSI_IsReady() == 1U)
385 {
386 i2c_frequency = HSI_VALUE;
387 }
388 break;
389
390 case LL_RCC_I2C1_CLKSOURCE_PCLK1: /* I2C1 Clock is PCLK1 */
391 default:
392 i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
393 break;
394 }
395 }
396 #if defined(RCC_CCIPR_I2C2SEL)
397 else if (I2CxSource == LL_RCC_I2C2_CLKSOURCE)
398 {
399 /* I2C2 CLK clock frequency */
400 switch (LL_RCC_GetI2CClockSource(I2CxSource))
401 {
402 case LL_RCC_I2C2_CLKSOURCE_SYSCLK: /* I2C2 Clock is System Clock */
403 i2c_frequency = RCC_GetSystemClockFreq();
404 break;
405
406 case LL_RCC_I2C2_CLKSOURCE_HSI: /* I2C2 Clock is HSI Osc. */
407 if (LL_RCC_HSI_IsReady() == 1U)
408 {
409 i2c_frequency = HSI_VALUE;
410 }
411 break;
412
413 case LL_RCC_I2C2_CLKSOURCE_PCLK1: /* I2C2 Clock is PCLK1 */
414 default:
415 i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
416 break;
417 }
418 }
419 #endif /* RCC_CCIPR_I2C2SEL */
420 else
421 {
422 /* nothing to do */
423 }
424
425 return i2c_frequency;
426 }
427
428 /**
429 * @brief Return I2Sx clock frequency
430 * @param I2SxSource This parameter can be one of the following values:
431 * @arg @ref LL_RCC_I2S1_CLKSOURCE
432 * @retval I2S clock frequency (in Hz)
433 * @arg @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
434 */
LL_RCC_GetI2SClockFreq(uint32_t I2SxSource)435 uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource)
436 {
437 uint32_t i2s_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
438
439 /* Check parameter */
440 assert_param(IS_LL_RCC_I2S_CLKSOURCE(I2SxSource));
441
442 if (I2SxSource == LL_RCC_I2S1_CLKSOURCE)
443 {
444 /* I2S1 CLK clock frequency */
445 switch (LL_RCC_GetI2SClockSource(I2SxSource))
446 {
447 case LL_RCC_I2S1_CLKSOURCE_HSI: /* I2S1 Clock is HSI */
448 i2s_frequency = HSI_VALUE;
449 break;
450
451 case LL_RCC_I2S1_CLKSOURCE_PLL: /* I2S1 Clock is PLL"P" */
452 if (LL_RCC_PLL_IsReady() == 1U)
453 {
454 if (LL_RCC_PLL_IsEnabledDomain_I2S1() == 1U)
455 {
456 i2s_frequency = RCC_PLL_GetFreqDomain_I2S1();
457 }
458 }
459 break;
460
461
462 case LL_RCC_I2S1_CLKSOURCE_PIN: /* I2S1 Clock is External clock */
463 i2s_frequency = EXTERNAL_CLOCK_VALUE;
464 break;
465
466 case LL_RCC_I2S1_CLKSOURCE_SYSCLK: /* I2S1 Clock is System Clock */
467 default:
468 i2s_frequency = RCC_GetSystemClockFreq();
469 break;
470 }
471 }
472 #if defined(RCC_CCIPR2_I2S2SEL)
473 else if (I2SxSource == LL_RCC_I2S2_CLKSOURCE)
474 {
475 /* I2S2 CLK clock frequency */
476 switch (LL_RCC_GetI2SClockSource(I2SxSource))
477 {
478 case LL_RCC_I2S2_CLKSOURCE_HSI: /* I2S2 Clock is HSI */
479 i2s_frequency = HSI_VALUE;
480 break;
481
482 case LL_RCC_I2S2_CLKSOURCE_PLL: /* I2S2 Clock is PLL"P" */
483 if (LL_RCC_PLL_IsReady() == 1U)
484 {
485 if (LL_RCC_PLL_IsEnabledDomain_I2S2() == 1U)
486 {
487 i2s_frequency = RCC_PLL_GetFreqDomain_I2S2();
488 }
489 }
490 break;
491
492 case LL_RCC_I2S2_CLKSOURCE_PIN: /* I2S2 Clock is External clock */
493 i2s_frequency = EXTERNAL_CLOCK_VALUE;
494 break;
495
496 case LL_RCC_I2S2_CLKSOURCE_SYSCLK: /* I2S2 Clock is System Clock */
497 default:
498 i2s_frequency = RCC_GetSystemClockFreq();
499 break;
500 }
501 }
502 #endif /* RCC_CCIPR2_I2S2SEL */
503 else
504 {
505 }
506 return i2s_frequency;
507 }
508
509 #if defined(LPUART1) || defined(LPUART2)
510 /**
511 * @brief Return LPUARTx clock frequency
512 * @param LPUARTxSource This parameter can be one of the following values:
513 * @arg @ref LL_RCC_LPUART1_CLKSOURCE
514 * @arg @ref LL_RCC_LPUART2_CLKSOURCE (*)
515 * @retval LPUART clock frequency (in Hz)
516 * @arg @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
517 * (*) feature not available on all devices
518 */
LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource)519 uint32_t LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource)
520 {
521 uint32_t lpuart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
522
523 /* Check parameter */
524 assert_param(IS_LL_RCC_LPUART_CLKSOURCE(LPUARTxSource));
525
526 if (LPUARTxSource == LL_RCC_LPUART1_CLKSOURCE)
527 {
528 /* LPUART1CLK clock frequency */
529 switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource))
530 {
531 case LL_RCC_LPUART1_CLKSOURCE_SYSCLK: /* LPUART1 Clock is System Clock */
532 lpuart_frequency = RCC_GetSystemClockFreq();
533 break;
534
535 case LL_RCC_LPUART1_CLKSOURCE_HSI: /* LPUART1 Clock is HSI Osc. */
536 if (LL_RCC_HSI_IsReady() == 1U)
537 {
538 lpuart_frequency = HSI_VALUE;
539 }
540 break;
541
542 case LL_RCC_LPUART1_CLKSOURCE_LSE: /* LPUART1 Clock is LSE Osc. */
543 if (LL_RCC_LSE_IsReady() == 1U)
544 {
545 lpuart_frequency = LSE_VALUE;
546 }
547 break;
548
549 case LL_RCC_LPUART1_CLKSOURCE_PCLK1: /* LPUART1 Clock is PCLK1 */
550 default:
551 lpuart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
552 break;
553 }
554 }
555 #if defined(LPUART2)
556 else if (LPUARTxSource == LL_RCC_LPUART2_CLKSOURCE)
557 {
558 /* LPUART2CLK clock frequency */
559 switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource))
560 {
561 case LL_RCC_LPUART2_CLKSOURCE_SYSCLK: /* LPUART2 Clock is System Clock */
562 lpuart_frequency = RCC_GetSystemClockFreq();
563 break;
564
565 case LL_RCC_LPUART2_CLKSOURCE_HSI: /* LPUART2 Clock is HSI Osc. */
566 if (LL_RCC_HSI_IsReady() == 1U)
567 {
568 lpuart_frequency = HSI_VALUE;
569 }
570 break;
571
572 case LL_RCC_LPUART2_CLKSOURCE_LSE: /* LPUART2 Clock is LSE Osc. */
573 if (LL_RCC_LSE_IsReady() == 1U)
574 {
575 lpuart_frequency = LSE_VALUE;
576 }
577 break;
578
579 case LL_RCC_LPUART2_CLKSOURCE_PCLK1: /* LPUART2 Clock is PCLK1 */
580 default:
581 lpuart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
582 break;
583 }
584 }
585 #endif /* LPUART2 */
586 else
587 {
588 /*nothing to do*/
589 }
590
591 return lpuart_frequency;
592 }
593 #endif /* LPUART1 */
594
595 #if defined(LPTIM1) && defined(LPTIM2)
596 /**
597 * @brief Return LPTIMx clock frequency
598 * @param LPTIMxSource This parameter can be one of the following values:
599 * @arg @ref LL_RCC_LPTIM1_CLKSOURCE
600 * @arg @ref LL_RCC_LPTIM2_CLKSOURCE
601 * @retval LPTIM clock frequency (in Hz)
602 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready
603 */
LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)604 uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
605 {
606 uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
607
608 /* Check parameter */
609 assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
610
611 if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE)
612 {
613 /* LPTIM1CLK clock frequency */
614 switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
615 {
616 case LL_RCC_LPTIM1_CLKSOURCE_LSI: /* LPTIM1 Clock is LSI Osc. */
617 if (LL_RCC_LSI_IsReady() == 1U)
618 {
619 lptim_frequency = LSI_VALUE;
620 }
621 break;
622
623 case LL_RCC_LPTIM1_CLKSOURCE_HSI: /* LPTIM1 Clock is HSI Osc. */
624 if (LL_RCC_HSI_IsReady() == 1U)
625 {
626 lptim_frequency = HSI_VALUE;
627 }
628 break;
629
630 case LL_RCC_LPTIM1_CLKSOURCE_LSE: /* LPTIM1 Clock is LSE Osc. */
631 if (LL_RCC_LSE_IsReady() == 1U)
632 {
633 lptim_frequency = LSE_VALUE;
634 }
635 break;
636
637 case LL_RCC_LPTIM1_CLKSOURCE_PCLK1: /* LPTIM1 Clock is PCLK1 */
638 default:
639 lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
640 break;
641 }
642 }
643 else
644 {
645 /* LPTIM2CLK clock frequency */
646 switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
647 {
648 case LL_RCC_LPTIM2_CLKSOURCE_LSI: /* LPTIM2 Clock is LSI Osc. */
649 if (LL_RCC_LSI_IsReady() == 1U)
650 {
651 lptim_frequency = LSI_VALUE;
652 }
653 break;
654
655 case LL_RCC_LPTIM2_CLKSOURCE_HSI: /* LPTIM2 Clock is HSI Osc. */
656 if (LL_RCC_HSI_IsReady() == 1U)
657 {
658 lptim_frequency = HSI_VALUE;
659 }
660 break;
661
662 case LL_RCC_LPTIM2_CLKSOURCE_LSE: /* LPTIM2 Clock is LSE Osc. */
663 if (LL_RCC_LSE_IsReady() == 1U)
664 {
665 lptim_frequency = LSE_VALUE;
666 }
667 break;
668
669 case LL_RCC_LPTIM2_CLKSOURCE_PCLK1: /* LPTIM2 Clock is PCLK1 */
670 default:
671 lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
672 break;
673 }
674 }
675
676 return lptim_frequency;
677 }
678 #endif /* LPTIM1 && LPTIM2 */
679
680 #if defined(RCC_CCIPR_TIM1SEL) || defined(RCC_CCIPR_TIM15SEL)
681 /**
682 * @brief Return TIMx clock frequency
683 * @param TIMxSource This parameter can be one of the following values:
684 * @arg @ref LL_RCC_TIM1_CLKSOURCE
685 * @if defined(STM32G081xx)
686 * @arg @ref LL_RCC_TIM15_CLKSOURCE
687 * @endif
688 * @retval TIMx clock frequency (in Hz)
689 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
690 */
LL_RCC_GetTIMClockFreq(uint32_t TIMxSource)691 uint32_t LL_RCC_GetTIMClockFreq(uint32_t TIMxSource)
692 {
693 uint32_t tim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
694
695 /* Check parameter */
696 assert_param(IS_LL_RCC_TIM_CLKSOURCE(TIMxSource));
697
698 if (TIMxSource == LL_RCC_TIM1_CLKSOURCE)
699 {
700 /* TIM1CLK clock frequency */
701 switch (LL_RCC_GetTIMClockSource(TIMxSource))
702 {
703 case LL_RCC_TIM1_CLKSOURCE_PLL: /* TIM1 Clock is PLLQ */
704 if (LL_RCC_PLL_IsReady() == 1U)
705 {
706 if (LL_RCC_PLL_IsEnabledDomain_TIM1() == 1U)
707 {
708 tim_frequency = RCC_PLL_GetFreqDomain_TIM1();
709 }
710 }
711 break;
712
713 case LL_RCC_TIM1_CLKSOURCE_PCLK1: /* TIM1 Clock is PCLK1 */
714 default:
715 tim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
716 break;
717 }
718 }
719 #if defined(TIM15)
720 else
721 {
722 if (TIMxSource == LL_RCC_TIM15_CLKSOURCE)
723 {
724 /* TIM15CLK clock frequency */
725 switch (LL_RCC_GetTIMClockSource(TIMxSource))
726 {
727 case LL_RCC_TIM15_CLKSOURCE_PLL: /* TIM1 Clock is PLLQ */
728 if (LL_RCC_PLL_IsReady() == 1U)
729 {
730 if (LL_RCC_PLL_IsEnabledDomain_TIM15() == 1U)
731 {
732 tim_frequency = RCC_PLL_GetFreqDomain_TIM15();
733 }
734 }
735 break;
736
737 case LL_RCC_TIM15_CLKSOURCE_PCLK1: /* TIM15 Clock is PCLK1 */
738 default:
739 tim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
740 break;
741 }
742 }
743 }
744 #endif /* TIM15 */
745 return tim_frequency;
746 }
747 #endif /* RCC_CCIPR_TIM1SEL && RCC_CCIPR_TIM15SEL */
748
749
750 #if defined(RNG)
751 /**
752 * @brief Return RNGx clock frequency
753 * @param RNGxSource This parameter can be one of the following values:
754 * @arg @ref LL_RCC_RNG_CLKSOURCE
755 * @retval RNG clock frequency (in Hz)
756 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI) or PLL is not ready
757 * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
758 */
LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)759 uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
760 {
761 uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
762 uint32_t rngdiv;
763
764 /* Check parameter */
765 assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource));
766
767 /* RNGCLK clock frequency */
768 switch (LL_RCC_GetRNGClockSource(RNGxSource))
769 {
770 case LL_RCC_RNG_CLKSOURCE_PLL: /* PLL clock used as RNG clock source */
771 if (LL_RCC_PLL_IsReady() == 1U)
772 {
773 if (LL_RCC_PLL_IsEnabledDomain_RNG() == 1U)
774 {
775 rng_frequency = RCC_PLL_GetFreqDomain_RNG();
776 rngdiv = (1UL << ((READ_BIT(RCC->CCIPR, RCC_CCIPR_RNGDIV)) >> RCC_CCIPR_RNGDIV_Pos));
777 rng_frequency = (rng_frequency / rngdiv);
778 }
779 }
780 break;
781
782 case LL_RCC_RNG_CLKSOURCE_HSI_DIV8: /* HSI clock divided by 8 used as RNG clock source */
783 rng_frequency = HSI_VALUE / 8U;
784 rngdiv = (1UL << ((READ_BIT(RCC->CCIPR, RCC_CCIPR_RNGDIV)) >> RCC_CCIPR_RNGDIV_Pos));
785 rng_frequency = (rng_frequency / rngdiv);
786 break;
787 case LL_RCC_RNG_CLKSOURCE_SYSCLK: /* SYSCLK clock used as RNG clock source */
788 rng_frequency = RCC_GetSystemClockFreq();
789 rngdiv = (1UL << ((READ_BIT(RCC->CCIPR, RCC_CCIPR_RNGDIV)) >> RCC_CCIPR_RNGDIV_Pos));
790 rng_frequency = (rng_frequency / rngdiv);
791 break;
792
793 case LL_RCC_RNG_CLKSOURCE_NONE: /* No clock used as RNG clock source */
794 default:
795 rng_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
796 break;
797
798 }
799
800 return rng_frequency;
801 }
802 #endif /* RNG */
803
804 #if defined(CEC)
805 /**
806 * @brief Return CEC clock frequency
807 * @param CECxSource This parameter can be one of the following values:
808 * @arg @ref LL_RCC_CEC_CLKSOURCE
809 * @retval CEC clock frequency (in Hz)
810 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
811 */
LL_RCC_GetCECClockFreq(uint32_t CECxSource)812 uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource)
813 {
814 uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
815
816 /* Check parameter */
817 assert_param(IS_LL_RCC_CEC_CLKSOURCE(CECxSource));
818
819 /* CECCLK clock frequency */
820 switch (LL_RCC_GetCECClockSource(CECxSource))
821 {
822 case LL_RCC_CEC_CLKSOURCE_LSE: /* CEC Clock is LSE Osc. */
823 if (LL_RCC_LSE_IsReady() == 1U)
824 {
825 cec_frequency = LSE_VALUE;
826 }
827 break;
828
829 case LL_RCC_CEC_CLKSOURCE_HSI_DIV488: /* CEC Clock is HSI Osc. */
830 default:
831 if (LL_RCC_HSI_IsReady() == 1U)
832 {
833 cec_frequency = (HSI_VALUE / 488U);
834 }
835 break;
836 }
837
838 return cec_frequency;
839 }
840 #endif /* CEC */
841
842 #if defined(FDCAN1) || defined(FDCAN2)
843 /**
844 * @brief Return FDCANx clock frequency
845 * @param FDCANxSource This parameter can be one of the following values:
846 * @arg @ref LL_RCC_FDCAN_CLKSOURCE
847 * @retval FDCANx clock frequency (in Hz)
848 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready
849 */
LL_RCC_GetFDCANClockFreq(uint32_t FDCANxSource)850 uint32_t LL_RCC_GetFDCANClockFreq(uint32_t FDCANxSource)
851 {
852 uint32_t fdcan_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
853
854 /* Check parameter */
855 assert_param(IS_LL_RCC_FDCAN_CLKSOURCE(FDCANxSource));
856
857 /* FDCANCLK clock frequency */
858 switch (LL_RCC_GetFDCANClockSource(FDCANxSource))
859 {
860 case LL_RCC_FDCAN_CLKSOURCE_PLL: /* FDCAN Clock is PLL "Q" Osc. */
861 if (LL_RCC_PLL_IsReady() == 1U)
862 {
863 if (LL_RCC_PLL_IsEnabledDomain_FDCAN() == 1U)
864 {
865 fdcan_frequency = RCC_PLL_GetFreqDomain_FDCAN();
866 }
867 }
868 break;
869
870 case LL_RCC_FDCAN_CLKSOURCE_HSE: /* FDCAN Clock is HSE Osc. */
871 if (LL_RCC_HSE_IsReady() == 1U)
872 {
873 fdcan_frequency = HSE_VALUE;
874 }
875 break;
876
877 case LL_RCC_FDCAN_CLKSOURCE_PCLK1: /* FDCAN Clock is PCLK1 */
878 default:
879 fdcan_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
880 break;
881 }
882
883 return fdcan_frequency;
884 }
885 #endif /* FDCAN1 || FDCAN2 */
886
887 /**
888 * @brief Return ADCx clock frequency
889 * @param ADCxSource This parameter can be one of the following values:
890 * @arg @ref LL_RCC_ADC_CLKSOURCE
891 * @retval ADC clock frequency (in Hz)
892 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI) or PLL is not ready
893 * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
894 */
LL_RCC_GetADCClockFreq(uint32_t ADCxSource)895 uint32_t LL_RCC_GetADCClockFreq(uint32_t ADCxSource)
896 {
897 uint32_t adc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
898
899 /* Check parameter */
900 assert_param(IS_LL_RCC_ADC_CLKSOURCE(ADCxSource));
901
902 /* ADCCLK clock frequency */
903 switch (LL_RCC_GetADCClockSource(ADCxSource))
904 {
905 case LL_RCC_ADC_CLKSOURCE_SYSCLK: /* SYSCLK clock used as ADC clock source */
906 adc_frequency = RCC_GetSystemClockFreq();
907 break;
908 case LL_RCC_ADC_CLKSOURCE_HSI : /* HSI clock used as ADC clock source */
909 adc_frequency = HSI_VALUE;
910 break;
911
912 case LL_RCC_ADC_CLKSOURCE_PLL: /* PLLP clock used as ADC clock source */
913 if (LL_RCC_PLL_IsReady() == 1U)
914 {
915 if (LL_RCC_PLL_IsEnabledDomain_ADC() == 1U)
916 {
917 adc_frequency = RCC_PLL_GetFreqDomain_ADC();
918 }
919 }
920 break;
921 default:
922 adc_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
923 break;
924 }
925
926 return adc_frequency;
927 }
928
929 /**
930 * @brief Return RTC clock frequency
931 * @retval RTC clock frequency (in Hz)
932 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillators (LSI, LSE or HSE) are not ready
933 * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
934 */
LL_RCC_GetRTCClockFreq(void)935 uint32_t LL_RCC_GetRTCClockFreq(void)
936 {
937 uint32_t rtc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
938
939 /* RTCCLK clock frequency */
940 switch (LL_RCC_GetRTCClockSource())
941 {
942 case LL_RCC_RTC_CLKSOURCE_LSE: /* LSE clock used as RTC clock source */
943 if (LL_RCC_LSE_IsReady() == 1U)
944 {
945 rtc_frequency = LSE_VALUE;
946 }
947 break;
948
949 case LL_RCC_RTC_CLKSOURCE_LSI: /* LSI clock used as RTC clock source */
950 if (LL_RCC_LSI_IsReady() == 1U)
951 {
952 rtc_frequency = LSI_VALUE;
953 }
954 break;
955
956 case LL_RCC_RTC_CLKSOURCE_HSE_DIV32: /* HSE clock used as ADC clock source */
957 rtc_frequency = HSE_VALUE / 32U;
958 break;
959
960 case LL_RCC_RTC_CLKSOURCE_NONE: /* No clock used as RTC clock source */
961 default:
962 rtc_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
963 break;
964 }
965
966 return rtc_frequency;
967 }
968
969 #if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx)
970 /**
971 * @brief Return USBx clock frequency
972 * @param USBxSource This parameter can be one of the following values:
973 * @arg @ref LL_RCC_USB_CLKSOURCE
974 * @retval USB clock frequency (in Hz)
975 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI48) or PLL is not ready
976 * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
977 */
LL_RCC_GetUSBClockFreq(uint32_t USBxSource)978 uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
979 {
980 uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
981
982 /* Check parameter */
983 assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource));
984
985 /* USBCLK clock frequency */
986 switch (LL_RCC_GetUSBClockSource(USBxSource))
987 {
988 #if defined(RCC_HSI48_SUPPORT)
989 case LL_RCC_USB_CLKSOURCE_HSI48: /* HSI48 used as USB clock source */
990 if (LL_RCC_HSI48_IsReady() != 0U)
991 {
992 usb_frequency = HSI48_VALUE;
993 }
994 break;
995 #endif /* RCC_HSI48_SUPPORT */
996
997 case LL_RCC_USB_CLKSOURCE_HSE: /* HSE used as USB clock source */
998 if (LL_RCC_HSE_IsReady() != 0U)
999 {
1000 usb_frequency = HSE_VALUE;
1001 }
1002 break;
1003
1004 case LL_RCC_USB_CLKSOURCE_PLL: /* PLL clock used as USB clock source */
1005 if (LL_RCC_PLL_IsReady() != 0U)
1006 {
1007 if (LL_RCC_PLL_IsEnabledDomain_USB() != 0U)
1008 {
1009 usb_frequency = RCC_PLL_GetFreqDomain_USB();
1010 }
1011 }
1012 break;
1013
1014 default:
1015 usb_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
1016 break;
1017 }
1018
1019 return usb_frequency;
1020 }
1021 #endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx) */
1022
1023 /**
1024 * @}
1025 */
1026
1027 /**
1028 * @}
1029 */
1030
1031 /** @addtogroup RCC_LL_Private_Functions
1032 * @{
1033 */
1034
1035 /**
1036 * @brief Return SYSTEM clock frequency
1037 * @retval SYSTEM clock frequency (in Hz)
1038 */
RCC_GetSystemClockFreq(void)1039 static uint32_t RCC_GetSystemClockFreq(void)
1040 {
1041 uint32_t frequency;
1042 uint32_t hsidiv;
1043
1044 /* Get SYSCLK source -------------------------------------------------------*/
1045 switch (LL_RCC_GetSysClkSource())
1046 {
1047 case LL_RCC_SYS_CLKSOURCE_STATUS_HSE: /* HSE used as system clock source */
1048 frequency = HSE_VALUE;
1049 break;
1050
1051 case LL_RCC_SYS_CLKSOURCE_STATUS_PLL: /* PLL used as system clock source */
1052 frequency = RCC_PLL_GetFreqDomain_SYS();
1053 break;
1054
1055 case LL_RCC_SYS_CLKSOURCE_STATUS_HSI: /* HSI used as system clock source */
1056 default:
1057 hsidiv = (1UL << ((READ_BIT(RCC->CR, RCC_CR_HSIDIV)) >> RCC_CR_HSIDIV_Pos));
1058 frequency = (HSI_VALUE / hsidiv);
1059 break;
1060 }
1061
1062 return frequency;
1063 }
1064
1065 /**
1066 * @brief Return HCLK clock frequency
1067 * @param SYSCLK_Frequency SYSCLK clock frequency
1068 * @retval HCLK clock frequency (in Hz)
1069 */
RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)1070 static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
1071 {
1072 /* HCLK clock frequency */
1073 return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
1074 }
1075
1076 /**
1077 * @brief Return PCLK1 clock frequency
1078 * @param HCLK_Frequency HCLK clock frequency
1079 * @retval PCLK1 clock frequency (in Hz)
1080 */
RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)1081 static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
1082 {
1083 /* PCLK1 clock frequency */
1084 return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
1085 }
1086 /**
1087 * @brief Return PLL clock frequency used for system domain
1088 * @retval PLL clock frequency (in Hz)
1089 */
RCC_PLL_GetFreqDomain_SYS(void)1090 static uint32_t RCC_PLL_GetFreqDomain_SYS(void)
1091 {
1092 uint32_t pllinputfreq;
1093 uint32_t pllsource;
1094
1095 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
1096 SYSCLK = PLL_VCO / PLLR
1097 */
1098 pllsource = LL_RCC_PLL_GetMainSource();
1099
1100 switch (pllsource)
1101 {
1102 case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
1103 pllinputfreq = HSI_VALUE;
1104 break;
1105
1106 case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
1107 pllinputfreq = HSE_VALUE;
1108 break;
1109
1110 default:
1111 pllinputfreq = HSI_VALUE;
1112 break;
1113 }
1114 return __LL_RCC_CALC_PLLCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1115 LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
1116 }
1117 /**
1118 * @brief Return PLL clock frequency used for ADC domain
1119 * @retval PLL clock frequency (in Hz)
1120 */
RCC_PLL_GetFreqDomain_ADC(void)1121 static uint32_t RCC_PLL_GetFreqDomain_ADC(void)
1122 {
1123 uint32_t pllinputfreq;
1124 uint32_t pllsource;
1125
1126 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
1127 ADC Domain clock = PLL_VCO / PLLP
1128 */
1129 pllsource = LL_RCC_PLL_GetMainSource();
1130
1131 switch (pllsource)
1132 {
1133 case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
1134 pllinputfreq = HSE_VALUE;
1135 break;
1136
1137 case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
1138 default:
1139 pllinputfreq = HSI_VALUE;
1140 break;
1141 }
1142 return __LL_RCC_CALC_PLLCLK_ADC_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1143 LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP());
1144 }
1145
1146 #if defined(FDCAN1) || defined(FDCAN2)
1147 /**
1148 * @brief Return PLL clock frequency used for FDCAN domain
1149 * @retval PLL clock frequency (in Hz)
1150 */
RCC_PLL_GetFreqDomain_FDCAN(void)1151 static uint32_t RCC_PLL_GetFreqDomain_FDCAN(void)
1152 {
1153 uint32_t pllinputfreq;
1154 uint32_t pllsource;
1155
1156 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN
1157
1158 FDCAN Domain clock = PLL_VCO / PLLQ
1159 */
1160 pllsource = LL_RCC_PLL_GetMainSource();
1161
1162 switch (pllsource)
1163 {
1164 case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
1165 pllinputfreq = HSE_VALUE;
1166 break;
1167
1168 case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
1169 default:
1170 pllinputfreq = HSI_VALUE;
1171 break;
1172 }
1173 return __LL_RCC_CALC_PLLCLK_FDCAN_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1174 LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
1175 }
1176 #endif /* FDCAN1 || FDCAN2 */
1177
1178 /**
1179 * @brief Return PLL clock frequency used for I2S1 domain
1180 * @retval PLL clock frequency (in Hz)
1181 */
RCC_PLL_GetFreqDomain_I2S1(void)1182 static uint32_t RCC_PLL_GetFreqDomain_I2S1(void)
1183 {
1184 uint32_t pllinputfreq;
1185 uint32_t pllsource;
1186
1187 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
1188 I2S1 Domain clock = PLL_VCO / PLLP
1189 */
1190 pllsource = LL_RCC_PLL_GetMainSource();
1191
1192 switch (pllsource)
1193 {
1194 case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
1195 pllinputfreq = HSE_VALUE;
1196 break;
1197
1198 case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
1199 default:
1200 pllinputfreq = HSI_VALUE;
1201 break;
1202 }
1203 return __LL_RCC_CALC_PLLCLK_I2S1_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1204 LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP());
1205 }
1206
1207 #if defined(RCC_CCIPR2_I2S2SEL)
1208 /**
1209 * @brief Return PLL clock frequency used for I2S2 domain
1210 * @retval PLL clock frequency (in Hz)
1211 */
RCC_PLL_GetFreqDomain_I2S2(void)1212 static uint32_t RCC_PLL_GetFreqDomain_I2S2(void)
1213 {
1214 uint32_t pllinputfreq;
1215 uint32_t pllsource;
1216
1217 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
1218 I2S2 Domain clock = PLL_VCO / PLLP
1219 */
1220 pllsource = LL_RCC_PLL_GetMainSource();
1221
1222 switch (pllsource)
1223 {
1224 case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
1225 pllinputfreq = HSE_VALUE;
1226 break;
1227
1228 case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
1229 default:
1230 pllinputfreq = HSI_VALUE;
1231 break;
1232 }
1233 return __LL_RCC_CALC_PLLCLK_I2S2_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1234 LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP());
1235 }
1236 #endif /* RCC_CCIPR2_I2S2SEL */
1237
1238 #if defined(RNG)
1239 /**
1240 * @brief Return PLL clock frequency used for RNG domain
1241 * @retval PLL clock frequency (in Hz)
1242 */
RCC_PLL_GetFreqDomain_RNG(void)1243 static uint32_t RCC_PLL_GetFreqDomain_RNG(void)
1244 {
1245 uint32_t pllinputfreq;
1246 uint32_t pllsource;
1247
1248 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN
1249
1250 RNG Domain clock = PLL_VCO / PLLQ
1251 */
1252 pllsource = LL_RCC_PLL_GetMainSource();
1253
1254 switch (pllsource)
1255 {
1256 case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
1257 pllinputfreq = HSE_VALUE;
1258 break;
1259
1260 case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
1261 default:
1262 pllinputfreq = HSI_VALUE;
1263 break;
1264 }
1265 return __LL_RCC_CALC_PLLCLK_RNG_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1266 LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
1267 }
1268 #endif /* RNG */
1269
1270 #if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx)
1271 /**
1272 * @brief Return PLL clock frequency used for USB domain
1273 * @retval PLL clock frequency (in Hz)
1274 */
RCC_PLL_GetFreqDomain_USB(void)1275 static uint32_t RCC_PLL_GetFreqDomain_USB(void)
1276 {
1277 uint32_t pllinputfreq;
1278 uint32_t pllsource;
1279
1280 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN
1281
1282 RNG Domain clock = PLL_VCO / PLLQ
1283 */
1284 pllsource = LL_RCC_PLL_GetMainSource();
1285
1286 switch (pllsource)
1287 {
1288 case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
1289 pllinputfreq = HSE_VALUE;
1290 break;
1291
1292 case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
1293 default:
1294 pllinputfreq = HSI_VALUE;
1295 break;
1296 }
1297 return __LL_RCC_CALC_PLLCLK_USB_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1298 LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
1299 }
1300 #endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */
1301
1302 #if defined(RCC_PLLQ_SUPPORT) && defined(RCC_CCIPR_TIM1SEL)
1303 /**
1304 * @brief Return PLL clock frequency used for TIM1 domain
1305 * @retval PLL clock frequency (in Hz)
1306 */
RCC_PLL_GetFreqDomain_TIM1(void)1307 static uint32_t RCC_PLL_GetFreqDomain_TIM1(void)
1308 {
1309 uint32_t pllinputfreq;
1310 uint32_t pllsource;
1311
1312 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN
1313
1314 TIM1 Domain clock = PLL_VCO / PLLQ
1315 */
1316 pllsource = LL_RCC_PLL_GetMainSource();
1317
1318 switch (pllsource)
1319 {
1320 case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
1321 pllinputfreq = HSE_VALUE;
1322 break;
1323
1324 case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
1325 default:
1326 pllinputfreq = HSI_VALUE;
1327 break;
1328 }
1329 return __LL_RCC_CALC_PLLCLK_TIM1_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1330 LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
1331 }
1332 #endif /* RCC_PLLQ_SUPPORT */
1333
1334 #if defined(RCC_CCIPR_TIM15SEL)
1335 /**
1336 * @brief Return PLL clock frequency used for TIM15 domain
1337 * @retval PLL clock frequency (in Hz)
1338 */
RCC_PLL_GetFreqDomain_TIM15(void)1339 static uint32_t RCC_PLL_GetFreqDomain_TIM15(void)
1340 {
1341 uint32_t pllinputfreq;
1342 uint32_t pllsource;
1343
1344 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN
1345
1346 TIM15 Domain clock = PLL_VCO / PLLQ
1347 */
1348 pllsource = LL_RCC_PLL_GetMainSource();
1349
1350 switch (pllsource)
1351 {
1352 case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
1353 pllinputfreq = HSE_VALUE;
1354 break;
1355
1356 case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
1357 default:
1358 pllinputfreq = HSI_VALUE;
1359 break;
1360 }
1361 return __LL_RCC_CALC_PLLCLK_TIM15_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
1362 LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
1363 }
1364 #endif /* RCC_CCIPR_TIM15SEL */
1365 /**
1366 * @}
1367 */
1368
1369 /**
1370 * @}
1371 */
1372
1373 #endif /* RCC */
1374
1375 /**
1376 * @}
1377 */
1378
1379 #endif /* USE_FULL_LL_DRIVER */
1380
1381