You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1771 lines
50 KiB

  1. /**
  2. ******************************************************************************
  3. * @file stm32h7xx_ll_rcc.c
  4. * @author MCD Application Team
  5. * @brief RCC LL module driver.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics.
  10. * All rights reserved.</center></h2>
  11. *
  12. * This software component is licensed by ST under BSD 3-Clause license,
  13. * the "License"; You may not use this file except in compliance with the
  14. * License. You may obtain a copy of the License at:
  15. * opensource.org/licenses/BSD-3-Clause
  16. *
  17. ******************************************************************************
  18. */
  19. #if defined(USE_FULL_LL_DRIVER)
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "stm32h7xx_ll_rcc.h"
  22. #include "stm32h7xx_ll_bus.h"
  23. #ifdef USE_FULL_ASSERT
  24. #include "stm32_assert.h"
  25. #else
  26. #define assert_param(expr) ((void)0U)
  27. #endif
  28. /** @addtogroup STM32H7xx_LL_Driver
  29. * @{
  30. */
  31. #if defined(RCC)
  32. /** @addtogroup RCC_LL
  33. * @{
  34. */
  35. /* Private types -------------------------------------------------------------*/
  36. /* Private variables ---------------------------------------------------------*/
  37. const uint8_t LL_RCC_PrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
  38. /* Private constants ---------------------------------------------------------*/
  39. /* Private macros ------------------------------------------------------------*/
  40. /** @addtogroup RCC_LL_Private_Macros
  41. * @{
  42. */
  43. #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART16_CLKSOURCE) \
  44. || ((__VALUE__) == LL_RCC_USART234578_CLKSOURCE))
  45. #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C123_CLKSOURCE) \
  46. || ((__VALUE__) == LL_RCC_I2C4_CLKSOURCE))
  47. #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE) \
  48. || ((__VALUE__) == LL_RCC_LPTIM2_CLKSOURCE) \
  49. || ((__VALUE__) == LL_RCC_LPTIM345_CLKSOURCE))
  50. #if defined(LL_RCC_SAI4A_CLKSOURCE)
  51. #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
  52. || ((__VALUE__) == LL_RCC_SAI23_CLKSOURCE) \
  53. || ((__VALUE__) == LL_RCC_SAI4A_CLKSOURCE) \
  54. || ((__VALUE__) == LL_RCC_SAI4B_CLKSOURCE))
  55. #else
  56. #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
  57. || ((__VALUE__) == LL_RCC_SAI2A_CLKSOURCE) \
  58. || ((__VALUE__) == LL_RCC_SAI2B_CLKSOURCE))
  59. #endif /* LL_RCC_SAI4A_CLKSOURCE */
  60. #define IS_LL_RCC_SPI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPI123_CLKSOURCE) \
  61. || ((__VALUE__) == LL_RCC_SPI45_CLKSOURCE) \
  62. || ((__VALUE__) == LL_RCC_SPI6_CLKSOURCE))
  63. /**
  64. * @}
  65. */
  66. /* Private function prototypes -----------------------------------------------*/
  67. /** @defgroup RCC_LL_Private_Functions RCC Private functions
  68. * @{
  69. */
  70. uint32_t RCC_GetSystemClockFreq(void);
  71. uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
  72. uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
  73. uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
  74. uint32_t RCC_GetPCLK3ClockFreq(uint32_t HCLK_Frequency);
  75. uint32_t RCC_GetPCLK4ClockFreq(uint32_t HCLK_Frequency);
  76. /**
  77. * @}
  78. */
  79. /* Exported functions --------------------------------------------------------*/
  80. /** @addtogroup RCC_LL_Exported_Functions
  81. * @{
  82. */
  83. /** @addtogroup RCC_LL_EF_Init
  84. * @{
  85. */
  86. /**
  87. * @brief Resets the RCC clock configuration to the default reset state.
  88. * @note The default reset state of the clock configuration is given below:
  89. * - HSI ON and used as system clock source
  90. * - HSE, PLL1, PLL2 and PLL3 OFF
  91. * - AHB, APB Bus pre-scaler set to 1.
  92. * - CSS, MCO1 and MCO2 OFF
  93. * - All interrupts disabled
  94. * @note This function doesn't modify the configuration of the
  95. * - Peripheral clocks
  96. * - LSI, LSE and RTC clocks
  97. * @retval None
  98. */
  99. void LL_RCC_DeInit(void)
  100. {
  101. /* Set HSION bit */
  102. SET_BIT(RCC->CR, RCC_CR_HSION);
  103. /* Wait for HSI READY bit */
  104. while(LL_RCC_HSI_IsReady() == 0U)
  105. {}
  106. /* Reset CFGR register */
  107. CLEAR_REG(RCC->CFGR);
  108. /* Reset CSION , CSIKERON, HSEON, HSI48ON, HSECSSON,HSIDIV, PLL1ON, PLL2ON, PLL3ON bits */
  109. 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 \
  110. |RCC_CR_CSSHSEON | RCC_CR_PLL1ON | RCC_CR_PLL2ON | RCC_CR_PLL3ON);
  111. /* Wait for PLL1 READY bit to be reset */
  112. while(LL_RCC_PLL1_IsReady() != 0U)
  113. {}
  114. /* Wait for PLL2 READY bit to be reset */
  115. while(LL_RCC_PLL2_IsReady() != 0U)
  116. {}
  117. /* Wait for PLL3 READY bit to be reset */
  118. while(LL_RCC_PLL3_IsReady() != 0U)
  119. {}
  120. #if defined(RCC_D1CFGR_HPRE)
  121. /* Reset D1CFGR register */
  122. CLEAR_REG(RCC->D1CFGR);
  123. /* Reset D2CFGR register */
  124. CLEAR_REG(RCC->D2CFGR);
  125. /* Reset D3CFGR register */
  126. CLEAR_REG(RCC->D3CFGR);
  127. #else
  128. /* Reset CDCFGR1 register */
  129. CLEAR_REG(RCC->CDCFGR1);
  130. /* Reset CDCFGR2 register */
  131. CLEAR_REG(RCC->CDCFGR2);
  132. /* Reset SRDCFGR register */
  133. CLEAR_REG(RCC->SRDCFGR);
  134. #endif /* RCC_D1CFGR_HPRE */
  135. /* Reset PLLCKSELR register to default value */
  136. RCC->PLLCKSELR= RCC_PLLCKSELR_DIVM1_5|RCC_PLLCKSELR_DIVM2_5|RCC_PLLCKSELR_DIVM3_5;
  137. /* Reset PLLCFGR register to default value */
  138. LL_RCC_WriteReg(PLLCFGR, 0x01FF0000U);
  139. /* Reset PLL1DIVR register to default value */
  140. LL_RCC_WriteReg(PLL1DIVR, 0x01010280U);
  141. /* Reset PLL1FRACR register */
  142. CLEAR_REG(RCC->PLL1FRACR);
  143. /* Reset PLL2DIVR register to default value */
  144. LL_RCC_WriteReg(PLL2DIVR, 0x01010280U);
  145. /* Reset PLL2FRACR register */
  146. CLEAR_REG(RCC->PLL2FRACR);
  147. /* Reset PLL3DIVR register to default value */
  148. LL_RCC_WriteReg(PLL3DIVR, 0x01010280U);
  149. /* Reset PLL3FRACR register */
  150. CLEAR_REG(RCC->PLL3FRACR);
  151. /* Reset HSEBYP bit */
  152. CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP);
  153. /* Disable all interrupts */
  154. CLEAR_REG(RCC->CIER);
  155. /* Clear all interrupts */
  156. SET_BIT(RCC->CICR, RCC_CICR_LSIRDYC | RCC_CICR_LSERDYC | RCC_CICR_HSIRDYC | RCC_CICR_HSERDYC
  157. | RCC_CICR_CSIRDYC | RCC_CICR_HSI48RDYC | RCC_CICR_PLLRDYC | RCC_CICR_PLL2RDYC
  158. | RCC_CICR_PLL3RDYC | RCC_CICR_LSECSSC | RCC_CICR_HSECSSC);
  159. /* Clear reset source flags */
  160. SET_BIT(RCC->RSR, RCC_RSR_RMVF);
  161. }
  162. /**
  163. * @}
  164. */
  165. /** @addtogroup RCC_LL_EF_Get_Freq
  166. * @brief Return the frequencies of different on chip clocks; System, AHB, APB1, APB2, APB3 and APB4 buses clocks.
  167. * and different peripheral clocks available on the device.
  168. * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*)
  169. * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**)
  170. * @note If SYSCLK source is CSI, function returns values based on CSI_VALUE(***)
  171. * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(**)
  172. * or HSI_VALUE(*) multiplied/divided by the PLL factors.
  173. * @note (*) HSI_VALUE is a constant defined in header file (default value
  174. * 64 MHz) divider by HSIDIV, but the real value may vary depending on
  175. * on the variations in voltage and temperature.
  176. * @note (**) HSE_VALUE is a constant defined in header file (default value
  177. * 25 MHz), user has to ensure that HSE_VALUE is same as the real
  178. * frequency of the crystal used. Otherwise, this function may
  179. * have wrong result.
  180. * @note (***) CSI_VALUE is a constant defined in header file (default value
  181. * 4 MHz) but the real value may vary depending on the variations
  182. * in voltage and temperature.
  183. * @note The result of this function could be incorrect when using fractional
  184. * value for HSE crystal.
  185. * @note This function can be used by the user application to compute the
  186. * baud-rate for the communication peripherals or configure other parameters.
  187. * @{
  188. */
  189. /**
  190. * @brief Return the frequencies of different on chip clocks; System, AHB, APB1, APB2, APB3 and APB4 buses clocks.
  191. * @note Each time SYSCLK, HCLK, PCLK1, PCLK2, PCLK3 and/or PCLK4 clock changes, this function
  192. * must be called to update structure fields. Otherwise, any
  193. * configuration based on this function will be incorrect.
  194. * @param RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
  195. * @retval None
  196. */
  197. void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks)
  198. {
  199. /* Get SYSCLK frequency */
  200. RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
  201. /* HCLK clock frequency */
  202. RCC_Clocks->HCLK_Frequency = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
  203. /* PCLK1 clock frequency */
  204. RCC_Clocks->PCLK1_Frequency = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
  205. /* PCLK2 clock frequency */
  206. RCC_Clocks->PCLK2_Frequency = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency);
  207. /* PCLK3 clock frequency */
  208. RCC_Clocks->PCLK3_Frequency = RCC_GetPCLK3ClockFreq(RCC_Clocks->HCLK_Frequency);
  209. /* PCLK4 clock frequency */
  210. RCC_Clocks->PCLK4_Frequency = RCC_GetPCLK4ClockFreq(RCC_Clocks->HCLK_Frequency);
  211. }
  212. /**
  213. * @brief Return PLL1 clocks frequencies
  214. * @note LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
  215. * @retval None
  216. */
  217. void LL_RCC_GetPLL1ClockFreq(LL_PLL_ClocksTypeDef *PLL_Clocks)
  218. {
  219. uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO, pllsource;
  220. uint32_t m, n, fracn = 0U;
  221. /* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
  222. SYSCLK = PLL_VCO / PLLP
  223. */
  224. pllsource = LL_RCC_PLL_GetSource();
  225. switch (pllsource)
  226. {
  227. case LL_RCC_PLLSOURCE_HSI:
  228. if (LL_RCC_HSI_IsReady() != 0U)
  229. {
  230. pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
  231. }
  232. break;
  233. case LL_RCC_PLLSOURCE_CSI:
  234. if (LL_RCC_CSI_IsReady() != 0U)
  235. {
  236. pllinputfreq = CSI_VALUE;
  237. }
  238. break;
  239. case LL_RCC_PLLSOURCE_HSE:
  240. if (LL_RCC_HSE_IsReady() != 0U)
  241. {
  242. pllinputfreq = HSE_VALUE;
  243. }
  244. break;
  245. case LL_RCC_PLLSOURCE_NONE:
  246. default:
  247. /* PLL clock disabled */
  248. break;
  249. }
  250. PLL_Clocks->PLL_P_Frequency = 0U;
  251. PLL_Clocks->PLL_Q_Frequency = 0U;
  252. PLL_Clocks->PLL_R_Frequency = 0U;
  253. m = LL_RCC_PLL1_GetM();
  254. n = LL_RCC_PLL1_GetN();
  255. if (LL_RCC_PLL1FRACN_IsEnabled() != 0U)
  256. {
  257. fracn = LL_RCC_PLL1_GetFRACN();
  258. }
  259. if (m != 0U)
  260. {
  261. if (LL_RCC_PLL1P_IsEnabled() != 0U)
  262. {
  263. PLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL1_GetP());
  264. }
  265. if (LL_RCC_PLL1Q_IsEnabled() != 0U)
  266. {
  267. PLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL1_GetQ());
  268. }
  269. if (LL_RCC_PLL1R_IsEnabled() != 0U)
  270. {
  271. PLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL1_GetR());
  272. }
  273. }
  274. }
  275. /**
  276. * @brief Return PLL2 clocks frequencies
  277. * @note LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
  278. * @retval None
  279. */
  280. void LL_RCC_GetPLL2ClockFreq(LL_PLL_ClocksTypeDef *PLL_Clocks)
  281. {
  282. uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO, pllsource;
  283. uint32_t m, n, fracn = 0U;
  284. /* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
  285. SYSCLK = PLL_VCO / PLLP
  286. */
  287. pllsource = LL_RCC_PLL_GetSource();
  288. switch (pllsource)
  289. {
  290. case LL_RCC_PLLSOURCE_HSI:
  291. if (LL_RCC_HSI_IsReady() != 0U)
  292. {
  293. pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
  294. }
  295. break;
  296. case LL_RCC_PLLSOURCE_CSI:
  297. if (LL_RCC_CSI_IsReady() != 0U)
  298. {
  299. pllinputfreq = CSI_VALUE;
  300. }
  301. break;
  302. case LL_RCC_PLLSOURCE_HSE:
  303. if (LL_RCC_HSE_IsReady() != 0U)
  304. {
  305. pllinputfreq = HSE_VALUE;
  306. }
  307. break;
  308. case LL_RCC_PLLSOURCE_NONE:
  309. default:
  310. /* PLL clock disabled */
  311. break;
  312. }
  313. PLL_Clocks->PLL_P_Frequency = 0U;
  314. PLL_Clocks->PLL_Q_Frequency = 0U;
  315. PLL_Clocks->PLL_R_Frequency = 0U;
  316. m = LL_RCC_PLL2_GetM();
  317. n = LL_RCC_PLL2_GetN();
  318. if (LL_RCC_PLL2FRACN_IsEnabled() != 0U)
  319. {
  320. fracn = LL_RCC_PLL2_GetFRACN();
  321. }
  322. if (m != 0U)
  323. {
  324. if (LL_RCC_PLL2P_IsEnabled() != 0U)
  325. {
  326. PLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL2_GetP());
  327. }
  328. if (LL_RCC_PLL2Q_IsEnabled() != 0U)
  329. {
  330. PLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL2_GetQ());
  331. }
  332. if (LL_RCC_PLL2R_IsEnabled() != 0U)
  333. {
  334. PLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL2_GetR());
  335. }
  336. }
  337. }
  338. /**
  339. * @brief Return PLL3 clocks frequencies
  340. * @note LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
  341. * @retval None
  342. */
  343. void LL_RCC_GetPLL3ClockFreq(LL_PLL_ClocksTypeDef *PLL_Clocks)
  344. {
  345. uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO, pllsource;
  346. uint32_t m, n, fracn = 0U;
  347. /* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
  348. SYSCLK = PLL_VCO / PLLP
  349. */
  350. pllsource = LL_RCC_PLL_GetSource();
  351. switch (pllsource)
  352. {
  353. case LL_RCC_PLLSOURCE_HSI:
  354. if (LL_RCC_HSI_IsReady() != 0U)
  355. {
  356. pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
  357. }
  358. break;
  359. case LL_RCC_PLLSOURCE_CSI:
  360. if (LL_RCC_CSI_IsReady() != 0U)
  361. {
  362. pllinputfreq = CSI_VALUE;
  363. }
  364. break;
  365. case LL_RCC_PLLSOURCE_HSE:
  366. if (LL_RCC_HSE_IsReady() != 0U)
  367. {
  368. pllinputfreq = HSE_VALUE;
  369. }
  370. break;
  371. case LL_RCC_PLLSOURCE_NONE:
  372. default:
  373. /* PLL clock disabled */
  374. break;
  375. }
  376. PLL_Clocks->PLL_P_Frequency = 0U;
  377. PLL_Clocks->PLL_Q_Frequency = 0U;
  378. PLL_Clocks->PLL_R_Frequency = 0U;
  379. m = LL_RCC_PLL3_GetM();
  380. n = LL_RCC_PLL3_GetN();
  381. if (LL_RCC_PLL3FRACN_IsEnabled() != 0U)
  382. {
  383. fracn = LL_RCC_PLL3_GetFRACN();
  384. }
  385. if ((m != 0U) && (pllinputfreq != 0U))
  386. {
  387. if (LL_RCC_PLL3P_IsEnabled() != 0U)
  388. {
  389. PLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL3_GetP());
  390. }
  391. if (LL_RCC_PLL3Q_IsEnabled() != 0U)
  392. {
  393. PLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL3_GetQ());
  394. }
  395. if (LL_RCC_PLL3R_IsEnabled() != 0U)
  396. {
  397. PLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL3_GetR());
  398. }
  399. }
  400. }
  401. /**
  402. * @brief Helper function to calculate the PLL frequency output
  403. * @note ex: @ref LL_RCC_CalcPLLClockFreq (HSE_VALUE, @ref LL_RCC_PLL1_GetM (),
  404. * @ref LL_RCC_PLL1_GetN (), @ref LL_RCC_PLL1_GetFRACN (), @ref LL_RCC_PLL1_GetP ());
  405. * @param PLLInputFreq PLL Input frequency (based on HSE/(HSI/HSIDIV)/CSI)
  406. * @param M Between 1 and 63
  407. * @param N Between 4 and 512
  408. * @param FRACN Between 0 and 0x1FFF
  409. * @param PQR VCO output divider (P, Q or R)
  410. * Between 1 and 128, except for PLL1P Odd value not allowed
  411. * @retval PLL1 clock frequency (in Hz)
  412. */
  413. uint32_t LL_RCC_CalcPLLClockFreq(uint32_t PLLInputFreq, uint32_t M, uint32_t N, uint32_t FRACN, uint32_t PQR)
  414. {
  415. float_t freq;
  416. freq = ((float_t)PLLInputFreq / (float_t)M) * ((float_t)N + ((float_t)FRACN/(float_t)0x2000));
  417. freq = freq/(float_t)PQR;
  418. return (uint32_t)freq;
  419. }
  420. /**
  421. * @brief Return USARTx clock frequency
  422. * @param USARTxSource This parameter can be one of the following values:
  423. * @arg @ref LL_RCC_USART16_CLKSOURCE
  424. * @arg @ref LL_RCC_USART234578_CLKSOURCE
  425. * @retval USART clock frequency (in Hz)
  426. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  427. */
  428. uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)
  429. {
  430. uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  431. LL_PLL_ClocksTypeDef PLL_Clocks;
  432. /* Check parameter */
  433. assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource));
  434. switch (LL_RCC_GetUSARTClockSource(USARTxSource))
  435. {
  436. case LL_RCC_USART16_CLKSOURCE_PCLK2:
  437. usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
  438. break;
  439. case LL_RCC_USART234578_CLKSOURCE_PCLK1:
  440. usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
  441. break;
  442. case LL_RCC_USART16_CLKSOURCE_PLL2Q:
  443. case LL_RCC_USART234578_CLKSOURCE_PLL2Q:
  444. if (LL_RCC_PLL2_IsReady() != 0U)
  445. {
  446. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  447. usart_frequency = PLL_Clocks.PLL_Q_Frequency;
  448. }
  449. break;
  450. case LL_RCC_USART16_CLKSOURCE_PLL3Q:
  451. case LL_RCC_USART234578_CLKSOURCE_PLL3Q:
  452. if (LL_RCC_PLL3_IsReady() != 0U)
  453. {
  454. LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
  455. usart_frequency = PLL_Clocks.PLL_Q_Frequency;
  456. }
  457. break;
  458. case LL_RCC_USART16_CLKSOURCE_HSI:
  459. case LL_RCC_USART234578_CLKSOURCE_HSI:
  460. if (LL_RCC_HSI_IsReady() != 0U)
  461. {
  462. usart_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
  463. }
  464. break;
  465. case LL_RCC_USART16_CLKSOURCE_CSI:
  466. case LL_RCC_USART234578_CLKSOURCE_CSI:
  467. if (LL_RCC_CSI_IsReady() != 0U)
  468. {
  469. usart_frequency = CSI_VALUE;
  470. }
  471. break;
  472. case LL_RCC_USART16_CLKSOURCE_LSE:
  473. case LL_RCC_USART234578_CLKSOURCE_LSE:
  474. if (LL_RCC_LSE_IsReady() != 0U)
  475. {
  476. usart_frequency = LSE_VALUE;
  477. }
  478. break;
  479. default:
  480. /* Kernel clock disabled */
  481. break;
  482. }
  483. return usart_frequency;
  484. }
  485. /**
  486. * @brief Return LPUART clock frequency
  487. * @param LPUARTxSource This parameter can be one of the following values:
  488. * @arg @ref LL_RCC_LPUART1_CLKSOURCE
  489. * @retval LPUART clock frequency (in Hz)
  490. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  491. */
  492. uint32_t LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource)
  493. {
  494. uint32_t lpuart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  495. LL_PLL_ClocksTypeDef PLL_Clocks;
  496. switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource))
  497. {
  498. case LL_RCC_LPUART1_CLKSOURCE_PCLK4:
  499. lpuart_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
  500. break;
  501. case LL_RCC_LPUART1_CLKSOURCE_PLL2Q:
  502. if (LL_RCC_PLL2_IsReady() != 0U)
  503. {
  504. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  505. lpuart_frequency = PLL_Clocks.PLL_Q_Frequency;
  506. }
  507. break;
  508. case LL_RCC_LPUART1_CLKSOURCE_PLL3Q:
  509. if (LL_RCC_PLL3_IsReady() != 0U)
  510. {
  511. LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
  512. lpuart_frequency = PLL_Clocks.PLL_Q_Frequency;
  513. }
  514. break;
  515. case LL_RCC_LPUART1_CLKSOURCE_HSI:
  516. if (LL_RCC_HSI_IsReady() != 0U)
  517. {
  518. lpuart_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
  519. }
  520. break;
  521. case LL_RCC_LPUART1_CLKSOURCE_CSI:
  522. if (LL_RCC_CSI_IsReady() != 0U)
  523. {
  524. lpuart_frequency = CSI_VALUE;
  525. }
  526. break;
  527. case LL_RCC_LPUART1_CLKSOURCE_LSE:
  528. if (LL_RCC_LSE_IsReady() != 0U)
  529. {
  530. lpuart_frequency = LSE_VALUE;
  531. }
  532. break;
  533. default:
  534. /* Kernel clock disabled */
  535. break;
  536. }
  537. return lpuart_frequency;
  538. }
  539. /**
  540. * @brief Return I2Cx clock frequency
  541. * @param I2CxSource This parameter can be one of the following values:
  542. * @arg @ref LL_RCC_I2C123_CLKSOURCE
  543. * @arg @ref LL_RCC_I2C4_CLKSOURCE
  544. * @retval I2C clock frequency (in Hz)
  545. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  546. */
  547. uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)
  548. {
  549. uint32_t i2c_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  550. LL_PLL_ClocksTypeDef PLL_Clocks;
  551. /* Check parameter */
  552. assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource));
  553. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  554. {
  555. case LL_RCC_I2C123_CLKSOURCE_PCLK1:
  556. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
  557. break;
  558. case LL_RCC_I2C4_CLKSOURCE_PCLK4:
  559. i2c_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
  560. break;
  561. case LL_RCC_I2C123_CLKSOURCE_PLL3R:
  562. case LL_RCC_I2C4_CLKSOURCE_PLL3R:
  563. if (LL_RCC_PLL3_IsReady() != 0U)
  564. {
  565. LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
  566. i2c_frequency = PLL_Clocks.PLL_R_Frequency;
  567. }
  568. break;
  569. case LL_RCC_I2C123_CLKSOURCE_HSI:
  570. case LL_RCC_I2C4_CLKSOURCE_HSI:
  571. if (LL_RCC_HSI_IsReady() != 0U)
  572. {
  573. i2c_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
  574. }
  575. break;
  576. case LL_RCC_I2C123_CLKSOURCE_CSI:
  577. case LL_RCC_I2C4_CLKSOURCE_CSI:
  578. if (LL_RCC_CSI_IsReady() != 0U)
  579. {
  580. i2c_frequency = CSI_VALUE;
  581. }
  582. break;
  583. default:
  584. /* Nothing to do */
  585. break;
  586. }
  587. return i2c_frequency;
  588. }
  589. /**
  590. * @brief Return LPTIMx clock frequency
  591. * @param LPTIMxSource This parameter can be one of the following values:
  592. * @arg @ref LL_RCC_LPTIM1_CLKSOURCE
  593. * @arg @ref LL_RCC_LPTIM2_CLKSOURCE
  594. * @arg @ref LL_RCC_LPTIM345_CLKSOURCE
  595. * @retval LPTIM clock frequency (in Hz)
  596. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  597. */
  598. uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
  599. {
  600. uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  601. LL_PLL_ClocksTypeDef PLL_Clocks;
  602. /* Check parameter */
  603. assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
  604. switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
  605. {
  606. case LL_RCC_LPTIM1_CLKSOURCE_PCLK1:
  607. lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
  608. break;
  609. case LL_RCC_LPTIM2_CLKSOURCE_PCLK4:
  610. case LL_RCC_LPTIM345_CLKSOURCE_PCLK4:
  611. lptim_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
  612. break;
  613. case LL_RCC_LPTIM1_CLKSOURCE_PLL2P:
  614. case LL_RCC_LPTIM2_CLKSOURCE_PLL2P:
  615. case LL_RCC_LPTIM345_CLKSOURCE_PLL2P:
  616. if (LL_RCC_PLL2_IsReady() != 0U)
  617. {
  618. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  619. lptim_frequency = PLL_Clocks.PLL_P_Frequency;
  620. }
  621. break;
  622. case LL_RCC_LPTIM1_CLKSOURCE_PLL3R:
  623. case LL_RCC_LPTIM2_CLKSOURCE_PLL3R:
  624. case LL_RCC_LPTIM345_CLKSOURCE_PLL3R:
  625. if (LL_RCC_PLL3_IsReady() != 0U)
  626. {
  627. LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
  628. lptim_frequency = PLL_Clocks.PLL_R_Frequency;
  629. }
  630. break;
  631. case LL_RCC_LPTIM1_CLKSOURCE_LSE:
  632. case LL_RCC_LPTIM2_CLKSOURCE_LSE:
  633. case LL_RCC_LPTIM345_CLKSOURCE_LSE:
  634. if (LL_RCC_LSE_IsReady() != 0U)
  635. {
  636. lptim_frequency = LSE_VALUE;
  637. }
  638. break;
  639. case LL_RCC_LPTIM1_CLKSOURCE_LSI:
  640. case LL_RCC_LPTIM2_CLKSOURCE_LSI:
  641. case LL_RCC_LPTIM345_CLKSOURCE_LSI:
  642. if (LL_RCC_LSI_IsReady() != 0U)
  643. {
  644. lptim_frequency = LSI_VALUE;
  645. }
  646. break;
  647. case LL_RCC_LPTIM1_CLKSOURCE_CLKP:
  648. case LL_RCC_LPTIM2_CLKSOURCE_CLKP:
  649. case LL_RCC_LPTIM345_CLKSOURCE_CLKP:
  650. lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
  651. break;
  652. default:
  653. /* Kernel clock disabled */
  654. break;
  655. }
  656. return lptim_frequency;
  657. }
  658. /**
  659. * @brief Return SAIx clock frequency
  660. * @param SAIxSource This parameter can be one of the following values:
  661. * @arg @ref LL_RCC_SAI1_CLKSOURCE
  662. * @arg @ref LL_RCC_SAI23_CLKSOURCE (*)
  663. * @arg @ref LL_RCC_SAI2A_CLKSOURCE (*)
  664. * @arg @ref LL_RCC_SAI2B_CLKSOURCE (*)
  665. * @arg @ref LL_RCC_SAI4A_CLKSOURCE (*)
  666. * @arg @ref LL_RCC_SAI4B_CLKSOURCE (*)
  667. * @retval SAI clock frequency (in Hz)
  668. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  669. *
  670. * (*) : Available on some STM32H7 lines only.
  671. */
  672. uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
  673. {
  674. uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  675. LL_PLL_ClocksTypeDef PLL_Clocks;
  676. /* Check parameter */
  677. assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
  678. switch (LL_RCC_GetSAIClockSource(SAIxSource))
  679. {
  680. case LL_RCC_SAI1_CLKSOURCE_PLL1Q:
  681. #if defined(SAI3)
  682. case LL_RCC_SAI23_CLKSOURCE_PLL1Q:
  683. #endif /* SAI3 */
  684. #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL)
  685. case LL_RCC_SAI2A_CLKSOURCE_PLL1Q:
  686. case LL_RCC_SAI2B_CLKSOURCE_PLL1Q:
  687. #endif /* (RCC_CDCCIP1R_SAI2ASEL) || (RCC_CDCCIP1R_SAI2BSEL) */
  688. #if defined(SAI4_Block_A) || defined(SAI4_Block_B)
  689. case LL_RCC_SAI4A_CLKSOURCE_PLL1Q:
  690. case LL_RCC_SAI4B_CLKSOURCE_PLL1Q:
  691. #endif /* (SAI4_Block_A) || (SAI4_Block_B) */
  692. if (LL_RCC_PLL1_IsReady() != 0U)
  693. {
  694. LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
  695. sai_frequency = PLL_Clocks.PLL_Q_Frequency;
  696. }
  697. break;
  698. case LL_RCC_SAI1_CLKSOURCE_PLL2P:
  699. #if defined(SAI3)
  700. case LL_RCC_SAI23_CLKSOURCE_PLL2P:
  701. #endif /* SAI3 */
  702. #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL)
  703. case LL_RCC_SAI2A_CLKSOURCE_PLL2P:
  704. case LL_RCC_SAI2B_CLKSOURCE_PLL2P:
  705. #endif /* (RCC_CDCCIP1R_SAI2ASEL) || (RCC_CDCCIP1R_SAI2BSEL) */
  706. #if defined(SAI4_Block_A) || defined(SAI4_Block_B)
  707. case LL_RCC_SAI4A_CLKSOURCE_PLL2P:
  708. case LL_RCC_SAI4B_CLKSOURCE_PLL2P:
  709. #endif /* (SAI2_Block_A_BASE) || (SAI2_Block_B_BASE) */
  710. if (LL_RCC_PLL2_IsReady() != 0U)
  711. {
  712. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  713. sai_frequency = PLL_Clocks.PLL_P_Frequency;
  714. }
  715. break;
  716. case LL_RCC_SAI1_CLKSOURCE_PLL3P:
  717. #if defined(SAI3)
  718. case LL_RCC_SAI23_CLKSOURCE_PLL3P:
  719. #endif /* SAI3 */
  720. #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL)
  721. case LL_RCC_SAI2A_CLKSOURCE_PLL3P:
  722. case LL_RCC_SAI2B_CLKSOURCE_PLL3P:
  723. #endif /* (RCC_CDCCIP1R_SAI2ASEL) || (RCC_CDCCIP1R_SAI2BSEL) */
  724. #if defined(SAI4_Block_A) || defined(SAI4_Block_B)
  725. case LL_RCC_SAI4A_CLKSOURCE_PLL3P:
  726. case LL_RCC_SAI4B_CLKSOURCE_PLL3P:
  727. #endif /* (SAI2_Block_A_BASE) || (SAI2_Block_B_BASE) */
  728. if (LL_RCC_PLL3_IsReady() != 0U)
  729. {
  730. LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
  731. sai_frequency = PLL_Clocks.PLL_P_Frequency;
  732. }
  733. break;
  734. case LL_RCC_SAI1_CLKSOURCE_I2S_CKIN:
  735. #if defined(SAI3)
  736. case LL_RCC_SAI23_CLKSOURCE_I2S_CKIN:
  737. #endif /* SAI3 */
  738. #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL)
  739. case LL_RCC_SAI2A_CLKSOURCE_I2S_CKIN:
  740. case LL_RCC_SAI2B_CLKSOURCE_I2S_CKIN:
  741. #endif /* (RCC_CDCCIP1R_SAI2ASEL) || (RCC_CDCCIP1R_SAI2BSEL) */
  742. #if defined(SAI4_Block_A) || defined(SAI4_Block_B)
  743. case LL_RCC_SAI4A_CLKSOURCE_I2S_CKIN:
  744. case LL_RCC_SAI4B_CLKSOURCE_I2S_CKIN:
  745. #endif /* (SAI2_Block_A_BASE) || (SAI2_Block_B_BASE) */
  746. sai_frequency = EXTERNAL_CLOCK_VALUE;
  747. break;
  748. case LL_RCC_SAI1_CLKSOURCE_CLKP:
  749. #if defined(SAI3)
  750. case LL_RCC_SAI23_CLKSOURCE_CLKP:
  751. #endif /* SAI3 */
  752. #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL)
  753. case LL_RCC_SAI2A_CLKSOURCE_CLKP:
  754. case LL_RCC_SAI2B_CLKSOURCE_CLKP:
  755. #endif /* (RCC_CDCCIP1R_SAI2ASEL) || (RCC_CDCCIP1R_SAI2BSEL) */
  756. #if defined(SAI4_Block_A) || defined(SAI4_Block_B)
  757. case LL_RCC_SAI4A_CLKSOURCE_CLKP:
  758. case LL_RCC_SAI4B_CLKSOURCE_CLKP:
  759. #endif /* (SAI2_Block_A_BASE) || (SAI2_Block_B_BASE) */
  760. sai_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
  761. break;
  762. default:
  763. /* Kernel clock disabled */
  764. break;
  765. }
  766. return sai_frequency;
  767. }
  768. /**
  769. * @brief Return ADC clock frequency
  770. * @param ADCxSource This parameter can be one of the following values:
  771. * @arg @ref LL_RCC_ADC_CLKSOURCE
  772. * @retval ADC clock frequency (in Hz)
  773. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  774. */
  775. uint32_t LL_RCC_GetADCClockFreq(uint32_t ADCxSource)
  776. {
  777. uint32_t adc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  778. LL_PLL_ClocksTypeDef PLL_Clocks;
  779. switch (LL_RCC_GetADCClockSource(ADCxSource))
  780. {
  781. case LL_RCC_ADC_CLKSOURCE_PLL2P:
  782. if (LL_RCC_PLL2_IsReady() != 0U)
  783. {
  784. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  785. adc_frequency = PLL_Clocks.PLL_P_Frequency;
  786. }
  787. break;
  788. case LL_RCC_ADC_CLKSOURCE_PLL3R:
  789. if (LL_RCC_PLL3_IsReady() != 0U)
  790. {
  791. LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
  792. adc_frequency = PLL_Clocks.PLL_R_Frequency;
  793. }
  794. break;
  795. case LL_RCC_ADC_CLKSOURCE_CLKP:
  796. adc_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
  797. break;
  798. default:
  799. /* Kernel clock disabled */
  800. break;
  801. }
  802. return adc_frequency;
  803. }
  804. /**
  805. * @brief Return SDMMC clock frequency
  806. * @param SDMMCxSource This parameter can be one of the following values:
  807. * @arg @ref LL_RCC_SDMMC_CLKSOURCE
  808. * @retval SDMMC clock frequency (in Hz)
  809. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  810. */
  811. uint32_t LL_RCC_GetSDMMCClockFreq(uint32_t SDMMCxSource)
  812. {
  813. uint32_t sdmmc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  814. LL_PLL_ClocksTypeDef PLL_Clocks;
  815. switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
  816. {
  817. case LL_RCC_SDMMC_CLKSOURCE_PLL1Q:
  818. if (LL_RCC_PLL1_IsReady() != 0U)
  819. {
  820. LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
  821. sdmmc_frequency = PLL_Clocks.PLL_Q_Frequency;
  822. }
  823. break;
  824. case LL_RCC_SDMMC_CLKSOURCE_PLL2R:
  825. if (LL_RCC_PLL2_IsReady() != 0U)
  826. {
  827. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  828. sdmmc_frequency = PLL_Clocks.PLL_R_Frequency;
  829. }
  830. break;
  831. default:
  832. /* Nothing to do */
  833. break;
  834. }
  835. return sdmmc_frequency;
  836. }
  837. /**
  838. * @brief Return RNG clock frequency
  839. * @param RNGxSource This parameter can be one of the following values:
  840. * @arg @ref LL_RCC_RNG_CLKSOURCE
  841. * @retval RNG clock frequency (in Hz)
  842. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  843. */
  844. uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
  845. {
  846. uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  847. LL_PLL_ClocksTypeDef PLL_Clocks;
  848. switch (LL_RCC_GetRNGClockSource(RNGxSource))
  849. {
  850. case LL_RCC_RNG_CLKSOURCE_PLL1Q:
  851. if (LL_RCC_PLL1_IsReady() != 0U)
  852. {
  853. LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
  854. rng_frequency = PLL_Clocks.PLL_Q_Frequency;
  855. }
  856. break;
  857. case LL_RCC_RNG_CLKSOURCE_HSI48:
  858. if (LL_RCC_HSI48_IsReady() != 0U)
  859. {
  860. rng_frequency = 48000000U;
  861. }
  862. break;
  863. case LL_RCC_RNG_CLKSOURCE_LSE:
  864. if (LL_RCC_LSE_IsReady() != 0U)
  865. {
  866. rng_frequency = LSE_VALUE;
  867. }
  868. break;
  869. case LL_RCC_RNG_CLKSOURCE_LSI:
  870. if (LL_RCC_LSI_IsReady() != 0U)
  871. {
  872. rng_frequency = LSI_VALUE;
  873. }
  874. break;
  875. default:
  876. /* Nothing to do */
  877. break;
  878. }
  879. return rng_frequency;
  880. }
  881. /**
  882. * @brief Return CEC clock frequency
  883. * @param CECxSource This parameter can be one of the following values:
  884. * @arg @ref LL_RCC_RNG_CLKSOURCE
  885. * @retval CEC clock frequency (in Hz)
  886. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  887. */
  888. uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource)
  889. {
  890. uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  891. switch (LL_RCC_GetCECClockSource(CECxSource))
  892. {
  893. case LL_RCC_CEC_CLKSOURCE_LSE:
  894. if (LL_RCC_LSE_IsReady() != 0U)
  895. {
  896. cec_frequency = LSE_VALUE;
  897. }
  898. break;
  899. case LL_RCC_CEC_CLKSOURCE_LSI:
  900. if (LL_RCC_LSI_IsReady() != 0U)
  901. {
  902. cec_frequency = LSI_VALUE;
  903. }
  904. break;
  905. case LL_RCC_CEC_CLKSOURCE_CSI_DIV122:
  906. if (LL_RCC_CSI_IsReady() != 0U)
  907. {
  908. cec_frequency = CSI_VALUE / 122U;
  909. }
  910. break;
  911. default:
  912. /* Kernel clock disabled */
  913. break;
  914. }
  915. return cec_frequency;
  916. }
  917. /**
  918. * @brief Return USB clock frequency
  919. * @param USBxSource This parameter can be one of the following values:
  920. * @arg @ref LL_RCC_USB_CLKSOURCE
  921. * @retval USB clock frequency (in Hz)
  922. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready or Disabled
  923. */
  924. uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
  925. {
  926. uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  927. LL_PLL_ClocksTypeDef PLL_Clocks;
  928. switch (LL_RCC_GetUSBClockSource(USBxSource))
  929. {
  930. case LL_RCC_USB_CLKSOURCE_PLL1Q:
  931. if (LL_RCC_PLL1_IsReady() != 0U)
  932. {
  933. LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
  934. usb_frequency = PLL_Clocks.PLL_Q_Frequency;
  935. }
  936. break;
  937. case LL_RCC_USB_CLKSOURCE_PLL3Q:
  938. if (LL_RCC_PLL3_IsReady() != 0U)
  939. {
  940. LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
  941. usb_frequency = PLL_Clocks.PLL_Q_Frequency;
  942. }
  943. break;
  944. case LL_RCC_USB_CLKSOURCE_HSI48:
  945. if (LL_RCC_HSI48_IsReady() != 0U)
  946. {
  947. usb_frequency = HSI48_VALUE;
  948. }
  949. break;
  950. case LL_RCC_USB_CLKSOURCE_DISABLE:
  951. default:
  952. /* Nothing to do */
  953. break;
  954. }
  955. return usb_frequency;
  956. }
  957. /**
  958. * @brief Return DFSDM clock frequency
  959. * @param DFSDMxSource This parameter can be one of the following values:
  960. * @arg @ref LL_RCC_DFSDM1_CLKSOURCE
  961. * @retval DFSDM clock frequency (in Hz)
  962. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  963. */
  964. uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource)
  965. {
  966. uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  967. switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
  968. {
  969. case LL_RCC_DFSDM1_CLKSOURCE_SYSCLK:
  970. dfsdm_frequency = RCC_GetSystemClockFreq();
  971. break;
  972. case LL_RCC_DFSDM1_CLKSOURCE_PCLK2:
  973. dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
  974. break;
  975. default:
  976. /* Nothing to do */
  977. break;
  978. }
  979. return dfsdm_frequency;
  980. }
  981. #if defined(DFSDM2_BASE)
  982. /**
  983. * @brief Return DFSDM clock frequency
  984. * @param DFSDMxSource This parameter can be one of the following values:
  985. * @arg @ref LL_RCC_DFSDM2_CLKSOURCE
  986. * @retval DFSDM clock frequency (in Hz)
  987. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  988. */
  989. uint32_t LL_RCC_GetDFSDM2ClockFreq(uint32_t DFSDMxSource)
  990. {
  991. uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  992. switch (LL_RCC_GetDFSDM2ClockSource(DFSDMxSource))
  993. {
  994. case LL_RCC_DFSDM2_CLKSOURCE_SYSCLK:
  995. dfsdm_frequency = RCC_GetSystemClockFreq();
  996. break;
  997. case LL_RCC_DFSDM2_CLKSOURCE_PCLK4:
  998. dfsdm_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
  999. break;
  1000. default:
  1001. /* Nothing to do */
  1002. break;
  1003. }
  1004. return dfsdm_frequency;
  1005. }
  1006. #endif /* DFSDM2_BASE */
  1007. #if defined(DSI)
  1008. /**
  1009. * @brief Return DSI clock frequency
  1010. * @param DSIxSource This parameter can be one of the following values:
  1011. * @arg @ref LL_RCC_DSI_CLKSOURCE
  1012. * @retval DSI clock frequency (in Hz)
  1013. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  1014. * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used
  1015. */
  1016. uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource)
  1017. {
  1018. uint32_t dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1019. LL_PLL_ClocksTypeDef PLL_Clocks;
  1020. switch (LL_RCC_GetDSIClockSource(DSIxSource))
  1021. {
  1022. case LL_RCC_DSI_CLKSOURCE_PLL2Q:
  1023. if (LL_RCC_PLL2_IsReady() != 0U)
  1024. {
  1025. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  1026. dsi_frequency = PLL_Clocks.PLL_Q_Frequency;
  1027. }
  1028. break;
  1029. case LL_RCC_DSI_CLKSOURCE_PHY:
  1030. dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  1031. break;
  1032. default:
  1033. /* Nothing to do */
  1034. break;
  1035. }
  1036. return dsi_frequency;
  1037. }
  1038. #endif /* DSI */
  1039. /**
  1040. * @brief Return SPDIF clock frequency
  1041. * @param SPDIFxSource This parameter can be one of the following values:
  1042. * @arg @ref LL_RCC_SPDIF_CLKSOURCE
  1043. * @retval SPDIF clock frequency (in Hz)
  1044. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  1045. */
  1046. uint32_t LL_RCC_GetSPDIFClockFreq(uint32_t SPDIFxSource)
  1047. {
  1048. uint32_t spdif_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1049. LL_PLL_ClocksTypeDef PLL_Clocks;
  1050. switch (LL_RCC_GetSPDIFClockSource(SPDIFxSource))
  1051. {
  1052. case LL_RCC_SPDIF_CLKSOURCE_PLL1Q:
  1053. if (LL_RCC_PLL1_IsReady() != 0U)
  1054. {
  1055. LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
  1056. spdif_frequency = PLL_Clocks.PLL_Q_Frequency;
  1057. }
  1058. break;
  1059. case LL_RCC_SPDIF_CLKSOURCE_PLL2R:
  1060. if (LL_RCC_PLL2_IsReady() != 0U)
  1061. {
  1062. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  1063. spdif_frequency = PLL_Clocks.PLL_R_Frequency;
  1064. }
  1065. break;
  1066. case LL_RCC_SPDIF_CLKSOURCE_PLL3R:
  1067. if (LL_RCC_PLL3_IsReady() != 0U)
  1068. {
  1069. LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
  1070. spdif_frequency = PLL_Clocks.PLL_R_Frequency;
  1071. }
  1072. break;
  1073. case LL_RCC_SPDIF_CLKSOURCE_HSI:
  1074. if (LL_RCC_HSI_IsReady() != 0U)
  1075. {
  1076. spdif_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
  1077. }
  1078. break;
  1079. default:
  1080. /* Nothing to do */
  1081. break;
  1082. }
  1083. return spdif_frequency;
  1084. }
  1085. /**
  1086. * @brief Return SPIx clock frequency
  1087. * @param SPIxSource This parameter can be one of the following values:
  1088. * @arg @ref LL_RCC_SPI123_CLKSOURCE
  1089. * @arg @ref LL_RCC_SPI45_CLKSOURCE
  1090. * @arg @ref LL_RCC_SPI6_CLKSOURCE
  1091. * @retval SPI clock frequency (in Hz)
  1092. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  1093. */
  1094. uint32_t LL_RCC_GetSPIClockFreq(uint32_t SPIxSource)
  1095. {
  1096. uint32_t spi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1097. LL_PLL_ClocksTypeDef PLL_Clocks;
  1098. /* Check parameter */
  1099. assert_param(IS_LL_RCC_SPI_CLKSOURCE(SPIxSource));
  1100. switch (LL_RCC_GetSPIClockSource(SPIxSource))
  1101. {
  1102. case LL_RCC_SPI123_CLKSOURCE_PLL1Q:
  1103. if (LL_RCC_PLL1_IsReady() != 0U)
  1104. {
  1105. LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
  1106. spi_frequency = PLL_Clocks.PLL_Q_Frequency;
  1107. }
  1108. break;
  1109. case LL_RCC_SPI123_CLKSOURCE_PLL2P:
  1110. if (LL_RCC_PLL2_IsReady() != 0U)
  1111. {
  1112. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  1113. spi_frequency = PLL_Clocks.PLL_P_Frequency;
  1114. }
  1115. break;
  1116. case LL_RCC_SPI123_CLKSOURCE_PLL3P:
  1117. if (LL_RCC_PLL3_IsReady() != 0U)
  1118. {
  1119. LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
  1120. spi_frequency = PLL_Clocks.PLL_P_Frequency;
  1121. }
  1122. break;
  1123. case LL_RCC_SPI123_CLKSOURCE_I2S_CKIN:
  1124. #if defined(LL_RCC_SPI6_CLKSOURCE_I2S_CKIN)
  1125. case LL_RCC_SPI6_CLKSOURCE_I2S_CKIN:
  1126. #endif /* LL_RCC_SPI6_CLKSOURCE_I2S_CKIN */
  1127. spi_frequency = EXTERNAL_CLOCK_VALUE;
  1128. break;
  1129. case LL_RCC_SPI123_CLKSOURCE_CLKP:
  1130. spi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
  1131. break;
  1132. case LL_RCC_SPI45_CLKSOURCE_PCLK2:
  1133. spi_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
  1134. break;
  1135. case LL_RCC_SPI6_CLKSOURCE_PCLK4:
  1136. spi_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
  1137. break;
  1138. case LL_RCC_SPI45_CLKSOURCE_PLL2Q:
  1139. case LL_RCC_SPI6_CLKSOURCE_PLL2Q:
  1140. if (LL_RCC_PLL2_IsReady() != 0U)
  1141. {
  1142. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  1143. spi_frequency = PLL_Clocks.PLL_Q_Frequency;
  1144. }
  1145. break;
  1146. case LL_RCC_SPI45_CLKSOURCE_PLL3Q:
  1147. case LL_RCC_SPI6_CLKSOURCE_PLL3Q:
  1148. if (LL_RCC_PLL3_IsReady() != 0U)
  1149. {
  1150. LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
  1151. spi_frequency = PLL_Clocks.PLL_Q_Frequency;
  1152. }
  1153. break;
  1154. case LL_RCC_SPI45_CLKSOURCE_HSI:
  1155. case LL_RCC_SPI6_CLKSOURCE_HSI:
  1156. if (LL_RCC_HSI_IsReady() != 0U)
  1157. {
  1158. spi_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
  1159. }
  1160. break;
  1161. case LL_RCC_SPI45_CLKSOURCE_CSI:
  1162. case LL_RCC_SPI6_CLKSOURCE_CSI:
  1163. if (LL_RCC_CSI_IsReady() != 0U)
  1164. {
  1165. spi_frequency = CSI_VALUE;
  1166. }
  1167. break;
  1168. case LL_RCC_SPI45_CLKSOURCE_HSE:
  1169. case LL_RCC_SPI6_CLKSOURCE_HSE:
  1170. if (LL_RCC_HSE_IsReady() != 0U)
  1171. {
  1172. spi_frequency = HSE_VALUE;
  1173. }
  1174. break;
  1175. default:
  1176. /* Kernel clock disabled */
  1177. break;
  1178. }
  1179. return spi_frequency;
  1180. }
  1181. /**
  1182. * @brief Return SWP clock frequency
  1183. * @param SWPxSource This parameter can be one of the following values:
  1184. * @arg @ref LL_RCC_SWP_CLKSOURCE
  1185. * @retval SWP clock frequency (in Hz)
  1186. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  1187. */
  1188. uint32_t LL_RCC_GetSWPClockFreq(uint32_t SWPxSource)
  1189. {
  1190. uint32_t swp_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1191. switch (LL_RCC_GetSWPClockSource(SWPxSource))
  1192. {
  1193. case LL_RCC_SWP_CLKSOURCE_PCLK1:
  1194. swp_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
  1195. break;
  1196. case LL_RCC_SWP_CLKSOURCE_HSI:
  1197. if (LL_RCC_HSI_IsReady() != 0U)
  1198. {
  1199. swp_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
  1200. }
  1201. break;
  1202. default:
  1203. /* Nothing to do */
  1204. break;
  1205. }
  1206. return swp_frequency;
  1207. }
  1208. /**
  1209. * @brief Return FDCAN clock frequency
  1210. * @param FDCANxSource This parameter can be one of the following values:
  1211. * @arg @ref LL_RCC_FDCAN_CLKSOURCE
  1212. * @retval FDCAN clock frequency (in Hz)
  1213. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  1214. */
  1215. uint32_t LL_RCC_GetFDCANClockFreq(uint32_t FDCANxSource)
  1216. {
  1217. uint32_t fdcan_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1218. LL_PLL_ClocksTypeDef PLL_Clocks;
  1219. switch (LL_RCC_GetFDCANClockSource(FDCANxSource))
  1220. {
  1221. case LL_RCC_FDCAN_CLKSOURCE_HSE:
  1222. if (LL_RCC_HSE_IsReady() != 0U)
  1223. {
  1224. fdcan_frequency = HSE_VALUE;
  1225. }
  1226. break;
  1227. case LL_RCC_FDCAN_CLKSOURCE_PLL1Q:
  1228. if (LL_RCC_PLL1_IsReady() != 0U)
  1229. {
  1230. LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
  1231. fdcan_frequency = PLL_Clocks.PLL_Q_Frequency;
  1232. }
  1233. break;
  1234. case LL_RCC_FDCAN_CLKSOURCE_PLL2Q:
  1235. if (LL_RCC_PLL2_IsReady() != 0U)
  1236. {
  1237. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  1238. fdcan_frequency = PLL_Clocks.PLL_Q_Frequency;
  1239. }
  1240. break;
  1241. default:
  1242. /* Kernel clock disabled */
  1243. break;
  1244. }
  1245. return fdcan_frequency;
  1246. }
  1247. /**
  1248. * @brief Return FMC clock frequency
  1249. * @param FMCxSource This parameter can be one of the following values:
  1250. * @arg @ref LL_RCC_FMC_CLKSOURCE
  1251. * @retval FMC clock frequency (in Hz)
  1252. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  1253. */
  1254. uint32_t LL_RCC_GetFMCClockFreq(uint32_t FMCxSource)
  1255. {
  1256. uint32_t fmc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1257. LL_PLL_ClocksTypeDef PLL_Clocks;
  1258. switch (LL_RCC_GetFMCClockSource(FMCxSource))
  1259. {
  1260. case LL_RCC_FMC_CLKSOURCE_HCLK:
  1261. fmc_frequency = RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()));
  1262. break;
  1263. case LL_RCC_FMC_CLKSOURCE_PLL1Q:
  1264. if (LL_RCC_PLL1_IsReady() != 0U)
  1265. {
  1266. LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
  1267. fmc_frequency = PLL_Clocks.PLL_Q_Frequency;
  1268. }
  1269. break;
  1270. case LL_RCC_FMC_CLKSOURCE_PLL2R:
  1271. if (LL_RCC_PLL2_IsReady() != 0U)
  1272. {
  1273. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  1274. fmc_frequency = PLL_Clocks.PLL_R_Frequency;
  1275. }
  1276. break;
  1277. case LL_RCC_FMC_CLKSOURCE_CLKP:
  1278. fmc_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
  1279. break;
  1280. default:
  1281. /* Nothing to do */
  1282. break;
  1283. }
  1284. return fmc_frequency;
  1285. }
  1286. #if defined(QUADSPI)
  1287. /**
  1288. * @brief Return QSPI clock frequency
  1289. * @param QSPIxSource This parameter can be one of the following values:
  1290. * @arg @ref LL_RCC_QSPI_CLKSOURCE
  1291. * @retval QSPI clock frequency (in Hz)
  1292. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  1293. */
  1294. uint32_t LL_RCC_GetQSPIClockFreq(uint32_t QSPIxSource)
  1295. {
  1296. uint32_t qspi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1297. LL_PLL_ClocksTypeDef PLL_Clocks;
  1298. switch (LL_RCC_GetQSPIClockSource(QSPIxSource))
  1299. {
  1300. case LL_RCC_QSPI_CLKSOURCE_HCLK:
  1301. qspi_frequency = RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()));
  1302. break;
  1303. case LL_RCC_QSPI_CLKSOURCE_PLL1Q:
  1304. if (LL_RCC_PLL1_IsReady() != 0U)
  1305. {
  1306. LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
  1307. qspi_frequency = PLL_Clocks.PLL_Q_Frequency;
  1308. }
  1309. break;
  1310. case LL_RCC_QSPI_CLKSOURCE_PLL2R:
  1311. if (LL_RCC_PLL2_IsReady() != 0U)
  1312. {
  1313. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  1314. qspi_frequency = PLL_Clocks.PLL_R_Frequency;
  1315. }
  1316. break;
  1317. case LL_RCC_QSPI_CLKSOURCE_CLKP:
  1318. qspi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
  1319. break;
  1320. default:
  1321. /* Nothing to do */
  1322. break;
  1323. }
  1324. return qspi_frequency;
  1325. }
  1326. #endif /* QUADSPI */
  1327. #if defined(OCTOSPI1) || defined(OCTOSPI2)
  1328. /**
  1329. * @brief Return OSPI clock frequency
  1330. * @param QSPIxSource This parameter can be one of the following values:
  1331. * @arg @ref LL_RCC_OSPI_CLKSOURCE
  1332. * @retval OSPI clock frequency (in Hz)
  1333. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  1334. */
  1335. uint32_t LL_RCC_GetOSPIClockFreq(uint32_t OSPIxSource)
  1336. {
  1337. uint32_t ospi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1338. LL_PLL_ClocksTypeDef PLL_Clocks;
  1339. switch (LL_RCC_GetOSPIClockSource(OSPIxSource))
  1340. {
  1341. case LL_RCC_OSPI_CLKSOURCE_HCLK:
  1342. ospi_frequency = RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()));
  1343. break;
  1344. case LL_RCC_OSPI_CLKSOURCE_PLL1Q:
  1345. if (LL_RCC_PLL1_IsReady() != 0U)
  1346. {
  1347. LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
  1348. ospi_frequency = PLL_Clocks.PLL_Q_Frequency;
  1349. }
  1350. break;
  1351. case LL_RCC_OSPI_CLKSOURCE_PLL2R:
  1352. if (LL_RCC_PLL2_IsReady() != 0U)
  1353. {
  1354. LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
  1355. ospi_frequency = PLL_Clocks.PLL_R_Frequency;
  1356. }
  1357. break;
  1358. case LL_RCC_OSPI_CLKSOURCE_CLKP:
  1359. ospi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
  1360. break;
  1361. default:
  1362. /* Nothing to do */
  1363. break;
  1364. }
  1365. return ospi_frequency;
  1366. }
  1367. #endif /* defined(OCTOSPI1) || defined(OCTOSPI2) */
  1368. /**
  1369. * @brief Return CLKP clock frequency
  1370. * @param CLKPxSource This parameter can be one of the following values:
  1371. * @arg @ref LL_RCC_CLKP_CLKSOURCE
  1372. * @retval CLKP clock frequency (in Hz)
  1373. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  1374. */
  1375. uint32_t LL_RCC_GetCLKPClockFreq(uint32_t CLKPxSource)
  1376. {
  1377. uint32_t clkp_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1378. switch (LL_RCC_GetCLKPClockSource(CLKPxSource))
  1379. {
  1380. case LL_RCC_CLKP_CLKSOURCE_HSI:
  1381. if (LL_RCC_HSI_IsReady() != 0U)
  1382. {
  1383. clkp_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
  1384. }
  1385. break;
  1386. case LL_RCC_CLKP_CLKSOURCE_CSI:
  1387. if (LL_RCC_CSI_IsReady() != 0U)
  1388. {
  1389. clkp_frequency = CSI_VALUE;
  1390. }
  1391. break;
  1392. case LL_RCC_CLKP_CLKSOURCE_HSE:
  1393. if (LL_RCC_HSE_IsReady() != 0U)
  1394. {
  1395. clkp_frequency = HSE_VALUE;
  1396. }
  1397. break;
  1398. default:
  1399. /* CLKP clock disabled */
  1400. break;
  1401. }
  1402. return clkp_frequency;
  1403. }
  1404. /**
  1405. * @}
  1406. */
  1407. /**
  1408. * @}
  1409. */
  1410. /** @addtogroup RCC_LL_Private_Functions
  1411. * @{
  1412. */
  1413. /**
  1414. * @brief Return SYSTEM clock frequency
  1415. * @retval SYSTEM clock frequency (in Hz)
  1416. */
  1417. uint32_t RCC_GetSystemClockFreq(void)
  1418. {
  1419. uint32_t frequency = 0U;
  1420. LL_PLL_ClocksTypeDef PLL_Clocks;
  1421. /* Get SYSCLK source -------------------------------------------------------*/
  1422. switch (LL_RCC_GetSysClkSource())
  1423. {
  1424. /* No check on Ready: Won't be selected by hardware if not */
  1425. case LL_RCC_SYS_CLKSOURCE_STATUS_HSI:
  1426. frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
  1427. break;
  1428. case LL_RCC_SYS_CLKSOURCE_STATUS_CSI:
  1429. frequency = CSI_VALUE;
  1430. break;
  1431. case LL_RCC_SYS_CLKSOURCE_STATUS_HSE:
  1432. frequency = HSE_VALUE;
  1433. break;
  1434. case LL_RCC_SYS_CLKSOURCE_STATUS_PLL1:
  1435. LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
  1436. frequency = PLL_Clocks.PLL_P_Frequency;
  1437. break;
  1438. default:
  1439. /* Nothing to do */
  1440. break;
  1441. }
  1442. return frequency;
  1443. }
  1444. /**
  1445. * @brief Return HCLK clock frequency
  1446. * @param SYSCLK_Frequency SYSCLK clock frequency
  1447. * @retval HCLK clock frequency (in Hz)
  1448. */
  1449. uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
  1450. {
  1451. /* HCLK clock frequency */
  1452. return LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
  1453. }
  1454. /**
  1455. * @brief Return PCLK1 clock frequency
  1456. * @param HCLK_Frequency HCLK clock frequency
  1457. * @retval PCLK1 clock frequency (in Hz)
  1458. */
  1459. uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
  1460. {
  1461. /* PCLK1 clock frequency */
  1462. return LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
  1463. }
  1464. /**
  1465. * @brief Return PCLK2 clock frequency
  1466. * @param HCLK_Frequency HCLK clock frequency
  1467. * @retval PCLK2 clock frequency (in Hz)
  1468. */
  1469. uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
  1470. {
  1471. /* PCLK2 clock frequency */
  1472. return LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
  1473. }
  1474. /**
  1475. * @brief Return PCLK3 clock frequency
  1476. * @param HCLK_Frequency HCLK clock frequency
  1477. * @retval PCLK3 clock frequency (in Hz)
  1478. */
  1479. uint32_t RCC_GetPCLK3ClockFreq(uint32_t HCLK_Frequency)
  1480. {
  1481. /* PCLK3 clock frequency */
  1482. return LL_RCC_CALC_PCLK3_FREQ(HCLK_Frequency, LL_RCC_GetAPB3Prescaler());
  1483. }
  1484. /**
  1485. * @brief Return PCLK4 clock frequency
  1486. * @param HCLK_Frequency HCLK clock frequency
  1487. * @retval PCLK4 clock frequency (in Hz)
  1488. */
  1489. uint32_t RCC_GetPCLK4ClockFreq(uint32_t HCLK_Frequency)
  1490. {
  1491. /* PCLK4 clock frequency */
  1492. return LL_RCC_CALC_PCLK4_FREQ(HCLK_Frequency, LL_RCC_GetAPB4Prescaler());
  1493. }
  1494. /**
  1495. * @}
  1496. */
  1497. /**
  1498. * @}
  1499. */
  1500. #endif /* defined(RCC) */
  1501. /**
  1502. * @}
  1503. */
  1504. #endif /* USE_FULL_LL_DRIVER */
  1505. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/