STM32H735xx HAL User Manual
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32h7xx_ll_rcc.c 00004 * @author MCD Application Team 00005 * @brief RCC LL module driver. 00006 ****************************************************************************** 00007 * @attention 00008 * 00009 * Copyright (c) 2017 STMicroelectronics. 00010 * All rights reserved. 00011 * 00012 * This software is licensed under terms that can be found in the LICENSE file in 00013 * the root directory of this software component. 00014 * If no LICENSE file comes with this software, it is provided AS-IS. 00015 ****************************************************************************** 00016 */ 00017 #if defined(USE_FULL_LL_DRIVER) 00018 00019 /* Includes ------------------------------------------------------------------*/ 00020 #include "stm32h7xx_ll_rcc.h" 00021 #include "stm32h7xx_ll_bus.h" 00022 #ifdef USE_FULL_ASSERT 00023 #include "stm32_assert.h" 00024 #else 00025 #define assert_param(expr) ((void)0U) 00026 #endif 00027 00028 /** @addtogroup STM32H7xx_LL_Driver 00029 * @{ 00030 */ 00031 00032 #if defined(RCC) 00033 00034 /** @addtogroup RCC_LL 00035 * @{ 00036 */ 00037 00038 /* Private types -------------------------------------------------------------*/ 00039 /* Private variables ---------------------------------------------------------*/ 00040 const uint8_t LL_RCC_PrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; 00041 /* Private constants ---------------------------------------------------------*/ 00042 /* Private macros ------------------------------------------------------------*/ 00043 /** @addtogroup RCC_LL_Private_Macros 00044 * @{ 00045 */ 00046 #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART16_CLKSOURCE) \ 00047 || ((__VALUE__) == LL_RCC_USART234578_CLKSOURCE)) 00048 00049 00050 #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C123_CLKSOURCE) \ 00051 || ((__VALUE__) == LL_RCC_I2C4_CLKSOURCE)) 00052 00053 #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE) \ 00054 || ((__VALUE__) == LL_RCC_LPTIM2_CLKSOURCE) \ 00055 || ((__VALUE__) == LL_RCC_LPTIM345_CLKSOURCE)) 00056 00057 #if defined(SAI3) 00058 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \ 00059 || ((__VALUE__) == LL_RCC_SAI23_CLKSOURCE) \ 00060 || ((__VALUE__) == LL_RCC_SAI4A_CLKSOURCE) \ 00061 || ((__VALUE__) == LL_RCC_SAI4B_CLKSOURCE)) 00062 #elif defined(SAI4) 00063 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \ 00064 || ((__VALUE__) == LL_RCC_SAI4A_CLKSOURCE) \ 00065 || ((__VALUE__) == LL_RCC_SAI4B_CLKSOURCE)) 00066 #else 00067 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \ 00068 || ((__VALUE__) == LL_RCC_SAI2A_CLKSOURCE) \ 00069 || ((__VALUE__) == LL_RCC_SAI2B_CLKSOURCE)) 00070 #endif /* SAI3 */ 00071 00072 #define IS_LL_RCC_SPI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPI123_CLKSOURCE) \ 00073 || ((__VALUE__) == LL_RCC_SPI45_CLKSOURCE) \ 00074 || ((__VALUE__) == LL_RCC_SPI6_CLKSOURCE)) 00075 00076 /** 00077 * @} 00078 */ 00079 00080 /* Private function prototypes -----------------------------------------------*/ 00081 /** @defgroup RCC_LL_Private_Functions RCC Private functions 00082 * @{ 00083 */ 00084 static uint32_t RCC_GetSystemClockFreq(void); 00085 static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency); 00086 static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency); 00087 static uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency); 00088 static uint32_t RCC_GetPCLK3ClockFreq(uint32_t HCLK_Frequency); 00089 static uint32_t RCC_GetPCLK4ClockFreq(uint32_t HCLK_Frequency); 00090 00091 /** 00092 * @} 00093 */ 00094 00095 00096 /* Exported functions --------------------------------------------------------*/ 00097 /** @addtogroup RCC_LL_Exported_Functions 00098 * @{ 00099 */ 00100 00101 /** @addtogroup RCC_LL_EF_Init 00102 * @{ 00103 */ 00104 00105 /** 00106 * @brief Resets the RCC clock configuration to the default reset state. 00107 * @note The default reset state of the clock configuration is given below: 00108 * - HSI ON and used as system clock source 00109 * - HSE, PLL1, PLL2 and PLL3 OFF 00110 * - AHB, APB Bus pre-scaler set to 1. 00111 * - CSS, MCO1 and MCO2 OFF 00112 * - All interrupts disabled 00113 * @note This function doesn't modify the configuration of the 00114 * - Peripheral clocks 00115 * - LSI, LSE and RTC clocks 00116 * @retval None 00117 */ 00118 void LL_RCC_DeInit(void) 00119 { 00120 /* Increasing the CPU frequency */ 00121 if(FLASH_LATENCY_DEFAULT > (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY))) 00122 { 00123 /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ 00124 MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_DEFAULT)); 00125 } 00126 00127 /* Set HSION bit */ 00128 SET_BIT(RCC->CR, RCC_CR_HSION); 00129 00130 /* Wait for HSI READY bit */ 00131 while(LL_RCC_HSI_IsReady() == 0U) 00132 {} 00133 00134 /* Reset CFGR register */ 00135 CLEAR_REG(RCC->CFGR); 00136 00137 /* Reset CSION , CSIKERON, HSEON, HSI48ON, HSECSSON,HSIDIV, PLL1ON, PLL2ON, PLL3ON bits */ 00138 CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSIKERON| RCC_CR_HSIDIV| RCC_CR_HSIDIVF| RCC_CR_CSION | RCC_CR_CSIKERON | RCC_CR_HSI48ON \ 00139 |RCC_CR_CSSHSEON | RCC_CR_PLL1ON | RCC_CR_PLL2ON | RCC_CR_PLL3ON); 00140 00141 /* Wait for PLL1 READY bit to be reset */ 00142 while(LL_RCC_PLL1_IsReady() != 0U) 00143 {} 00144 00145 /* Wait for PLL2 READY bit to be reset */ 00146 while(LL_RCC_PLL2_IsReady() != 0U) 00147 {} 00148 00149 /* Wait for PLL3 READY bit to be reset */ 00150 while(LL_RCC_PLL3_IsReady() != 0U) 00151 {} 00152 00153 #if defined(RCC_D1CFGR_HPRE) 00154 /* Reset D1CFGR register */ 00155 CLEAR_REG(RCC->D1CFGR); 00156 00157 /* Reset D2CFGR register */ 00158 CLEAR_REG(RCC->D2CFGR); 00159 00160 /* Reset D3CFGR register */ 00161 CLEAR_REG(RCC->D3CFGR); 00162 #else 00163 /* Reset CDCFGR1 register */ 00164 CLEAR_REG(RCC->CDCFGR1); 00165 00166 /* Reset CDCFGR2 register */ 00167 CLEAR_REG(RCC->CDCFGR2); 00168 00169 /* Reset SRDCFGR register */ 00170 CLEAR_REG(RCC->SRDCFGR); 00171 00172 #endif /* RCC_D1CFGR_HPRE */ 00173 00174 /* Reset PLLCKSELR register to default value */ 00175 RCC->PLLCKSELR= RCC_PLLCKSELR_DIVM1_5|RCC_PLLCKSELR_DIVM2_5|RCC_PLLCKSELR_DIVM3_5; 00176 00177 /* Reset PLLCFGR register to default value */ 00178 LL_RCC_WriteReg(PLLCFGR, 0x01FF0000U); 00179 00180 /* Reset PLL1DIVR register to default value */ 00181 LL_RCC_WriteReg(PLL1DIVR, 0x01010280U); 00182 00183 /* Reset PLL1FRACR register */ 00184 CLEAR_REG(RCC->PLL1FRACR); 00185 00186 /* Reset PLL2DIVR register to default value */ 00187 LL_RCC_WriteReg(PLL2DIVR, 0x01010280U); 00188 00189 /* Reset PLL2FRACR register */ 00190 CLEAR_REG(RCC->PLL2FRACR); 00191 00192 /* Reset PLL3DIVR register to default value */ 00193 LL_RCC_WriteReg(PLL3DIVR, 0x01010280U); 00194 00195 /* Reset PLL3FRACR register */ 00196 CLEAR_REG(RCC->PLL3FRACR); 00197 00198 /* Reset HSEBYP bit */ 00199 CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); 00200 00201 /* Disable all interrupts */ 00202 CLEAR_REG(RCC->CIER); 00203 00204 /* Clear all interrupts */ 00205 SET_BIT(RCC->CICR, RCC_CICR_LSIRDYC | RCC_CICR_LSERDYC | RCC_CICR_HSIRDYC | RCC_CICR_HSERDYC 00206 | RCC_CICR_CSIRDYC | RCC_CICR_HSI48RDYC | RCC_CICR_PLLRDYC | RCC_CICR_PLL2RDYC 00207 | RCC_CICR_PLL3RDYC | RCC_CICR_LSECSSC | RCC_CICR_HSECSSC); 00208 00209 /* Clear reset source flags */ 00210 SET_BIT(RCC->RSR, RCC_RSR_RMVF); 00211 00212 /* Decreasing the number of wait states because of lower CPU frequency */ 00213 if(FLASH_LATENCY_DEFAULT < (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY))) 00214 { 00215 /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ 00216 MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_DEFAULT)); 00217 } 00218 00219 } 00220 00221 /** 00222 * @} 00223 */ 00224 00225 /** @addtogroup RCC_LL_EF_Get_Freq 00226 * @brief Return the frequencies of different on chip clocks; System, AHB, APB1, APB2, APB3 and APB4 buses clocks. 00227 * and different peripheral clocks available on the device. 00228 * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) 00229 * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) 00230 * @note If SYSCLK source is CSI, function returns values based on CSI_VALUE(***) 00231 * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(**) 00232 * or HSI_VALUE(*) multiplied/divided by the PLL factors. 00233 * @note (*) HSI_VALUE is a constant defined in header file (default value 00234 * 64 MHz) divider by HSIDIV, but the real value may vary depending on 00235 * on the variations in voltage and temperature. 00236 * @note (**) HSE_VALUE is a constant defined in header file (default value 00237 * 25 MHz), user has to ensure that HSE_VALUE is same as the real 00238 * frequency of the crystal used. Otherwise, this function may 00239 * have wrong result. 00240 * @note (***) CSI_VALUE is a constant defined in header file (default value 00241 * 4 MHz) but the real value may vary depending on the variations 00242 * in voltage and temperature. 00243 * @note The result of this function could be incorrect when using fractional 00244 * value for HSE crystal. 00245 * @note This function can be used by the user application to compute the 00246 * baud-rate for the communication peripherals or configure other parameters. 00247 * @{ 00248 */ 00249 00250 /** 00251 * @brief Return the frequencies of different on chip clocks; System, AHB, APB1, APB2, APB3 and APB4 buses clocks. 00252 * @note Each time SYSCLK, HCLK, PCLK1, PCLK2, PCLK3 and/or PCLK4 clock changes, this function 00253 * must be called to update structure fields. Otherwise, any 00254 * configuration based on this function will be incorrect. 00255 * @param RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies 00256 * @retval None 00257 */ 00258 void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks) 00259 { 00260 /* Get SYSCLK frequency */ 00261 RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq(); 00262 00263 /* HCLK clock frequency */ 00264 RCC_Clocks->HCLK_Frequency = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency); 00265 00266 /* PCLK1 clock frequency */ 00267 RCC_Clocks->PCLK1_Frequency = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency); 00268 00269 /* PCLK2 clock frequency */ 00270 RCC_Clocks->PCLK2_Frequency = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency); 00271 00272 /* PCLK3 clock frequency */ 00273 RCC_Clocks->PCLK3_Frequency = RCC_GetPCLK3ClockFreq(RCC_Clocks->HCLK_Frequency); 00274 00275 /* PCLK4 clock frequency */ 00276 RCC_Clocks->PCLK4_Frequency = RCC_GetPCLK4ClockFreq(RCC_Clocks->HCLK_Frequency); 00277 } 00278 00279 /** 00280 * @brief Return PLL1 clocks frequencies 00281 * @note LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready 00282 * @retval None 00283 */ 00284 void LL_RCC_GetPLL1ClockFreq(LL_PLL_ClocksTypeDef *PLL_Clocks) 00285 { 00286 uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO, pllsource; 00287 uint32_t m, n, fracn = 0U; 00288 00289 /* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN) 00290 SYSCLK = PLL_VCO / PLLP 00291 */ 00292 pllsource = LL_RCC_PLL_GetSource(); 00293 00294 switch (pllsource) 00295 { 00296 case LL_RCC_PLLSOURCE_HSI: 00297 if (LL_RCC_HSI_IsReady() != 0U) 00298 { 00299 pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos); 00300 } 00301 break; 00302 00303 case LL_RCC_PLLSOURCE_CSI: 00304 if (LL_RCC_CSI_IsReady() != 0U) 00305 { 00306 pllinputfreq = CSI_VALUE; 00307 } 00308 break; 00309 00310 case LL_RCC_PLLSOURCE_HSE: 00311 if (LL_RCC_HSE_IsReady() != 0U) 00312 { 00313 pllinputfreq = HSE_VALUE; 00314 } 00315 break; 00316 00317 case LL_RCC_PLLSOURCE_NONE: 00318 default: 00319 /* PLL clock disabled */ 00320 break; 00321 } 00322 00323 PLL_Clocks->PLL_P_Frequency = 0U; 00324 PLL_Clocks->PLL_Q_Frequency = 0U; 00325 PLL_Clocks->PLL_R_Frequency = 0U; 00326 00327 m = LL_RCC_PLL1_GetM(); 00328 n = LL_RCC_PLL1_GetN(); 00329 if (LL_RCC_PLL1FRACN_IsEnabled() != 0U) 00330 { 00331 fracn = LL_RCC_PLL1_GetFRACN(); 00332 } 00333 00334 if (m != 0U) 00335 { 00336 if (LL_RCC_PLL1P_IsEnabled() != 0U) 00337 { 00338 PLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL1_GetP()); 00339 } 00340 00341 if (LL_RCC_PLL1Q_IsEnabled() != 0U) 00342 { 00343 PLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL1_GetQ()); 00344 } 00345 00346 if (LL_RCC_PLL1R_IsEnabled() != 0U) 00347 { 00348 PLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL1_GetR()); 00349 } 00350 } 00351 } 00352 00353 /** 00354 * @brief Return PLL2 clocks frequencies 00355 * @note LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready 00356 * @retval None 00357 */ 00358 void LL_RCC_GetPLL2ClockFreq(LL_PLL_ClocksTypeDef *PLL_Clocks) 00359 { 00360 uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO, pllsource; 00361 uint32_t m, n, fracn = 0U; 00362 00363 /* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN) 00364 SYSCLK = PLL_VCO / PLLP 00365 */ 00366 pllsource = LL_RCC_PLL_GetSource(); 00367 00368 switch (pllsource) 00369 { 00370 case LL_RCC_PLLSOURCE_HSI: 00371 if (LL_RCC_HSI_IsReady() != 0U) 00372 { 00373 pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos); 00374 } 00375 break; 00376 00377 case LL_RCC_PLLSOURCE_CSI: 00378 if (LL_RCC_CSI_IsReady() != 0U) 00379 { 00380 pllinputfreq = CSI_VALUE; 00381 } 00382 break; 00383 00384 case LL_RCC_PLLSOURCE_HSE: 00385 if (LL_RCC_HSE_IsReady() != 0U) 00386 { 00387 pllinputfreq = HSE_VALUE; 00388 } 00389 break; 00390 00391 case LL_RCC_PLLSOURCE_NONE: 00392 default: 00393 /* PLL clock disabled */ 00394 break; 00395 } 00396 00397 PLL_Clocks->PLL_P_Frequency = 0U; 00398 PLL_Clocks->PLL_Q_Frequency = 0U; 00399 PLL_Clocks->PLL_R_Frequency = 0U; 00400 00401 m = LL_RCC_PLL2_GetM(); 00402 n = LL_RCC_PLL2_GetN(); 00403 if (LL_RCC_PLL2FRACN_IsEnabled() != 0U) 00404 { 00405 fracn = LL_RCC_PLL2_GetFRACN(); 00406 } 00407 00408 if (m != 0U) 00409 { 00410 if (LL_RCC_PLL2P_IsEnabled() != 0U) 00411 { 00412 PLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL2_GetP()); 00413 } 00414 00415 if (LL_RCC_PLL2Q_IsEnabled() != 0U) 00416 { 00417 PLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL2_GetQ()); 00418 } 00419 00420 if (LL_RCC_PLL2R_IsEnabled() != 0U) 00421 { 00422 PLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL2_GetR()); 00423 } 00424 } 00425 } 00426 00427 /** 00428 * @brief Return PLL3 clocks frequencies 00429 * @note LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready 00430 * @retval None 00431 */ 00432 void LL_RCC_GetPLL3ClockFreq(LL_PLL_ClocksTypeDef *PLL_Clocks) 00433 { 00434 uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO, pllsource; 00435 uint32_t m, n, fracn = 0U; 00436 00437 /* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN) 00438 SYSCLK = PLL_VCO / PLLP 00439 */ 00440 pllsource = LL_RCC_PLL_GetSource(); 00441 00442 switch (pllsource) 00443 { 00444 case LL_RCC_PLLSOURCE_HSI: 00445 if (LL_RCC_HSI_IsReady() != 0U) 00446 { 00447 pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos); 00448 } 00449 break; 00450 00451 case LL_RCC_PLLSOURCE_CSI: 00452 if (LL_RCC_CSI_IsReady() != 0U) 00453 { 00454 pllinputfreq = CSI_VALUE; 00455 } 00456 break; 00457 00458 case LL_RCC_PLLSOURCE_HSE: 00459 if (LL_RCC_HSE_IsReady() != 0U) 00460 { 00461 pllinputfreq = HSE_VALUE; 00462 } 00463 break; 00464 00465 case LL_RCC_PLLSOURCE_NONE: 00466 default: 00467 /* PLL clock disabled */ 00468 break; 00469 } 00470 00471 PLL_Clocks->PLL_P_Frequency = 0U; 00472 PLL_Clocks->PLL_Q_Frequency = 0U; 00473 PLL_Clocks->PLL_R_Frequency = 0U; 00474 00475 m = LL_RCC_PLL3_GetM(); 00476 n = LL_RCC_PLL3_GetN(); 00477 if (LL_RCC_PLL3FRACN_IsEnabled() != 0U) 00478 { 00479 fracn = LL_RCC_PLL3_GetFRACN(); 00480 } 00481 00482 if ((m != 0U) && (pllinputfreq != 0U)) 00483 { 00484 if (LL_RCC_PLL3P_IsEnabled() != 0U) 00485 { 00486 PLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL3_GetP()); 00487 } 00488 00489 if (LL_RCC_PLL3Q_IsEnabled() != 0U) 00490 { 00491 PLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL3_GetQ()); 00492 } 00493 00494 if (LL_RCC_PLL3R_IsEnabled() != 0U) 00495 { 00496 PLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL3_GetR()); 00497 } 00498 } 00499 } 00500 00501 /** 00502 * @brief Helper function to calculate the PLL frequency output 00503 * @note ex: @ref LL_RCC_CalcPLLClockFreq (HSE_VALUE, @ref LL_RCC_PLL1_GetM (), 00504 * @ref LL_RCC_PLL1_GetN (), @ref LL_RCC_PLL1_GetFRACN (), @ref LL_RCC_PLL1_GetP ()); 00505 * @param PLLInputFreq PLL Input frequency (based on HSE/(HSI/HSIDIV)/CSI) 00506 * @param M Between 1 and 63 00507 * @param N Between 4 and 512 00508 * @param FRACN Between 0 and 0x1FFF 00509 * @param PQR VCO output divider (P, Q or R) 00510 * Between 1 and 128, except for PLL1P Odd value not allowed 00511 * @retval PLL1 clock frequency (in Hz) 00512 */ 00513 uint32_t LL_RCC_CalcPLLClockFreq(uint32_t PLLInputFreq, uint32_t M, uint32_t N, uint32_t FRACN, uint32_t PQR) 00514 { 00515 float_t freq; 00516 00517 freq = ((float_t)PLLInputFreq / (float_t)M) * ((float_t)N + ((float_t)FRACN/(float_t)0x2000)); 00518 00519 freq = freq/(float_t)PQR; 00520 00521 return (uint32_t)freq; 00522 } 00523 00524 /** 00525 * @brief Return USARTx clock frequency 00526 * @param USARTxSource This parameter can be one of the following values: 00527 * @arg @ref LL_RCC_USART16_CLKSOURCE 00528 * @arg @ref LL_RCC_USART234578_CLKSOURCE 00529 * @retval USART clock frequency (in Hz) 00530 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 00531 */ 00532 uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource) 00533 { 00534 uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 00535 LL_PLL_ClocksTypeDef PLL_Clocks; 00536 00537 /* Check parameter */ 00538 assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource)); 00539 00540 switch (LL_RCC_GetUSARTClockSource(USARTxSource)) 00541 { 00542 case LL_RCC_USART16_CLKSOURCE_PCLK2: 00543 usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()))); 00544 break; 00545 00546 case LL_RCC_USART234578_CLKSOURCE_PCLK1: 00547 usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()))); 00548 break; 00549 00550 case LL_RCC_USART16_CLKSOURCE_PLL2Q: 00551 case LL_RCC_USART234578_CLKSOURCE_PLL2Q: 00552 if (LL_RCC_PLL2_IsReady() != 0U) 00553 { 00554 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 00555 usart_frequency = PLL_Clocks.PLL_Q_Frequency; 00556 } 00557 break; 00558 00559 case LL_RCC_USART16_CLKSOURCE_PLL3Q: 00560 case LL_RCC_USART234578_CLKSOURCE_PLL3Q: 00561 if (LL_RCC_PLL3_IsReady() != 0U) 00562 { 00563 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks); 00564 usart_frequency = PLL_Clocks.PLL_Q_Frequency; 00565 } 00566 break; 00567 00568 case LL_RCC_USART16_CLKSOURCE_HSI: 00569 case LL_RCC_USART234578_CLKSOURCE_HSI: 00570 if (LL_RCC_HSI_IsReady() != 0U) 00571 { 00572 usart_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos); 00573 } 00574 break; 00575 00576 case LL_RCC_USART16_CLKSOURCE_CSI: 00577 case LL_RCC_USART234578_CLKSOURCE_CSI: 00578 if (LL_RCC_CSI_IsReady() != 0U) 00579 { 00580 usart_frequency = CSI_VALUE; 00581 } 00582 break; 00583 00584 case LL_RCC_USART16_CLKSOURCE_LSE: 00585 case LL_RCC_USART234578_CLKSOURCE_LSE: 00586 if (LL_RCC_LSE_IsReady() != 0U) 00587 { 00588 usart_frequency = LSE_VALUE; 00589 } 00590 break; 00591 00592 default: 00593 /* Kernel clock disabled */ 00594 break; 00595 } 00596 00597 return usart_frequency; 00598 } 00599 00600 /** 00601 * @brief Return LPUART clock frequency 00602 * @param LPUARTxSource This parameter can be one of the following values: 00603 * @arg @ref LL_RCC_LPUART1_CLKSOURCE 00604 * @retval LPUART clock frequency (in Hz) 00605 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 00606 */ 00607 uint32_t LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource) 00608 { 00609 uint32_t lpuart_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 00610 LL_PLL_ClocksTypeDef PLL_Clocks; 00611 00612 switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource)) 00613 { 00614 case LL_RCC_LPUART1_CLKSOURCE_PCLK4: 00615 lpuart_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()))); 00616 break; 00617 00618 case LL_RCC_LPUART1_CLKSOURCE_PLL2Q: 00619 if (LL_RCC_PLL2_IsReady() != 0U) 00620 { 00621 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 00622 lpuart_frequency = PLL_Clocks.PLL_Q_Frequency; 00623 } 00624 break; 00625 00626 case LL_RCC_LPUART1_CLKSOURCE_PLL3Q: 00627 if (LL_RCC_PLL3_IsReady() != 0U) 00628 { 00629 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks); 00630 lpuart_frequency = PLL_Clocks.PLL_Q_Frequency; 00631 } 00632 break; 00633 00634 case LL_RCC_LPUART1_CLKSOURCE_HSI: 00635 if (LL_RCC_HSI_IsReady() != 0U) 00636 { 00637 lpuart_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos); 00638 } 00639 break; 00640 00641 case LL_RCC_LPUART1_CLKSOURCE_CSI: 00642 if (LL_RCC_CSI_IsReady() != 0U) 00643 { 00644 lpuart_frequency = CSI_VALUE; 00645 } 00646 break; 00647 00648 case LL_RCC_LPUART1_CLKSOURCE_LSE: 00649 if (LL_RCC_LSE_IsReady() != 0U) 00650 { 00651 lpuart_frequency = LSE_VALUE; 00652 } 00653 break; 00654 00655 default: 00656 /* Kernel clock disabled */ 00657 break; 00658 } 00659 00660 return lpuart_frequency; 00661 } 00662 00663 /** 00664 * @brief Return I2Cx clock frequency 00665 * @param I2CxSource This parameter can be one of the following values: 00666 * @arg @ref LL_RCC_I2C123_CLKSOURCE 00667 * @arg @ref LL_RCC_I2C4_CLKSOURCE 00668 * @retval I2C clock frequency (in Hz) 00669 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 00670 */ 00671 uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource) 00672 { 00673 uint32_t i2c_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 00674 LL_PLL_ClocksTypeDef PLL_Clocks; 00675 00676 /* Check parameter */ 00677 assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource)); 00678 00679 switch (LL_RCC_GetI2CClockSource(I2CxSource)) 00680 { 00681 case LL_RCC_I2C123_CLKSOURCE_PCLK1: 00682 i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()))); 00683 break; 00684 00685 case LL_RCC_I2C4_CLKSOURCE_PCLK4: 00686 i2c_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()))); 00687 break; 00688 00689 case LL_RCC_I2C123_CLKSOURCE_PLL3R: 00690 case LL_RCC_I2C4_CLKSOURCE_PLL3R: 00691 if (LL_RCC_PLL3_IsReady() != 0U) 00692 { 00693 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks); 00694 i2c_frequency = PLL_Clocks.PLL_R_Frequency; 00695 } 00696 break; 00697 00698 case LL_RCC_I2C123_CLKSOURCE_HSI: 00699 case LL_RCC_I2C4_CLKSOURCE_HSI: 00700 if (LL_RCC_HSI_IsReady() != 0U) 00701 { 00702 i2c_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos); 00703 } 00704 break; 00705 00706 case LL_RCC_I2C123_CLKSOURCE_CSI: 00707 case LL_RCC_I2C4_CLKSOURCE_CSI: 00708 if (LL_RCC_CSI_IsReady() != 0U) 00709 { 00710 i2c_frequency = CSI_VALUE; 00711 } 00712 break; 00713 00714 default: 00715 /* Nothing to do */ 00716 break; 00717 } 00718 00719 return i2c_frequency; 00720 } 00721 00722 /** 00723 * @brief Return LPTIMx clock frequency 00724 * @param LPTIMxSource This parameter can be one of the following values: 00725 * @arg @ref LL_RCC_LPTIM1_CLKSOURCE 00726 * @arg @ref LL_RCC_LPTIM2_CLKSOURCE 00727 * @arg @ref LL_RCC_LPTIM345_CLKSOURCE 00728 * @retval LPTIM clock frequency (in Hz) 00729 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 00730 */ 00731 uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource) 00732 { 00733 uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 00734 LL_PLL_ClocksTypeDef PLL_Clocks; 00735 00736 /* Check parameter */ 00737 assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource)); 00738 00739 switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource)) 00740 { 00741 case LL_RCC_LPTIM1_CLKSOURCE_PCLK1: 00742 lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()))); 00743 break; 00744 00745 case LL_RCC_LPTIM2_CLKSOURCE_PCLK4: 00746 case LL_RCC_LPTIM345_CLKSOURCE_PCLK4: 00747 lptim_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()))); 00748 break; 00749 00750 case LL_RCC_LPTIM1_CLKSOURCE_PLL2P: 00751 case LL_RCC_LPTIM2_CLKSOURCE_PLL2P: 00752 case LL_RCC_LPTIM345_CLKSOURCE_PLL2P: 00753 if (LL_RCC_PLL2_IsReady() != 0U) 00754 { 00755 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 00756 lptim_frequency = PLL_Clocks.PLL_P_Frequency; 00757 } 00758 break; 00759 00760 case LL_RCC_LPTIM1_CLKSOURCE_PLL3R: 00761 case LL_RCC_LPTIM2_CLKSOURCE_PLL3R: 00762 case LL_RCC_LPTIM345_CLKSOURCE_PLL3R: 00763 if (LL_RCC_PLL3_IsReady() != 0U) 00764 { 00765 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks); 00766 lptim_frequency = PLL_Clocks.PLL_R_Frequency; 00767 } 00768 break; 00769 00770 case LL_RCC_LPTIM1_CLKSOURCE_LSE: 00771 case LL_RCC_LPTIM2_CLKSOURCE_LSE: 00772 case LL_RCC_LPTIM345_CLKSOURCE_LSE: 00773 if (LL_RCC_LSE_IsReady() != 0U) 00774 { 00775 lptim_frequency = LSE_VALUE; 00776 } 00777 break; 00778 00779 case LL_RCC_LPTIM1_CLKSOURCE_LSI: 00780 case LL_RCC_LPTIM2_CLKSOURCE_LSI: 00781 case LL_RCC_LPTIM345_CLKSOURCE_LSI: 00782 if (LL_RCC_LSI_IsReady() != 0U) 00783 { 00784 lptim_frequency = LSI_VALUE; 00785 } 00786 break; 00787 00788 case LL_RCC_LPTIM1_CLKSOURCE_CLKP: 00789 case LL_RCC_LPTIM2_CLKSOURCE_CLKP: 00790 case LL_RCC_LPTIM345_CLKSOURCE_CLKP: 00791 lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE); 00792 break; 00793 00794 default: 00795 /* Kernel clock disabled */ 00796 break; 00797 } 00798 00799 return lptim_frequency; 00800 } 00801 00802 /** 00803 * @brief Return SAIx clock frequency 00804 * @param SAIxSource This parameter can be one of the following values: 00805 * @arg @ref LL_RCC_SAI1_CLKSOURCE 00806 * @arg @ref LL_RCC_SAI23_CLKSOURCE (*) 00807 * @arg @ref LL_RCC_SAI2A_CLKSOURCE (*) 00808 * @arg @ref LL_RCC_SAI2B_CLKSOURCE (*) 00809 * @arg @ref LL_RCC_SAI4A_CLKSOURCE (*) 00810 * @arg @ref LL_RCC_SAI4B_CLKSOURCE (*) 00811 * @retval SAI clock frequency (in Hz) 00812 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 00813 * 00814 * (*) : Available on some STM32H7 lines only. 00815 */ 00816 uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource) 00817 { 00818 uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 00819 LL_PLL_ClocksTypeDef PLL_Clocks; 00820 00821 /* Check parameter */ 00822 assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource)); 00823 00824 switch (LL_RCC_GetSAIClockSource(SAIxSource)) 00825 { 00826 case LL_RCC_SAI1_CLKSOURCE_PLL1Q: 00827 #if defined(SAI3) 00828 case LL_RCC_SAI23_CLKSOURCE_PLL1Q: 00829 #endif /* SAI3 */ 00830 #if defined(SAI4) 00831 case LL_RCC_SAI4A_CLKSOURCE_PLL1Q: 00832 case LL_RCC_SAI4B_CLKSOURCE_PLL1Q: 00833 #endif /* SAI4 */ 00834 #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL) 00835 case LL_RCC_SAI2A_CLKSOURCE_PLL1Q: 00836 case LL_RCC_SAI2B_CLKSOURCE_PLL1Q: 00837 #endif /* RCC_CDCCIP1R_SAI2ASEL || RCC_CDCCIP1R_SAI2BSEL */ 00838 if (LL_RCC_PLL1_IsReady() != 0U) 00839 { 00840 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks); 00841 sai_frequency = PLL_Clocks.PLL_Q_Frequency; 00842 } 00843 break; 00844 00845 case LL_RCC_SAI1_CLKSOURCE_PLL2P: 00846 #if defined(SAI3) 00847 case LL_RCC_SAI23_CLKSOURCE_PLL2P: 00848 #endif /* SAI3 */ 00849 #if defined(SAI4) 00850 case LL_RCC_SAI4A_CLKSOURCE_PLL2P: 00851 case LL_RCC_SAI4B_CLKSOURCE_PLL2P: 00852 #endif /* SAI4 */ 00853 #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL) 00854 case LL_RCC_SAI2A_CLKSOURCE_PLL2P: 00855 case LL_RCC_SAI2B_CLKSOURCE_PLL2P: 00856 #endif /* RCC_CDCCIP1R_SAI2ASEL || RCC_CDCCIP1R_SAI2BSEL */ 00857 if (LL_RCC_PLL2_IsReady() != 0U) 00858 { 00859 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 00860 sai_frequency = PLL_Clocks.PLL_P_Frequency; 00861 } 00862 break; 00863 00864 case LL_RCC_SAI1_CLKSOURCE_PLL3P: 00865 #if defined(SAI3) 00866 case LL_RCC_SAI23_CLKSOURCE_PLL3P: 00867 #endif /* SAI3 */ 00868 #if defined(SAI4) 00869 case LL_RCC_SAI4A_CLKSOURCE_PLL3P: 00870 case LL_RCC_SAI4B_CLKSOURCE_PLL3P: 00871 #endif /* SAI4 */ 00872 #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL) 00873 case LL_RCC_SAI2A_CLKSOURCE_PLL3P: 00874 case LL_RCC_SAI2B_CLKSOURCE_PLL3P: 00875 #endif /* RCC_CDCCIP1R_SAI2ASEL || RCC_CDCCIP1R_SAI2BSEL */ 00876 if (LL_RCC_PLL3_IsReady() != 0U) 00877 { 00878 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks); 00879 sai_frequency = PLL_Clocks.PLL_P_Frequency; 00880 } 00881 break; 00882 00883 case LL_RCC_SAI1_CLKSOURCE_I2S_CKIN: 00884 #if defined(SAI3) 00885 case LL_RCC_SAI23_CLKSOURCE_I2S_CKIN: 00886 #endif /* SAI3 */ 00887 #if defined(SAI4) 00888 case LL_RCC_SAI4A_CLKSOURCE_I2S_CKIN: 00889 case LL_RCC_SAI4B_CLKSOURCE_I2S_CKIN: 00890 #endif /* SAI4 */ 00891 #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL) 00892 case LL_RCC_SAI2A_CLKSOURCE_I2S_CKIN: 00893 case LL_RCC_SAI2B_CLKSOURCE_I2S_CKIN: 00894 #endif /* RCC_CDCCIP1R_SAI2ASEL || RCC_CDCCIP1R_SAI2BSEL */ 00895 sai_frequency = EXTERNAL_CLOCK_VALUE; 00896 break; 00897 00898 case LL_RCC_SAI1_CLKSOURCE_CLKP: 00899 #if defined(SAI3) 00900 case LL_RCC_SAI23_CLKSOURCE_CLKP: 00901 #endif /* SAI3 */ 00902 #if defined(SAI4) 00903 case LL_RCC_SAI4A_CLKSOURCE_CLKP: 00904 case LL_RCC_SAI4B_CLKSOURCE_CLKP: 00905 #endif /* SAI4 */ 00906 #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL) 00907 case LL_RCC_SAI2A_CLKSOURCE_CLKP: 00908 case LL_RCC_SAI2B_CLKSOURCE_CLKP: 00909 #endif /* RCC_CDCCIP1R_SAI2ASEL || RCC_CDCCIP1R_SAI2BSEL */ 00910 sai_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE); 00911 break; 00912 00913 default: 00914 /* Kernel clock disabled */ 00915 break; 00916 } 00917 00918 return sai_frequency; 00919 } 00920 00921 /** 00922 * @brief Return ADC clock frequency 00923 * @param ADCxSource This parameter can be one of the following values: 00924 * @arg @ref LL_RCC_ADC_CLKSOURCE 00925 * @retval ADC clock frequency (in Hz) 00926 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 00927 */ 00928 uint32_t LL_RCC_GetADCClockFreq(uint32_t ADCxSource) 00929 { 00930 uint32_t adc_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 00931 LL_PLL_ClocksTypeDef PLL_Clocks; 00932 00933 switch (LL_RCC_GetADCClockSource(ADCxSource)) 00934 { 00935 case LL_RCC_ADC_CLKSOURCE_PLL2P: 00936 if (LL_RCC_PLL2_IsReady() != 0U) 00937 { 00938 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 00939 adc_frequency = PLL_Clocks.PLL_P_Frequency; 00940 } 00941 break; 00942 00943 case LL_RCC_ADC_CLKSOURCE_PLL3R: 00944 if (LL_RCC_PLL3_IsReady() != 0U) 00945 { 00946 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks); 00947 adc_frequency = PLL_Clocks.PLL_R_Frequency; 00948 } 00949 break; 00950 00951 case LL_RCC_ADC_CLKSOURCE_CLKP: 00952 adc_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE); 00953 break; 00954 00955 default: 00956 /* Kernel clock disabled */ 00957 break; 00958 } 00959 00960 return adc_frequency; 00961 } 00962 00963 /** 00964 * @brief Return SDMMC clock frequency 00965 * @param SDMMCxSource This parameter can be one of the following values: 00966 * @arg @ref LL_RCC_SDMMC_CLKSOURCE 00967 * @retval SDMMC clock frequency (in Hz) 00968 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 00969 */ 00970 uint32_t LL_RCC_GetSDMMCClockFreq(uint32_t SDMMCxSource) 00971 { 00972 uint32_t sdmmc_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 00973 LL_PLL_ClocksTypeDef PLL_Clocks; 00974 00975 switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource)) 00976 { 00977 case LL_RCC_SDMMC_CLKSOURCE_PLL1Q: 00978 if (LL_RCC_PLL1_IsReady() != 0U) 00979 { 00980 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks); 00981 sdmmc_frequency = PLL_Clocks.PLL_Q_Frequency; 00982 } 00983 break; 00984 00985 case LL_RCC_SDMMC_CLKSOURCE_PLL2R: 00986 if (LL_RCC_PLL2_IsReady() != 0U) 00987 { 00988 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 00989 sdmmc_frequency = PLL_Clocks.PLL_R_Frequency; 00990 } 00991 break; 00992 00993 default: 00994 /* Nothing to do */ 00995 break; 00996 } 00997 00998 return sdmmc_frequency; 00999 } 01000 01001 /** 01002 * @brief Return RNG clock frequency 01003 * @param RNGxSource This parameter can be one of the following values: 01004 * @arg @ref LL_RCC_RNG_CLKSOURCE 01005 * @retval RNG clock frequency (in Hz) 01006 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01007 */ 01008 uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource) 01009 { 01010 uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01011 LL_PLL_ClocksTypeDef PLL_Clocks; 01012 01013 switch (LL_RCC_GetRNGClockSource(RNGxSource)) 01014 { 01015 case LL_RCC_RNG_CLKSOURCE_PLL1Q: 01016 if (LL_RCC_PLL1_IsReady() != 0U) 01017 { 01018 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks); 01019 rng_frequency = PLL_Clocks.PLL_Q_Frequency; 01020 } 01021 break; 01022 01023 case LL_RCC_RNG_CLKSOURCE_HSI48: 01024 if (LL_RCC_HSI48_IsReady() != 0U) 01025 { 01026 rng_frequency = 48000000U; 01027 } 01028 break; 01029 01030 case LL_RCC_RNG_CLKSOURCE_LSE: 01031 if (LL_RCC_LSE_IsReady() != 0U) 01032 { 01033 rng_frequency = LSE_VALUE; 01034 } 01035 break; 01036 01037 case LL_RCC_RNG_CLKSOURCE_LSI: 01038 if (LL_RCC_LSI_IsReady() != 0U) 01039 { 01040 rng_frequency = LSI_VALUE; 01041 } 01042 break; 01043 01044 default: 01045 /* Nothing to do */ 01046 break; 01047 } 01048 01049 return rng_frequency; 01050 } 01051 01052 /** 01053 * @brief Return CEC clock frequency 01054 * @param CECxSource This parameter can be one of the following values: 01055 * @arg @ref LL_RCC_RNG_CLKSOURCE 01056 * @retval CEC clock frequency (in Hz) 01057 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01058 */ 01059 uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource) 01060 { 01061 uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01062 01063 switch (LL_RCC_GetCECClockSource(CECxSource)) 01064 { 01065 case LL_RCC_CEC_CLKSOURCE_LSE: 01066 if (LL_RCC_LSE_IsReady() != 0U) 01067 { 01068 cec_frequency = LSE_VALUE; 01069 } 01070 break; 01071 01072 case LL_RCC_CEC_CLKSOURCE_LSI: 01073 if (LL_RCC_LSI_IsReady() != 0U) 01074 { 01075 cec_frequency = LSI_VALUE; 01076 } 01077 break; 01078 01079 case LL_RCC_CEC_CLKSOURCE_CSI_DIV122: 01080 if (LL_RCC_CSI_IsReady() != 0U) 01081 { 01082 cec_frequency = CSI_VALUE / 122U; 01083 } 01084 break; 01085 01086 default: 01087 /* Kernel clock disabled */ 01088 break; 01089 } 01090 01091 return cec_frequency; 01092 } 01093 01094 /** 01095 * @brief Return USB clock frequency 01096 * @param USBxSource This parameter can be one of the following values: 01097 * @arg @ref LL_RCC_USB_CLKSOURCE 01098 * @retval USB clock frequency (in Hz) 01099 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready or Disabled 01100 */ 01101 uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource) 01102 { 01103 uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01104 LL_PLL_ClocksTypeDef PLL_Clocks; 01105 01106 switch (LL_RCC_GetUSBClockSource(USBxSource)) 01107 { 01108 case LL_RCC_USB_CLKSOURCE_PLL1Q: 01109 if (LL_RCC_PLL1_IsReady() != 0U) 01110 { 01111 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks); 01112 usb_frequency = PLL_Clocks.PLL_Q_Frequency; 01113 } 01114 break; 01115 01116 case LL_RCC_USB_CLKSOURCE_PLL3Q: 01117 if (LL_RCC_PLL3_IsReady() != 0U) 01118 { 01119 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks); 01120 usb_frequency = PLL_Clocks.PLL_Q_Frequency; 01121 } 01122 break; 01123 01124 case LL_RCC_USB_CLKSOURCE_HSI48: 01125 if (LL_RCC_HSI48_IsReady() != 0U) 01126 { 01127 usb_frequency = HSI48_VALUE; 01128 } 01129 break; 01130 01131 case LL_RCC_USB_CLKSOURCE_DISABLE: 01132 default: 01133 /* Nothing to do */ 01134 break; 01135 } 01136 01137 return usb_frequency; 01138 } 01139 01140 /** 01141 * @brief Return DFSDM clock frequency 01142 * @param DFSDMxSource This parameter can be one of the following values: 01143 * @arg @ref LL_RCC_DFSDM1_CLKSOURCE 01144 * @retval DFSDM clock frequency (in Hz) 01145 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01146 */ 01147 uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource) 01148 { 01149 uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01150 01151 switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource)) 01152 { 01153 case LL_RCC_DFSDM1_CLKSOURCE_SYSCLK: 01154 dfsdm_frequency = RCC_GetSystemClockFreq(); 01155 break; 01156 01157 case LL_RCC_DFSDM1_CLKSOURCE_PCLK2: 01158 dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()))); 01159 break; 01160 01161 default: 01162 /* Nothing to do */ 01163 break; 01164 } 01165 01166 return dfsdm_frequency; 01167 } 01168 01169 #if defined(DFSDM2_BASE) 01170 /** 01171 * @brief Return DFSDM clock frequency 01172 * @param DFSDMxSource This parameter can be one of the following values: 01173 * @arg @ref LL_RCC_DFSDM2_CLKSOURCE 01174 * @retval DFSDM clock frequency (in Hz) 01175 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01176 */ 01177 uint32_t LL_RCC_GetDFSDM2ClockFreq(uint32_t DFSDMxSource) 01178 { 01179 uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01180 01181 01182 switch (LL_RCC_GetDFSDM2ClockSource(DFSDMxSource)) 01183 { 01184 01185 case LL_RCC_DFSDM2_CLKSOURCE_SYSCLK: 01186 dfsdm_frequency = RCC_GetSystemClockFreq(); 01187 break; 01188 01189 case LL_RCC_DFSDM2_CLKSOURCE_PCLK4: 01190 dfsdm_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()))); 01191 break; 01192 01193 default: 01194 /* Nothing to do */ 01195 break; 01196 } 01197 01198 return dfsdm_frequency; 01199 } 01200 #endif /* DFSDM2_BASE */ 01201 01202 #if defined(DSI) 01203 /** 01204 * @brief Return DSI clock frequency 01205 * @param DSIxSource This parameter can be one of the following values: 01206 * @arg @ref LL_RCC_DSI_CLKSOURCE 01207 * @retval DSI clock frequency (in Hz) 01208 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01209 * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used 01210 */ 01211 uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource) 01212 { 01213 uint32_t dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01214 LL_PLL_ClocksTypeDef PLL_Clocks; 01215 01216 switch (LL_RCC_GetDSIClockSource(DSIxSource)) 01217 { 01218 case LL_RCC_DSI_CLKSOURCE_PLL2Q: 01219 if (LL_RCC_PLL2_IsReady() != 0U) 01220 { 01221 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 01222 dsi_frequency = PLL_Clocks.PLL_Q_Frequency; 01223 } 01224 break; 01225 01226 case LL_RCC_DSI_CLKSOURCE_PHY: 01227 dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NA; 01228 break; 01229 01230 default: 01231 /* Nothing to do */ 01232 break; 01233 } 01234 01235 return dsi_frequency; 01236 } 01237 #endif /* DSI */ 01238 01239 /** 01240 * @brief Return SPDIF clock frequency 01241 * @param SPDIFxSource This parameter can be one of the following values: 01242 * @arg @ref LL_RCC_SPDIF_CLKSOURCE 01243 * @retval SPDIF clock frequency (in Hz) 01244 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01245 */ 01246 uint32_t LL_RCC_GetSPDIFClockFreq(uint32_t SPDIFxSource) 01247 { 01248 uint32_t spdif_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01249 LL_PLL_ClocksTypeDef PLL_Clocks; 01250 01251 switch (LL_RCC_GetSPDIFClockSource(SPDIFxSource)) 01252 { 01253 case LL_RCC_SPDIF_CLKSOURCE_PLL1Q: 01254 if (LL_RCC_PLL1_IsReady() != 0U) 01255 { 01256 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks); 01257 spdif_frequency = PLL_Clocks.PLL_Q_Frequency; 01258 } 01259 break; 01260 01261 case LL_RCC_SPDIF_CLKSOURCE_PLL2R: 01262 if (LL_RCC_PLL2_IsReady() != 0U) 01263 { 01264 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 01265 spdif_frequency = PLL_Clocks.PLL_R_Frequency; 01266 } 01267 break; 01268 01269 case LL_RCC_SPDIF_CLKSOURCE_PLL3R: 01270 if (LL_RCC_PLL3_IsReady() != 0U) 01271 { 01272 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks); 01273 spdif_frequency = PLL_Clocks.PLL_R_Frequency; 01274 } 01275 break; 01276 01277 case LL_RCC_SPDIF_CLKSOURCE_HSI: 01278 if (LL_RCC_HSI_IsReady() != 0U) 01279 { 01280 spdif_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos); 01281 } 01282 break; 01283 01284 default: 01285 /* Nothing to do */ 01286 break; 01287 } 01288 01289 return spdif_frequency; 01290 } 01291 01292 /** 01293 * @brief Return SPIx clock frequency 01294 * @param SPIxSource This parameter can be one of the following values: 01295 * @arg @ref LL_RCC_SPI123_CLKSOURCE 01296 * @arg @ref LL_RCC_SPI45_CLKSOURCE 01297 * @arg @ref LL_RCC_SPI6_CLKSOURCE 01298 * @retval SPI clock frequency (in Hz) 01299 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01300 */ 01301 uint32_t LL_RCC_GetSPIClockFreq(uint32_t SPIxSource) 01302 { 01303 uint32_t spi_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01304 LL_PLL_ClocksTypeDef PLL_Clocks; 01305 01306 /* Check parameter */ 01307 assert_param(IS_LL_RCC_SPI_CLKSOURCE(SPIxSource)); 01308 01309 switch (LL_RCC_GetSPIClockSource(SPIxSource)) 01310 { 01311 case LL_RCC_SPI123_CLKSOURCE_PLL1Q: 01312 if (LL_RCC_PLL1_IsReady() != 0U) 01313 { 01314 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks); 01315 spi_frequency = PLL_Clocks.PLL_Q_Frequency; 01316 } 01317 break; 01318 01319 case LL_RCC_SPI123_CLKSOURCE_PLL2P: 01320 if (LL_RCC_PLL2_IsReady() != 0U) 01321 { 01322 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 01323 spi_frequency = PLL_Clocks.PLL_P_Frequency; 01324 } 01325 break; 01326 01327 case LL_RCC_SPI123_CLKSOURCE_PLL3P: 01328 if (LL_RCC_PLL3_IsReady() != 0U) 01329 { 01330 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks); 01331 spi_frequency = PLL_Clocks.PLL_P_Frequency; 01332 } 01333 break; 01334 01335 case LL_RCC_SPI123_CLKSOURCE_I2S_CKIN: 01336 #if defined(LL_RCC_SPI6_CLKSOURCE_I2S_CKIN) 01337 case LL_RCC_SPI6_CLKSOURCE_I2S_CKIN: 01338 #endif /* LL_RCC_SPI6_CLKSOURCE_I2S_CKIN */ 01339 spi_frequency = EXTERNAL_CLOCK_VALUE; 01340 break; 01341 01342 case LL_RCC_SPI123_CLKSOURCE_CLKP: 01343 spi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE); 01344 break; 01345 01346 case LL_RCC_SPI45_CLKSOURCE_PCLK2: 01347 spi_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()))); 01348 break; 01349 01350 case LL_RCC_SPI6_CLKSOURCE_PCLK4: 01351 spi_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()))); 01352 break; 01353 01354 case LL_RCC_SPI45_CLKSOURCE_PLL2Q: 01355 case LL_RCC_SPI6_CLKSOURCE_PLL2Q: 01356 if (LL_RCC_PLL2_IsReady() != 0U) 01357 { 01358 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 01359 spi_frequency = PLL_Clocks.PLL_Q_Frequency; 01360 } 01361 break; 01362 01363 case LL_RCC_SPI45_CLKSOURCE_PLL3Q: 01364 case LL_RCC_SPI6_CLKSOURCE_PLL3Q: 01365 if (LL_RCC_PLL3_IsReady() != 0U) 01366 { 01367 LL_RCC_GetPLL3ClockFreq(&PLL_Clocks); 01368 spi_frequency = PLL_Clocks.PLL_Q_Frequency; 01369 } 01370 break; 01371 01372 case LL_RCC_SPI45_CLKSOURCE_HSI: 01373 case LL_RCC_SPI6_CLKSOURCE_HSI: 01374 if (LL_RCC_HSI_IsReady() != 0U) 01375 { 01376 spi_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos); 01377 } 01378 break; 01379 01380 case LL_RCC_SPI45_CLKSOURCE_CSI: 01381 case LL_RCC_SPI6_CLKSOURCE_CSI: 01382 if (LL_RCC_CSI_IsReady() != 0U) 01383 { 01384 spi_frequency = CSI_VALUE; 01385 } 01386 break; 01387 01388 case LL_RCC_SPI45_CLKSOURCE_HSE: 01389 case LL_RCC_SPI6_CLKSOURCE_HSE: 01390 if (LL_RCC_HSE_IsReady() != 0U) 01391 { 01392 spi_frequency = HSE_VALUE; 01393 } 01394 break; 01395 01396 default: 01397 /* Kernel clock disabled */ 01398 break; 01399 } 01400 01401 return spi_frequency; 01402 } 01403 01404 /** 01405 * @brief Return SWP clock frequency 01406 * @param SWPxSource This parameter can be one of the following values: 01407 * @arg @ref LL_RCC_SWP_CLKSOURCE 01408 * @retval SWP clock frequency (in Hz) 01409 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01410 */ 01411 uint32_t LL_RCC_GetSWPClockFreq(uint32_t SWPxSource) 01412 { 01413 uint32_t swp_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01414 01415 switch (LL_RCC_GetSWPClockSource(SWPxSource)) 01416 { 01417 case LL_RCC_SWP_CLKSOURCE_PCLK1: 01418 swp_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()))); 01419 break; 01420 01421 case LL_RCC_SWP_CLKSOURCE_HSI: 01422 if (LL_RCC_HSI_IsReady() != 0U) 01423 { 01424 swp_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos); 01425 } 01426 break; 01427 01428 default: 01429 /* Nothing to do */ 01430 break; 01431 } 01432 01433 return swp_frequency; 01434 } 01435 01436 /** 01437 * @brief Return FDCAN clock frequency 01438 * @param FDCANxSource This parameter can be one of the following values: 01439 * @arg @ref LL_RCC_FDCAN_CLKSOURCE 01440 * @retval FDCAN clock frequency (in Hz) 01441 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01442 */ 01443 uint32_t LL_RCC_GetFDCANClockFreq(uint32_t FDCANxSource) 01444 { 01445 uint32_t fdcan_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01446 LL_PLL_ClocksTypeDef PLL_Clocks; 01447 01448 switch (LL_RCC_GetFDCANClockSource(FDCANxSource)) 01449 { 01450 case LL_RCC_FDCAN_CLKSOURCE_HSE: 01451 if (LL_RCC_HSE_IsReady() != 0U) 01452 { 01453 fdcan_frequency = HSE_VALUE; 01454 } 01455 break; 01456 01457 case LL_RCC_FDCAN_CLKSOURCE_PLL1Q: 01458 if (LL_RCC_PLL1_IsReady() != 0U) 01459 { 01460 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks); 01461 fdcan_frequency = PLL_Clocks.PLL_Q_Frequency; 01462 } 01463 break; 01464 01465 case LL_RCC_FDCAN_CLKSOURCE_PLL2Q: 01466 if (LL_RCC_PLL2_IsReady() != 0U) 01467 { 01468 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 01469 fdcan_frequency = PLL_Clocks.PLL_Q_Frequency; 01470 } 01471 break; 01472 01473 default: 01474 /* Kernel clock disabled */ 01475 break; 01476 } 01477 01478 return fdcan_frequency; 01479 } 01480 01481 /** 01482 * @brief Return FMC clock frequency 01483 * @param FMCxSource This parameter can be one of the following values: 01484 * @arg @ref LL_RCC_FMC_CLKSOURCE 01485 * @retval FMC clock frequency (in Hz) 01486 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01487 */ 01488 uint32_t LL_RCC_GetFMCClockFreq(uint32_t FMCxSource) 01489 { 01490 uint32_t fmc_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01491 LL_PLL_ClocksTypeDef PLL_Clocks; 01492 01493 switch (LL_RCC_GetFMCClockSource(FMCxSource)) 01494 { 01495 case LL_RCC_FMC_CLKSOURCE_HCLK: 01496 fmc_frequency = RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())); 01497 break; 01498 01499 case LL_RCC_FMC_CLKSOURCE_PLL1Q: 01500 if (LL_RCC_PLL1_IsReady() != 0U) 01501 { 01502 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks); 01503 fmc_frequency = PLL_Clocks.PLL_Q_Frequency; 01504 } 01505 break; 01506 01507 case LL_RCC_FMC_CLKSOURCE_PLL2R: 01508 if (LL_RCC_PLL2_IsReady() != 0U) 01509 { 01510 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 01511 fmc_frequency = PLL_Clocks.PLL_R_Frequency; 01512 } 01513 break; 01514 01515 case LL_RCC_FMC_CLKSOURCE_CLKP: 01516 fmc_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE); 01517 break; 01518 01519 default: 01520 /* Nothing to do */ 01521 break; 01522 } 01523 01524 return fmc_frequency; 01525 } 01526 01527 #if defined(QUADSPI) 01528 /** 01529 * @brief Return QSPI clock frequency 01530 * @param QSPIxSource This parameter can be one of the following values: 01531 * @arg @ref LL_RCC_QSPI_CLKSOURCE 01532 * @retval QSPI clock frequency (in Hz) 01533 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01534 */ 01535 uint32_t LL_RCC_GetQSPIClockFreq(uint32_t QSPIxSource) 01536 { 01537 uint32_t qspi_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01538 LL_PLL_ClocksTypeDef PLL_Clocks; 01539 01540 switch (LL_RCC_GetQSPIClockSource(QSPIxSource)) 01541 { 01542 case LL_RCC_QSPI_CLKSOURCE_HCLK: 01543 qspi_frequency = RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())); 01544 break; 01545 01546 case LL_RCC_QSPI_CLKSOURCE_PLL1Q: 01547 if (LL_RCC_PLL1_IsReady() != 0U) 01548 { 01549 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks); 01550 qspi_frequency = PLL_Clocks.PLL_Q_Frequency; 01551 } 01552 break; 01553 01554 case LL_RCC_QSPI_CLKSOURCE_PLL2R: 01555 if (LL_RCC_PLL2_IsReady() != 0U) 01556 { 01557 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 01558 qspi_frequency = PLL_Clocks.PLL_R_Frequency; 01559 } 01560 break; 01561 01562 case LL_RCC_QSPI_CLKSOURCE_CLKP: 01563 qspi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE); 01564 break; 01565 01566 default: 01567 /* Nothing to do */ 01568 break; 01569 } 01570 01571 return qspi_frequency; 01572 } 01573 #endif /* QUADSPI */ 01574 01575 #if defined(OCTOSPI1) || defined(OCTOSPI2) 01576 /** 01577 * @brief Return OSPI clock frequency 01578 * @param OSPIxSource This parameter can be one of the following values: 01579 * @arg @ref LL_RCC_OSPI_CLKSOURCE 01580 * @retval OSPI clock frequency (in Hz) 01581 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01582 */ 01583 01584 uint32_t LL_RCC_GetOSPIClockFreq(uint32_t OSPIxSource) 01585 { 01586 uint32_t ospi_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01587 LL_PLL_ClocksTypeDef PLL_Clocks; 01588 01589 switch (LL_RCC_GetOSPIClockSource(OSPIxSource)) 01590 { 01591 case LL_RCC_OSPI_CLKSOURCE_HCLK: 01592 ospi_frequency = RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())); 01593 break; 01594 01595 case LL_RCC_OSPI_CLKSOURCE_PLL1Q: 01596 if (LL_RCC_PLL1_IsReady() != 0U) 01597 { 01598 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks); 01599 ospi_frequency = PLL_Clocks.PLL_Q_Frequency; 01600 } 01601 break; 01602 01603 case LL_RCC_OSPI_CLKSOURCE_PLL2R: 01604 if (LL_RCC_PLL2_IsReady() != 0U) 01605 { 01606 LL_RCC_GetPLL2ClockFreq(&PLL_Clocks); 01607 ospi_frequency = PLL_Clocks.PLL_R_Frequency; 01608 } 01609 break; 01610 01611 case LL_RCC_OSPI_CLKSOURCE_CLKP: 01612 ospi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE); 01613 break; 01614 01615 default: 01616 /* Nothing to do */ 01617 break; 01618 } 01619 01620 return ospi_frequency; 01621 } 01622 #endif /* defined(OCTOSPI1) || defined(OCTOSPI2) */ 01623 01624 /** 01625 * @brief Return CLKP clock frequency 01626 * @param CLKPxSource This parameter can be one of the following values: 01627 * @arg @ref LL_RCC_CLKP_CLKSOURCE 01628 * @retval CLKP clock frequency (in Hz) 01629 * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready 01630 */ 01631 uint32_t LL_RCC_GetCLKPClockFreq(uint32_t CLKPxSource) 01632 { 01633 uint32_t clkp_frequency = LL_RCC_PERIPH_FREQUENCY_NO; 01634 01635 switch (LL_RCC_GetCLKPClockSource(CLKPxSource)) 01636 { 01637 case LL_RCC_CLKP_CLKSOURCE_HSI: 01638 if (LL_RCC_HSI_IsReady() != 0U) 01639 { 01640 clkp_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos); 01641 } 01642 break; 01643 01644 case LL_RCC_CLKP_CLKSOURCE_CSI: 01645 if (LL_RCC_CSI_IsReady() != 0U) 01646 { 01647 clkp_frequency = CSI_VALUE; 01648 } 01649 break; 01650 01651 case LL_RCC_CLKP_CLKSOURCE_HSE: 01652 if (LL_RCC_HSE_IsReady() != 0U) 01653 { 01654 clkp_frequency = HSE_VALUE; 01655 } 01656 break; 01657 01658 default: 01659 /* CLKP clock disabled */ 01660 break; 01661 } 01662 01663 return clkp_frequency; 01664 } 01665 01666 /** 01667 * @} 01668 */ 01669 01670 /** 01671 * @} 01672 */ 01673 01674 /** @addtogroup RCC_LL_Private_Functions 01675 * @{ 01676 */ 01677 01678 /** 01679 * @brief Return SYSTEM clock frequency 01680 * @retval SYSTEM clock frequency (in Hz) 01681 */ 01682 static uint32_t RCC_GetSystemClockFreq(void) 01683 { 01684 uint32_t frequency = 0U; 01685 LL_PLL_ClocksTypeDef PLL_Clocks; 01686 01687 /* Get SYSCLK source -------------------------------------------------------*/ 01688 switch (LL_RCC_GetSysClkSource()) 01689 { 01690 /* No check on Ready: Won't be selected by hardware if not */ 01691 case LL_RCC_SYS_CLKSOURCE_STATUS_HSI: 01692 frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos); 01693 break; 01694 01695 case LL_RCC_SYS_CLKSOURCE_STATUS_CSI: 01696 frequency = CSI_VALUE; 01697 break; 01698 01699 case LL_RCC_SYS_CLKSOURCE_STATUS_HSE: 01700 frequency = HSE_VALUE; 01701 break; 01702 01703 case LL_RCC_SYS_CLKSOURCE_STATUS_PLL1: 01704 LL_RCC_GetPLL1ClockFreq(&PLL_Clocks); 01705 frequency = PLL_Clocks.PLL_P_Frequency; 01706 break; 01707 01708 default: 01709 /* Nothing to do */ 01710 break; 01711 } 01712 01713 return frequency; 01714 } 01715 01716 /** 01717 * @brief Return HCLK clock frequency 01718 * @param SYSCLK_Frequency SYSCLK clock frequency 01719 * @retval HCLK clock frequency (in Hz) 01720 */ 01721 static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency) 01722 { 01723 /* HCLK clock frequency */ 01724 return LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler()); 01725 } 01726 01727 /** 01728 * @brief Return PCLK1 clock frequency 01729 * @param HCLK_Frequency HCLK clock frequency 01730 * @retval PCLK1 clock frequency (in Hz) 01731 */ 01732 static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency) 01733 { 01734 /* PCLK1 clock frequency */ 01735 return LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler()); 01736 } 01737 01738 /** 01739 * @brief Return PCLK2 clock frequency 01740 * @param HCLK_Frequency HCLK clock frequency 01741 * @retval PCLK2 clock frequency (in Hz) 01742 */ 01743 static uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency) 01744 { 01745 /* PCLK2 clock frequency */ 01746 return LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler()); 01747 } 01748 01749 /** 01750 * @brief Return PCLK3 clock frequency 01751 * @param HCLK_Frequency HCLK clock frequency 01752 * @retval PCLK3 clock frequency (in Hz) 01753 */ 01754 static uint32_t RCC_GetPCLK3ClockFreq(uint32_t HCLK_Frequency) 01755 { 01756 /* PCLK3 clock frequency */ 01757 return LL_RCC_CALC_PCLK3_FREQ(HCLK_Frequency, LL_RCC_GetAPB3Prescaler()); 01758 } 01759 01760 /** 01761 * @brief Return PCLK4 clock frequency 01762 * @param HCLK_Frequency HCLK clock frequency 01763 * @retval PCLK4 clock frequency (in Hz) 01764 */ 01765 static uint32_t RCC_GetPCLK4ClockFreq(uint32_t HCLK_Frequency) 01766 { 01767 /* PCLK4 clock frequency */ 01768 return LL_RCC_CALC_PCLK4_FREQ(HCLK_Frequency, LL_RCC_GetAPB4Prescaler()); 01769 } 01770 01771 /** 01772 * @} 01773 */ 01774 01775 /** 01776 * @} 01777 */ 01778 01779 #endif /* defined(RCC) */ 01780 01781 /** 01782 * @} 01783 */ 01784 01785 #endif /* USE_FULL_LL_DRIVER */ 01786