Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 

1680 řádky
50 KiB

  1. /**
  2. ******************************************************************************
  3. * @file stm32f4xx_ll_rcc.c
  4. * @author MCD Application Team
  5. * @brief RCC LL module driver.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2017 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file in
  13. * the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. ******************************************************************************
  16. */
  17. #if defined(USE_FULL_LL_DRIVER)
  18. /* Includes ------------------------------------------------------------------*/
  19. #include "stm32f4xx_ll_rcc.h"
  20. #ifdef USE_FULL_ASSERT
  21. #include "stm32_assert.h"
  22. #else
  23. #define assert_param(expr) ((void)0U)
  24. #endif /* USE_FULL_ASSERT */
  25. /** @addtogroup STM32F4xx_LL_Driver
  26. * @{
  27. */
  28. #if defined(RCC)
  29. /** @addtogroup RCC_LL
  30. * @{
  31. */
  32. /* Private types -------------------------------------------------------------*/
  33. /* Private variables ---------------------------------------------------------*/
  34. /* Private constants ---------------------------------------------------------*/
  35. /* Private macros ------------------------------------------------------------*/
  36. /** @addtogroup RCC_LL_Private_Macros
  37. * @{
  38. */
  39. #if defined(FMPI2C1)
  40. #define IS_LL_RCC_FMPI2C_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_FMPI2C1_CLKSOURCE)
  41. #endif /* FMPI2C1 */
  42. #if defined(LPTIM1)
  43. #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE))
  44. #endif /* LPTIM1 */
  45. #if defined(SAI1)
  46. #if defined(RCC_DCKCFGR_SAI1SRC)
  47. #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
  48. || ((__VALUE__) == LL_RCC_SAI2_CLKSOURCE))
  49. #elif defined(RCC_DCKCFGR_SAI1ASRC)
  50. #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_A_CLKSOURCE) \
  51. || ((__VALUE__) == LL_RCC_SAI1_B_CLKSOURCE))
  52. #endif /* RCC_DCKCFGR_SAI1SRC */
  53. #endif /* SAI1 */
  54. #if defined(SDIO)
  55. #define IS_LL_RCC_SDIO_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SDIO_CLKSOURCE))
  56. #endif /* SDIO */
  57. #if defined(RNG)
  58. #define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_RNG_CLKSOURCE))
  59. #endif /* RNG */
  60. #if defined(USB_OTG_FS) || defined(USB_OTG_HS)
  61. #define IS_LL_RCC_USB_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USB_CLKSOURCE))
  62. #endif /* USB_OTG_FS || USB_OTG_HS */
  63. #if defined(DFSDM2_Channel0)
  64. #define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE))
  65. #define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE) \
  66. || ((__VALUE__) == LL_RCC_DFSDM2_AUDIO_CLKSOURCE))
  67. #elif defined(DFSDM1_Channel0)
  68. #define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE))
  69. #define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE))
  70. #endif /* DFSDM2_Channel0 */
  71. #if defined(RCC_DCKCFGR_I2S2SRC)
  72. #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE) \
  73. || ((__VALUE__) == LL_RCC_I2S2_CLKSOURCE))
  74. #else
  75. #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE))
  76. #endif /* RCC_DCKCFGR_I2S2SRC */
  77. #if defined(CEC)
  78. #define IS_LL_RCC_CEC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_CEC_CLKSOURCE))
  79. #endif /* CEC */
  80. #if defined(DSI)
  81. #define IS_LL_RCC_DSI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DSI_CLKSOURCE))
  82. #endif /* DSI */
  83. #if defined(LTDC)
  84. #define IS_LL_RCC_LTDC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LTDC_CLKSOURCE))
  85. #endif /* LTDC */
  86. #if defined(SPDIFRX)
  87. #define IS_LL_RCC_SPDIFRX_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPDIFRX1_CLKSOURCE))
  88. #endif /* SPDIFRX */
  89. /**
  90. * @}
  91. */
  92. /* Private function prototypes -----------------------------------------------*/
  93. /** @defgroup RCC_LL_Private_Functions RCC Private functions
  94. * @{
  95. */
  96. uint32_t RCC_GetSystemClockFreq(void);
  97. uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
  98. uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
  99. uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
  100. uint32_t RCC_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source);
  101. uint32_t RCC_PLL_GetFreqDomain_48M(void);
  102. #if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC)
  103. uint32_t RCC_PLL_GetFreqDomain_I2S(void);
  104. #endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */
  105. #if defined(SPDIFRX)
  106. uint32_t RCC_PLL_GetFreqDomain_SPDIFRX(void);
  107. #endif /* SPDIFRX */
  108. #if defined(RCC_PLLCFGR_PLLR)
  109. #if defined(SAI1)
  110. uint32_t RCC_PLL_GetFreqDomain_SAI(void);
  111. #endif /* SAI1 */
  112. #endif /* RCC_PLLCFGR_PLLR */
  113. #if defined(DSI)
  114. uint32_t RCC_PLL_GetFreqDomain_DSI(void);
  115. #endif /* DSI */
  116. #if defined(RCC_PLLSAI_SUPPORT)
  117. uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void);
  118. #if defined(RCC_PLLSAICFGR_PLLSAIP)
  119. uint32_t RCC_PLLSAI_GetFreqDomain_48M(void);
  120. #endif /* RCC_PLLSAICFGR_PLLSAIP */
  121. #if defined(LTDC)
  122. uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void);
  123. #endif /* LTDC */
  124. #endif /* RCC_PLLSAI_SUPPORT */
  125. #if defined(RCC_PLLI2S_SUPPORT)
  126. uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void);
  127. #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
  128. uint32_t RCC_PLLI2S_GetFreqDomain_48M(void);
  129. #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
  130. #if defined(SAI1)
  131. uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void);
  132. #endif /* SAI1 */
  133. #if defined(SPDIFRX)
  134. uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void);
  135. #endif /* SPDIFRX */
  136. #endif /* RCC_PLLI2S_SUPPORT */
  137. /**
  138. * @}
  139. */
  140. /* Exported functions --------------------------------------------------------*/
  141. /** @addtogroup RCC_LL_Exported_Functions
  142. * @{
  143. */
  144. /** @addtogroup RCC_LL_EF_Init
  145. * @{
  146. */
  147. /**
  148. * @brief Reset the RCC clock configuration to the default reset state.
  149. * @note The default reset state of the clock configuration is given below:
  150. * - HSI ON and used as system clock source
  151. * - HSE and PLL OFF
  152. * - AHB, APB1 and APB2 prescaler set to 1.
  153. * - CSS, MCO OFF
  154. * - All interrupts disabled
  155. * @note This function doesn't modify the configuration of the
  156. * - Peripheral clocks
  157. * - LSI, LSE and RTC clocks
  158. * @retval An ErrorStatus enumeration value:
  159. * - SUCCESS: RCC registers are de-initialized
  160. * - ERROR: not applicable
  161. */
  162. ErrorStatus LL_RCC_DeInit(void)
  163. {
  164. __IO uint32_t vl_mask;
  165. /* Set HSION bit */
  166. LL_RCC_HSI_Enable();
  167. /* Wait for HSI READY bit */
  168. while (LL_RCC_HSI_IsReady() != 1U)
  169. {}
  170. /* Reset CFGR register */
  171. LL_RCC_WriteReg(CFGR, 0x00000000U);
  172. /* Read CR register */
  173. vl_mask = LL_RCC_ReadReg(CR);
  174. /* Reset HSEON, HSEBYP, PLLON, CSSON bits */
  175. CLEAR_BIT(vl_mask,
  176. (RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_PLLON | RCC_CR_CSSON));
  177. #if defined(RCC_PLLSAI_SUPPORT)
  178. /* Reset PLLSAION bit */
  179. CLEAR_BIT(vl_mask, RCC_CR_PLLSAION);
  180. #endif /* RCC_PLLSAI_SUPPORT */
  181. #if defined(RCC_PLLI2S_SUPPORT)
  182. /* Reset PLLI2SON bit */
  183. CLEAR_BIT(vl_mask, RCC_CR_PLLI2SON);
  184. #endif /* RCC_PLLI2S_SUPPORT */
  185. /* Write new value in CR register */
  186. LL_RCC_WriteReg(CR, vl_mask);
  187. /* Set HSITRIM bits to the reset value*/
  188. LL_RCC_HSI_SetCalibTrimming(0x10U);
  189. /* Wait for PLL READY bit to be reset */
  190. while (LL_RCC_PLL_IsReady() != 0U)
  191. {}
  192. /* Reset PLLCFGR register */
  193. LL_RCC_WriteReg(PLLCFGR, RCC_PLLCFGR_RST_VALUE);
  194. #if defined(RCC_PLLI2S_SUPPORT)
  195. /* Reset PLLI2SCFGR register */
  196. LL_RCC_WriteReg(PLLI2SCFGR, RCC_PLLI2SCFGR_RST_VALUE);
  197. #endif /* RCC_PLLI2S_SUPPORT */
  198. #if defined(RCC_PLLSAI_SUPPORT)
  199. /* Reset PLLSAICFGR register */
  200. LL_RCC_WriteReg(PLLSAICFGR, RCC_PLLSAICFGR_RST_VALUE);
  201. #endif /* RCC_PLLSAI_SUPPORT */
  202. /* Disable all interrupts */
  203. CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE | RCC_CIR_LSERDYIE | RCC_CIR_HSIRDYIE | RCC_CIR_HSERDYIE | RCC_CIR_PLLRDYIE);
  204. #if defined(RCC_CIR_PLLI2SRDYIE)
  205. CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE);
  206. #endif /* RCC_CIR_PLLI2SRDYIE */
  207. #if defined(RCC_CIR_PLLSAIRDYIE)
  208. CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE);
  209. #endif /* RCC_CIR_PLLSAIRDYIE */
  210. /* Clear all interrupt flags */
  211. SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC |
  212. RCC_CIR_CSSC);
  213. #if defined(RCC_CIR_PLLI2SRDYC)
  214. SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC);
  215. #endif /* RCC_CIR_PLLI2SRDYC */
  216. #if defined(RCC_CIR_PLLSAIRDYC)
  217. SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC);
  218. #endif /* RCC_CIR_PLLSAIRDYC */
  219. /* Clear LSION bit */
  220. CLEAR_BIT(RCC->CSR, RCC_CSR_LSION);
  221. /* Reset all CSR flags */
  222. SET_BIT(RCC->CSR, RCC_CSR_RMVF);
  223. return SUCCESS;
  224. }
  225. /**
  226. * @}
  227. */
  228. /** @addtogroup RCC_LL_EF_Get_Freq
  229. * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks
  230. * and different peripheral clocks available on the device.
  231. * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(**)
  232. * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(***)
  233. * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(***)
  234. * or HSI_VALUE(**) multiplied/divided by the PLL factors.
  235. * @note (**) HSI_VALUE is a constant defined in this file (default value
  236. * 16 MHz) but the real value may vary depending on the variations
  237. * in voltage and temperature.
  238. * @note (***) HSE_VALUE is a constant defined in this file (default value
  239. * 25 MHz), user has to ensure that HSE_VALUE is same as the real
  240. * frequency of the crystal used. Otherwise, this function may
  241. * have wrong result.
  242. * @note The result of this function could be incorrect when using fractional
  243. * value for HSE crystal.
  244. * @note This function can be used by the user application to compute the
  245. * baud-rate for the communication peripherals or configure other parameters.
  246. * @{
  247. */
  248. /**
  249. * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks
  250. * @note Each time SYSCLK, HCLK, PCLK1 and/or PCLK2 clock changes, this function
  251. * must be called to update structure fields. Otherwise, any
  252. * configuration based on this function will be incorrect.
  253. * @param RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
  254. * @retval None
  255. */
  256. void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks)
  257. {
  258. /* Get SYSCLK frequency */
  259. RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
  260. /* HCLK clock frequency */
  261. RCC_Clocks->HCLK_Frequency = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
  262. /* PCLK1 clock frequency */
  263. RCC_Clocks->PCLK1_Frequency = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
  264. /* PCLK2 clock frequency */
  265. RCC_Clocks->PCLK2_Frequency = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency);
  266. }
  267. #if defined(FMPI2C1)
  268. /**
  269. * @brief Return FMPI2Cx clock frequency
  270. * @param FMPI2CxSource This parameter can be one of the following values:
  271. * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE
  272. * @retval FMPI2C clock frequency (in Hz)
  273. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that HSI oscillator is not ready
  274. */
  275. uint32_t LL_RCC_GetFMPI2CClockFreq(uint32_t FMPI2CxSource)
  276. {
  277. uint32_t FMPI2C_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  278. /* Check parameter */
  279. assert_param(IS_LL_RCC_FMPI2C_CLKSOURCE(FMPI2CxSource));
  280. if (FMPI2CxSource == LL_RCC_FMPI2C1_CLKSOURCE)
  281. {
  282. /* FMPI2C1 CLK clock frequency */
  283. switch (LL_RCC_GetFMPI2CClockSource(FMPI2CxSource))
  284. {
  285. case LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK: /* FMPI2C1 Clock is System Clock */
  286. FMPI2C_frequency = RCC_GetSystemClockFreq();
  287. break;
  288. case LL_RCC_FMPI2C1_CLKSOURCE_HSI: /* FMPI2C1 Clock is HSI Osc. */
  289. if (LL_RCC_HSI_IsReady())
  290. {
  291. FMPI2C_frequency = HSI_VALUE;
  292. }
  293. break;
  294. case LL_RCC_FMPI2C1_CLKSOURCE_PCLK1: /* FMPI2C1 Clock is PCLK1 */
  295. default:
  296. FMPI2C_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  297. break;
  298. }
  299. }
  300. return FMPI2C_frequency;
  301. }
  302. #endif /* FMPI2C1 */
  303. /**
  304. * @brief Return I2Sx clock frequency
  305. * @param I2SxSource This parameter can be one of the following values:
  306. * @arg @ref LL_RCC_I2S1_CLKSOURCE
  307. * @arg @ref LL_RCC_I2S2_CLKSOURCE (*)
  308. *
  309. * (*) value not defined in all devices.
  310. * @retval I2S clock frequency (in Hz)
  311. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  312. */
  313. uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource)
  314. {
  315. uint32_t i2s_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  316. /* Check parameter */
  317. assert_param(IS_LL_RCC_I2S_CLKSOURCE(I2SxSource));
  318. if (I2SxSource == LL_RCC_I2S1_CLKSOURCE)
  319. {
  320. /* I2S1 CLK clock frequency */
  321. switch (LL_RCC_GetI2SClockSource(I2SxSource))
  322. {
  323. #if defined(RCC_PLLI2S_SUPPORT)
  324. case LL_RCC_I2S1_CLKSOURCE_PLLI2S: /* I2S1 Clock is PLLI2S */
  325. if (LL_RCC_PLLI2S_IsReady())
  326. {
  327. i2s_frequency = RCC_PLLI2S_GetFreqDomain_I2S();
  328. }
  329. break;
  330. #endif /* RCC_PLLI2S_SUPPORT */
  331. #if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC)
  332. case LL_RCC_I2S1_CLKSOURCE_PLL: /* I2S1 Clock is PLL */
  333. if (LL_RCC_PLL_IsReady())
  334. {
  335. i2s_frequency = RCC_PLL_GetFreqDomain_I2S();
  336. }
  337. break;
  338. case LL_RCC_I2S1_CLKSOURCE_PLLSRC: /* I2S1 Clock is PLL Main source */
  339. switch (LL_RCC_PLL_GetMainSource())
  340. {
  341. case LL_RCC_PLLSOURCE_HSE: /* I2S1 Clock is HSE Osc. */
  342. if (LL_RCC_HSE_IsReady())
  343. {
  344. i2s_frequency = HSE_VALUE;
  345. }
  346. break;
  347. case LL_RCC_PLLSOURCE_HSI: /* I2S1 Clock is HSI Osc. */
  348. default:
  349. if (LL_RCC_HSI_IsReady())
  350. {
  351. i2s_frequency = HSI_VALUE;
  352. }
  353. break;
  354. }
  355. break;
  356. #endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */
  357. case LL_RCC_I2S1_CLKSOURCE_PIN: /* I2S1 Clock is External clock */
  358. default:
  359. i2s_frequency = EXTERNAL_CLOCK_VALUE;
  360. break;
  361. }
  362. }
  363. #if defined(RCC_DCKCFGR_I2S2SRC)
  364. else
  365. {
  366. /* I2S2 CLK clock frequency */
  367. switch (LL_RCC_GetI2SClockSource(I2SxSource))
  368. {
  369. case LL_RCC_I2S2_CLKSOURCE_PLLI2S: /* I2S2 Clock is PLLI2S */
  370. if (LL_RCC_PLLI2S_IsReady())
  371. {
  372. i2s_frequency = RCC_PLLI2S_GetFreqDomain_I2S();
  373. }
  374. break;
  375. case LL_RCC_I2S2_CLKSOURCE_PLL: /* I2S2 Clock is PLL */
  376. if (LL_RCC_PLL_IsReady())
  377. {
  378. i2s_frequency = RCC_PLL_GetFreqDomain_I2S();
  379. }
  380. break;
  381. case LL_RCC_I2S2_CLKSOURCE_PLLSRC: /* I2S2 Clock is PLL Main source */
  382. switch (LL_RCC_PLL_GetMainSource())
  383. {
  384. case LL_RCC_PLLSOURCE_HSE: /* I2S2 Clock is HSE Osc. */
  385. if (LL_RCC_HSE_IsReady())
  386. {
  387. i2s_frequency = HSE_VALUE;
  388. }
  389. break;
  390. case LL_RCC_PLLSOURCE_HSI: /* I2S2 Clock is HSI Osc. */
  391. default:
  392. if (LL_RCC_HSI_IsReady())
  393. {
  394. i2s_frequency = HSI_VALUE;
  395. }
  396. break;
  397. }
  398. break;
  399. case LL_RCC_I2S2_CLKSOURCE_PIN: /* I2S2 Clock is External clock */
  400. default:
  401. i2s_frequency = EXTERNAL_CLOCK_VALUE;
  402. break;
  403. }
  404. }
  405. #endif /* RCC_DCKCFGR_I2S2SRC */
  406. return i2s_frequency;
  407. }
  408. #if defined(LPTIM1)
  409. /**
  410. * @brief Return LPTIMx clock frequency
  411. * @param LPTIMxSource This parameter can be one of the following values:
  412. * @arg @ref LL_RCC_LPTIM1_CLKSOURCE
  413. * @retval LPTIM clock frequency (in Hz)
  414. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready
  415. */
  416. uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
  417. {
  418. uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  419. /* Check parameter */
  420. assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
  421. if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE)
  422. {
  423. /* LPTIM1CLK clock frequency */
  424. switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
  425. {
  426. case LL_RCC_LPTIM1_CLKSOURCE_LSI: /* LPTIM1 Clock is LSI Osc. */
  427. if (LL_RCC_LSI_IsReady())
  428. {
  429. lptim_frequency = LSI_VALUE;
  430. }
  431. break;
  432. case LL_RCC_LPTIM1_CLKSOURCE_HSI: /* LPTIM1 Clock is HSI Osc. */
  433. if (LL_RCC_HSI_IsReady())
  434. {
  435. lptim_frequency = HSI_VALUE;
  436. }
  437. break;
  438. case LL_RCC_LPTIM1_CLKSOURCE_LSE: /* LPTIM1 Clock is LSE Osc. */
  439. if (LL_RCC_LSE_IsReady())
  440. {
  441. lptim_frequency = LSE_VALUE;
  442. }
  443. break;
  444. case LL_RCC_LPTIM1_CLKSOURCE_PCLK1: /* LPTIM1 Clock is PCLK1 */
  445. default:
  446. lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  447. break;
  448. }
  449. }
  450. return lptim_frequency;
  451. }
  452. #endif /* LPTIM1 */
  453. #if defined(SAI1)
  454. /**
  455. * @brief Return SAIx clock frequency
  456. * @param SAIxSource This parameter can be one of the following values:
  457. * @arg @ref LL_RCC_SAI1_CLKSOURCE (*)
  458. * @arg @ref LL_RCC_SAI2_CLKSOURCE (*)
  459. * @arg @ref LL_RCC_SAI1_A_CLKSOURCE (*)
  460. * @arg @ref LL_RCC_SAI1_B_CLKSOURCE (*)
  461. *
  462. * (*) value not defined in all devices.
  463. * @retval SAI clock frequency (in Hz)
  464. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  465. */
  466. uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
  467. {
  468. uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  469. /* Check parameter */
  470. assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
  471. #if defined(RCC_DCKCFGR_SAI1SRC)
  472. if ((SAIxSource == LL_RCC_SAI1_CLKSOURCE) || (SAIxSource == LL_RCC_SAI2_CLKSOURCE))
  473. {
  474. /* SAI1CLK clock frequency */
  475. switch (LL_RCC_GetSAIClockSource(SAIxSource))
  476. {
  477. case LL_RCC_SAI1_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI1 clock source */
  478. case LL_RCC_SAI2_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI2 clock source */
  479. if (LL_RCC_PLLSAI_IsReady())
  480. {
  481. sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI();
  482. }
  483. break;
  484. case LL_RCC_SAI1_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI1 clock source */
  485. case LL_RCC_SAI2_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI2 clock source */
  486. if (LL_RCC_PLLI2S_IsReady())
  487. {
  488. sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI();
  489. }
  490. break;
  491. case LL_RCC_SAI1_CLKSOURCE_PLL: /* PLL clock used as SAI1 clock source */
  492. case LL_RCC_SAI2_CLKSOURCE_PLL: /* PLL clock used as SAI2 clock source */
  493. if (LL_RCC_PLL_IsReady())
  494. {
  495. sai_frequency = RCC_PLL_GetFreqDomain_SAI();
  496. }
  497. break;
  498. case LL_RCC_SAI2_CLKSOURCE_PLLSRC:
  499. switch (LL_RCC_PLL_GetMainSource())
  500. {
  501. case LL_RCC_PLLSOURCE_HSE: /* HSE clock used as SAI2 clock source */
  502. if (LL_RCC_HSE_IsReady())
  503. {
  504. sai_frequency = HSE_VALUE;
  505. }
  506. break;
  507. case LL_RCC_PLLSOURCE_HSI: /* HSI clock used as SAI2 clock source */
  508. default:
  509. if (LL_RCC_HSI_IsReady())
  510. {
  511. sai_frequency = HSI_VALUE;
  512. }
  513. break;
  514. }
  515. break;
  516. case LL_RCC_SAI1_CLKSOURCE_PIN: /* External input clock used as SAI1 clock source */
  517. default:
  518. sai_frequency = EXTERNAL_CLOCK_VALUE;
  519. break;
  520. }
  521. }
  522. #endif /* RCC_DCKCFGR_SAI1SRC */
  523. #if defined(RCC_DCKCFGR_SAI1ASRC)
  524. if ((SAIxSource == LL_RCC_SAI1_A_CLKSOURCE) || (SAIxSource == LL_RCC_SAI1_B_CLKSOURCE))
  525. {
  526. /* SAI1CLK clock frequency */
  527. switch (LL_RCC_GetSAIClockSource(SAIxSource))
  528. {
  529. #if defined(RCC_PLLSAI_SUPPORT)
  530. case LL_RCC_SAI1_A_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI1 Block A clock source */
  531. case LL_RCC_SAI1_B_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI1 Block B clock source */
  532. if (LL_RCC_PLLSAI_IsReady())
  533. {
  534. sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI();
  535. }
  536. break;
  537. #endif /* RCC_PLLSAI_SUPPORT */
  538. case LL_RCC_SAI1_A_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI1 Block A clock source */
  539. case LL_RCC_SAI1_B_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI1 Block B clock source */
  540. if (LL_RCC_PLLI2S_IsReady())
  541. {
  542. sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI();
  543. }
  544. break;
  545. #if defined(RCC_SAI1A_PLLSOURCE_SUPPORT)
  546. case LL_RCC_SAI1_A_CLKSOURCE_PLL: /* PLL clock used as SAI1 Block A clock source */
  547. case LL_RCC_SAI1_B_CLKSOURCE_PLL: /* PLL clock used as SAI1 Block B clock source */
  548. if (LL_RCC_PLL_IsReady())
  549. {
  550. sai_frequency = RCC_PLL_GetFreqDomain_SAI();
  551. }
  552. break;
  553. case LL_RCC_SAI1_A_CLKSOURCE_PLLSRC:
  554. case LL_RCC_SAI1_B_CLKSOURCE_PLLSRC:
  555. switch (LL_RCC_PLL_GetMainSource())
  556. {
  557. case LL_RCC_PLLSOURCE_HSE: /* HSE clock used as SAI1 Block A or B clock source */
  558. if (LL_RCC_HSE_IsReady())
  559. {
  560. sai_frequency = HSE_VALUE;
  561. }
  562. break;
  563. case LL_RCC_PLLSOURCE_HSI: /* HSI clock used as SAI1 Block A or B clock source */
  564. default:
  565. if (LL_RCC_HSI_IsReady())
  566. {
  567. sai_frequency = HSI_VALUE;
  568. }
  569. break;
  570. }
  571. break;
  572. #endif /* RCC_SAI1A_PLLSOURCE_SUPPORT */
  573. case LL_RCC_SAI1_A_CLKSOURCE_PIN: /* External input clock used as SAI1 Block A clock source */
  574. case LL_RCC_SAI1_B_CLKSOURCE_PIN: /* External input clock used as SAI1 Block B clock source */
  575. default:
  576. sai_frequency = EXTERNAL_CLOCK_VALUE;
  577. break;
  578. }
  579. }
  580. #endif /* RCC_DCKCFGR_SAI1ASRC */
  581. return sai_frequency;
  582. }
  583. #endif /* SAI1 */
  584. #if defined(SDIO)
  585. /**
  586. * @brief Return SDIOx clock frequency
  587. * @param SDIOxSource This parameter can be one of the following values:
  588. * @arg @ref LL_RCC_SDIO_CLKSOURCE
  589. * @retval SDIO clock frequency (in Hz)
  590. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  591. */
  592. uint32_t LL_RCC_GetSDIOClockFreq(uint32_t SDIOxSource)
  593. {
  594. uint32_t SDIO_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  595. /* Check parameter */
  596. assert_param(IS_LL_RCC_SDIO_CLKSOURCE(SDIOxSource));
  597. if (SDIOxSource == LL_RCC_SDIO_CLKSOURCE)
  598. {
  599. #if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL)
  600. /* SDIOCLK clock frequency */
  601. switch (LL_RCC_GetSDIOClockSource(SDIOxSource))
  602. {
  603. case LL_RCC_SDIO_CLKSOURCE_PLL48CLK: /* PLL48M clock used as SDIO clock source */
  604. switch (LL_RCC_GetCK48MClockSource(LL_RCC_CK48M_CLKSOURCE))
  605. {
  606. case LL_RCC_CK48M_CLKSOURCE_PLL: /* PLL clock used as 48Mhz domain clock */
  607. if (LL_RCC_PLL_IsReady())
  608. {
  609. SDIO_frequency = RCC_PLL_GetFreqDomain_48M();
  610. }
  611. break;
  612. #if defined(RCC_PLLSAI_SUPPORT)
  613. case LL_RCC_CK48M_CLKSOURCE_PLLSAI: /* PLLSAI clock used as 48Mhz domain clock */
  614. default:
  615. if (LL_RCC_PLLSAI_IsReady())
  616. {
  617. SDIO_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  618. }
  619. break;
  620. #endif /* RCC_PLLSAI_SUPPORT */
  621. #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
  622. case LL_RCC_CK48M_CLKSOURCE_PLLI2S: /* PLLI2S clock used as 48Mhz domain clock */
  623. default:
  624. if (LL_RCC_PLLI2S_IsReady())
  625. {
  626. SDIO_frequency = RCC_PLLI2S_GetFreqDomain_48M();
  627. }
  628. break;
  629. #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
  630. }
  631. break;
  632. case LL_RCC_SDIO_CLKSOURCE_SYSCLK: /* PLL clock used as SDIO clock source */
  633. default:
  634. SDIO_frequency = RCC_GetSystemClockFreq();
  635. break;
  636. }
  637. #else
  638. /* PLL clock used as 48Mhz domain clock */
  639. if (LL_RCC_PLL_IsReady())
  640. {
  641. SDIO_frequency = RCC_PLL_GetFreqDomain_48M();
  642. }
  643. #endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */
  644. }
  645. return SDIO_frequency;
  646. }
  647. #endif /* SDIO */
  648. #if defined(RNG)
  649. /**
  650. * @brief Return RNGx clock frequency
  651. * @param RNGxSource This parameter can be one of the following values:
  652. * @arg @ref LL_RCC_RNG_CLKSOURCE
  653. * @retval RNG clock frequency (in Hz)
  654. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  655. */
  656. uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
  657. {
  658. uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  659. /* Check parameter */
  660. assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource));
  661. #if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL)
  662. /* RNGCLK clock frequency */
  663. switch (LL_RCC_GetRNGClockSource(RNGxSource))
  664. {
  665. #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
  666. case LL_RCC_RNG_CLKSOURCE_PLLI2S: /* PLLI2S clock used as RNG clock source */
  667. if (LL_RCC_PLLI2S_IsReady())
  668. {
  669. rng_frequency = RCC_PLLI2S_GetFreqDomain_48M();
  670. }
  671. break;
  672. #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
  673. #if defined(RCC_PLLSAI_SUPPORT)
  674. case LL_RCC_RNG_CLKSOURCE_PLLSAI: /* PLLSAI clock used as RNG clock source */
  675. if (LL_RCC_PLLSAI_IsReady())
  676. {
  677. rng_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  678. }
  679. break;
  680. #endif /* RCC_PLLSAI_SUPPORT */
  681. case LL_RCC_RNG_CLKSOURCE_PLL: /* PLL clock used as RNG clock source */
  682. default:
  683. if (LL_RCC_PLL_IsReady())
  684. {
  685. rng_frequency = RCC_PLL_GetFreqDomain_48M();
  686. }
  687. break;
  688. }
  689. #else
  690. /* PLL clock used as RNG clock source */
  691. if (LL_RCC_PLL_IsReady())
  692. {
  693. rng_frequency = RCC_PLL_GetFreqDomain_48M();
  694. }
  695. #endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */
  696. return rng_frequency;
  697. }
  698. #endif /* RNG */
  699. #if defined(CEC)
  700. /**
  701. * @brief Return CEC clock frequency
  702. * @param CECxSource This parameter can be one of the following values:
  703. * @arg @ref LL_RCC_CEC_CLKSOURCE
  704. * @retval CEC clock frequency (in Hz)
  705. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
  706. */
  707. uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource)
  708. {
  709. uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  710. /* Check parameter */
  711. assert_param(IS_LL_RCC_CEC_CLKSOURCE(CECxSource));
  712. /* CECCLK clock frequency */
  713. switch (LL_RCC_GetCECClockSource(CECxSource))
  714. {
  715. case LL_RCC_CEC_CLKSOURCE_LSE: /* CEC Clock is LSE Osc. */
  716. if (LL_RCC_LSE_IsReady())
  717. {
  718. cec_frequency = LSE_VALUE;
  719. }
  720. break;
  721. case LL_RCC_CEC_CLKSOURCE_HSI_DIV488: /* CEC Clock is HSI Osc. */
  722. default:
  723. if (LL_RCC_HSI_IsReady())
  724. {
  725. cec_frequency = HSI_VALUE / 488U;
  726. }
  727. break;
  728. }
  729. return cec_frequency;
  730. }
  731. #endif /* CEC */
  732. #if defined(USB_OTG_FS) || defined(USB_OTG_HS)
  733. /**
  734. * @brief Return USBx clock frequency
  735. * @param USBxSource This parameter can be one of the following values:
  736. * @arg @ref LL_RCC_USB_CLKSOURCE
  737. * @retval USB clock frequency (in Hz)
  738. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  739. */
  740. uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
  741. {
  742. uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  743. /* Check parameter */
  744. assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource));
  745. #if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL)
  746. /* USBCLK clock frequency */
  747. switch (LL_RCC_GetUSBClockSource(USBxSource))
  748. {
  749. #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
  750. case LL_RCC_USB_CLKSOURCE_PLLI2S: /* PLLI2S clock used as USB clock source */
  751. if (LL_RCC_PLLI2S_IsReady())
  752. {
  753. usb_frequency = RCC_PLLI2S_GetFreqDomain_48M();
  754. }
  755. break;
  756. #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
  757. #if defined(RCC_PLLSAI_SUPPORT)
  758. case LL_RCC_USB_CLKSOURCE_PLLSAI: /* PLLSAI clock used as USB clock source */
  759. if (LL_RCC_PLLSAI_IsReady())
  760. {
  761. usb_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  762. }
  763. break;
  764. #endif /* RCC_PLLSAI_SUPPORT */
  765. case LL_RCC_USB_CLKSOURCE_PLL: /* PLL clock used as USB clock source */
  766. default:
  767. if (LL_RCC_PLL_IsReady())
  768. {
  769. usb_frequency = RCC_PLL_GetFreqDomain_48M();
  770. }
  771. break;
  772. }
  773. #else
  774. /* PLL clock used as USB clock source */
  775. if (LL_RCC_PLL_IsReady())
  776. {
  777. usb_frequency = RCC_PLL_GetFreqDomain_48M();
  778. }
  779. #endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */
  780. return usb_frequency;
  781. }
  782. #endif /* USB_OTG_FS || USB_OTG_HS */
  783. #if defined(DFSDM1_Channel0)
  784. /**
  785. * @brief Return DFSDMx clock frequency
  786. * @param DFSDMxSource This parameter can be one of the following values:
  787. * @arg @ref LL_RCC_DFSDM1_CLKSOURCE
  788. * @arg @ref LL_RCC_DFSDM2_CLKSOURCE (*)
  789. *
  790. * (*) value not defined in all devices.
  791. * @retval DFSDM clock frequency (in Hz)
  792. */
  793. uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource)
  794. {
  795. uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  796. /* Check parameter */
  797. assert_param(IS_LL_RCC_DFSDM_CLKSOURCE(DFSDMxSource));
  798. if (DFSDMxSource == LL_RCC_DFSDM1_CLKSOURCE)
  799. {
  800. /* DFSDM1CLK clock frequency */
  801. switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
  802. {
  803. case LL_RCC_DFSDM1_CLKSOURCE_SYSCLK: /* DFSDM1 Clock is SYSCLK */
  804. dfsdm_frequency = RCC_GetSystemClockFreq();
  805. break;
  806. case LL_RCC_DFSDM1_CLKSOURCE_PCLK2: /* DFSDM1 Clock is PCLK2 */
  807. default:
  808. dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  809. break;
  810. }
  811. }
  812. #if defined(DFSDM2_Channel0)
  813. else
  814. {
  815. /* DFSDM2CLK clock frequency */
  816. switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
  817. {
  818. case LL_RCC_DFSDM2_CLKSOURCE_SYSCLK: /* DFSDM2 Clock is SYSCLK */
  819. dfsdm_frequency = RCC_GetSystemClockFreq();
  820. break;
  821. case LL_RCC_DFSDM2_CLKSOURCE_PCLK2: /* DFSDM2 Clock is PCLK2 */
  822. default:
  823. dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  824. break;
  825. }
  826. }
  827. #endif /* DFSDM2_Channel0 */
  828. return dfsdm_frequency;
  829. }
  830. /**
  831. * @brief Return DFSDMx Audio clock frequency
  832. * @param DFSDMxSource This parameter can be one of the following values:
  833. * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE
  834. * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE (*)
  835. *
  836. * (*) value not defined in all devices.
  837. * @retval DFSDM clock frequency (in Hz)
  838. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  839. */
  840. uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource)
  841. {
  842. uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  843. /* Check parameter */
  844. assert_param(IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(DFSDMxSource));
  845. if (DFSDMxSource == LL_RCC_DFSDM1_AUDIO_CLKSOURCE)
  846. {
  847. /* DFSDM1CLK clock frequency */
  848. switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource))
  849. {
  850. case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1: /* I2S1 clock used as DFSDM1 clock */
  851. dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S1_CLKSOURCE);
  852. break;
  853. case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2: /* I2S2 clock used as DFSDM1 clock */
  854. default:
  855. dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S2_CLKSOURCE);
  856. break;
  857. }
  858. }
  859. #if defined(DFSDM2_Channel0)
  860. else
  861. {
  862. /* DFSDM2CLK clock frequency */
  863. switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource))
  864. {
  865. case LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1: /* I2S1 clock used as DFSDM2 clock */
  866. dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S1_CLKSOURCE);
  867. break;
  868. case LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2: /* I2S2 clock used as DFSDM2 clock */
  869. default:
  870. dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S2_CLKSOURCE);
  871. break;
  872. }
  873. }
  874. #endif /* DFSDM2_Channel0 */
  875. return dfsdm_frequency;
  876. }
  877. #endif /* DFSDM1_Channel0 */
  878. #if defined(DSI)
  879. /**
  880. * @brief Return DSI clock frequency
  881. * @param DSIxSource This parameter can be one of the following values:
  882. * @arg @ref LL_RCC_DSI_CLKSOURCE
  883. * @retval DSI clock frequency (in Hz)
  884. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  885. * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used
  886. */
  887. uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource)
  888. {
  889. uint32_t dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  890. /* Check parameter */
  891. assert_param(IS_LL_RCC_DSI_CLKSOURCE(DSIxSource));
  892. /* DSICLK clock frequency */
  893. switch (LL_RCC_GetDSIClockSource(DSIxSource))
  894. {
  895. case LL_RCC_DSI_CLKSOURCE_PLL: /* DSI Clock is PLL Osc. */
  896. if (LL_RCC_PLL_IsReady())
  897. {
  898. dsi_frequency = RCC_PLL_GetFreqDomain_DSI();
  899. }
  900. break;
  901. case LL_RCC_DSI_CLKSOURCE_PHY: /* DSI Clock is DSI physical clock. */
  902. default:
  903. dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  904. break;
  905. }
  906. return dsi_frequency;
  907. }
  908. #endif /* DSI */
  909. #if defined(LTDC)
  910. /**
  911. * @brief Return LTDC clock frequency
  912. * @param LTDCxSource This parameter can be one of the following values:
  913. * @arg @ref LL_RCC_LTDC_CLKSOURCE
  914. * @retval LTDC clock frequency (in Hz)
  915. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator PLLSAI is not ready
  916. */
  917. uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource)
  918. {
  919. uint32_t ltdc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  920. /* Check parameter */
  921. assert_param(IS_LL_RCC_LTDC_CLKSOURCE(LTDCxSource));
  922. if (LL_RCC_PLLSAI_IsReady())
  923. {
  924. ltdc_frequency = RCC_PLLSAI_GetFreqDomain_LTDC();
  925. }
  926. return ltdc_frequency;
  927. }
  928. #endif /* LTDC */
  929. #if defined(SPDIFRX)
  930. /**
  931. * @brief Return SPDIFRX clock frequency
  932. * @param SPDIFRXxSource This parameter can be one of the following values:
  933. * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE
  934. * @retval SPDIFRX clock frequency (in Hz)
  935. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  936. */
  937. uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource)
  938. {
  939. uint32_t spdifrx_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  940. /* Check parameter */
  941. assert_param(IS_LL_RCC_SPDIFRX_CLKSOURCE(SPDIFRXxSource));
  942. /* SPDIFRX1CLK clock frequency */
  943. switch (LL_RCC_GetSPDIFRXClockSource(SPDIFRXxSource))
  944. {
  945. case LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S: /* SPDIFRX Clock is PLLI2S Osc. */
  946. if (LL_RCC_PLLI2S_IsReady())
  947. {
  948. spdifrx_frequency = RCC_PLLI2S_GetFreqDomain_SPDIFRX();
  949. }
  950. break;
  951. case LL_RCC_SPDIFRX1_CLKSOURCE_PLL: /* SPDIFRX Clock is PLL Osc. */
  952. default:
  953. if (LL_RCC_PLL_IsReady())
  954. {
  955. spdifrx_frequency = RCC_PLL_GetFreqDomain_SPDIFRX();
  956. }
  957. break;
  958. }
  959. return spdifrx_frequency;
  960. }
  961. #endif /* SPDIFRX */
  962. /**
  963. * @}
  964. */
  965. /**
  966. * @}
  967. */
  968. /** @addtogroup RCC_LL_Private_Functions
  969. * @{
  970. */
  971. /**
  972. * @brief Return SYSTEM clock frequency
  973. * @retval SYSTEM clock frequency (in Hz)
  974. */
  975. uint32_t RCC_GetSystemClockFreq(void)
  976. {
  977. uint32_t frequency = 0U;
  978. /* Get SYSCLK source -------------------------------------------------------*/
  979. switch (LL_RCC_GetSysClkSource())
  980. {
  981. case LL_RCC_SYS_CLKSOURCE_STATUS_HSI: /* HSI used as system clock source */
  982. frequency = HSI_VALUE;
  983. break;
  984. case LL_RCC_SYS_CLKSOURCE_STATUS_HSE: /* HSE used as system clock source */
  985. frequency = HSE_VALUE;
  986. break;
  987. case LL_RCC_SYS_CLKSOURCE_STATUS_PLL: /* PLL used as system clock source */
  988. frequency = RCC_PLL_GetFreqDomain_SYS(LL_RCC_SYS_CLKSOURCE_STATUS_PLL);
  989. break;
  990. #if defined(RCC_PLLR_SYSCLK_SUPPORT)
  991. case LL_RCC_SYS_CLKSOURCE_STATUS_PLLR: /* PLLR used as system clock source */
  992. frequency = RCC_PLL_GetFreqDomain_SYS(LL_RCC_SYS_CLKSOURCE_STATUS_PLLR);
  993. break;
  994. #endif /* RCC_PLLR_SYSCLK_SUPPORT */
  995. default:
  996. frequency = HSI_VALUE;
  997. break;
  998. }
  999. return frequency;
  1000. }
  1001. /**
  1002. * @brief Return HCLK clock frequency
  1003. * @param SYSCLK_Frequency SYSCLK clock frequency
  1004. * @retval HCLK clock frequency (in Hz)
  1005. */
  1006. uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
  1007. {
  1008. /* HCLK clock frequency */
  1009. return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
  1010. }
  1011. /**
  1012. * @brief Return PCLK1 clock frequency
  1013. * @param HCLK_Frequency HCLK clock frequency
  1014. * @retval PCLK1 clock frequency (in Hz)
  1015. */
  1016. uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
  1017. {
  1018. /* PCLK1 clock frequency */
  1019. return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
  1020. }
  1021. /**
  1022. * @brief Return PCLK2 clock frequency
  1023. * @param HCLK_Frequency HCLK clock frequency
  1024. * @retval PCLK2 clock frequency (in Hz)
  1025. */
  1026. uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
  1027. {
  1028. /* PCLK2 clock frequency */
  1029. return __LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
  1030. }
  1031. /**
  1032. * @brief Return PLL clock frequency used for system domain
  1033. * @param SYSCLK_Source System clock source
  1034. * @retval PLL clock frequency (in Hz)
  1035. */
  1036. uint32_t RCC_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source)
  1037. {
  1038. uint32_t pllinputfreq = 0U;
  1039. uint32_t pllsource = 0U;
  1040. uint32_t plloutputfreq = 0U;
  1041. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1042. SYSCLK = PLL_VCO / (PLLP or PLLR)
  1043. */
  1044. pllsource = LL_RCC_PLL_GetMainSource();
  1045. switch (pllsource)
  1046. {
  1047. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1048. pllinputfreq = HSI_VALUE;
  1049. break;
  1050. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1051. pllinputfreq = HSE_VALUE;
  1052. break;
  1053. default:
  1054. pllinputfreq = HSI_VALUE;
  1055. break;
  1056. }
  1057. if (SYSCLK_Source == LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
  1058. {
  1059. plloutputfreq = __LL_RCC_CALC_PLLCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1060. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP());
  1061. }
  1062. #if defined(RCC_PLLR_SYSCLK_SUPPORT)
  1063. else
  1064. {
  1065. plloutputfreq = __LL_RCC_CALC_PLLRCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1066. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  1067. }
  1068. #endif /* RCC_PLLR_SYSCLK_SUPPORT */
  1069. return plloutputfreq;
  1070. }
  1071. /**
  1072. * @brief Return PLL clock frequency used for 48 MHz domain
  1073. * @retval PLL clock frequency (in Hz)
  1074. */
  1075. uint32_t RCC_PLL_GetFreqDomain_48M(void)
  1076. {
  1077. uint32_t pllinputfreq = 0U;
  1078. uint32_t pllsource = 0U;
  1079. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN
  1080. 48M Domain clock = PLL_VCO / PLLQ
  1081. */
  1082. pllsource = LL_RCC_PLL_GetMainSource();
  1083. switch (pllsource)
  1084. {
  1085. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1086. pllinputfreq = HSI_VALUE;
  1087. break;
  1088. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1089. pllinputfreq = HSE_VALUE;
  1090. break;
  1091. default:
  1092. pllinputfreq = HSI_VALUE;
  1093. break;
  1094. }
  1095. return __LL_RCC_CALC_PLLCLK_48M_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1096. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
  1097. }
  1098. #if defined(DSI)
  1099. /**
  1100. * @brief Return PLL clock frequency used for DSI clock
  1101. * @retval PLL clock frequency (in Hz)
  1102. */
  1103. uint32_t RCC_PLL_GetFreqDomain_DSI(void)
  1104. {
  1105. uint32_t pllinputfreq = 0U;
  1106. uint32_t pllsource = 0U;
  1107. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1108. DSICLK = PLL_VCO / PLLR
  1109. */
  1110. pllsource = LL_RCC_PLL_GetMainSource();
  1111. switch (pllsource)
  1112. {
  1113. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1114. pllinputfreq = HSE_VALUE;
  1115. break;
  1116. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1117. default:
  1118. pllinputfreq = HSI_VALUE;
  1119. break;
  1120. }
  1121. return __LL_RCC_CALC_PLLCLK_DSI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1122. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  1123. }
  1124. #endif /* DSI */
  1125. #if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC)
  1126. /**
  1127. * @brief Return PLL clock frequency used for I2S clock
  1128. * @retval PLL clock frequency (in Hz)
  1129. */
  1130. uint32_t RCC_PLL_GetFreqDomain_I2S(void)
  1131. {
  1132. uint32_t pllinputfreq = 0U;
  1133. uint32_t pllsource = 0U;
  1134. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1135. I2SCLK = PLL_VCO / PLLR
  1136. */
  1137. pllsource = LL_RCC_PLL_GetMainSource();
  1138. switch (pllsource)
  1139. {
  1140. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1141. pllinputfreq = HSE_VALUE;
  1142. break;
  1143. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1144. default:
  1145. pllinputfreq = HSI_VALUE;
  1146. break;
  1147. }
  1148. return __LL_RCC_CALC_PLLCLK_I2S_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1149. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  1150. }
  1151. #endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */
  1152. #if defined(SPDIFRX)
  1153. /**
  1154. * @brief Return PLL clock frequency used for SPDIFRX clock
  1155. * @retval PLL clock frequency (in Hz)
  1156. */
  1157. uint32_t RCC_PLL_GetFreqDomain_SPDIFRX(void)
  1158. {
  1159. uint32_t pllinputfreq = 0U;
  1160. uint32_t pllsource = 0U;
  1161. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1162. SPDIFRXCLK = PLL_VCO / PLLR
  1163. */
  1164. pllsource = LL_RCC_PLL_GetMainSource();
  1165. switch (pllsource)
  1166. {
  1167. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1168. pllinputfreq = HSE_VALUE;
  1169. break;
  1170. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1171. default:
  1172. pllinputfreq = HSI_VALUE;
  1173. break;
  1174. }
  1175. return __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1176. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  1177. }
  1178. #endif /* SPDIFRX */
  1179. #if defined(RCC_PLLCFGR_PLLR)
  1180. #if defined(SAI1)
  1181. /**
  1182. * @brief Return PLL clock frequency used for SAI clock
  1183. * @retval PLL clock frequency (in Hz)
  1184. */
  1185. uint32_t RCC_PLL_GetFreqDomain_SAI(void)
  1186. {
  1187. uint32_t pllinputfreq = 0U;
  1188. uint32_t pllsource = 0U;
  1189. uint32_t plloutputfreq = 0U;
  1190. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1191. SAICLK = (PLL_VCO / PLLR) / PLLDIVR
  1192. or
  1193. SAICLK = PLL_VCO / PLLR
  1194. */
  1195. pllsource = LL_RCC_PLL_GetMainSource();
  1196. switch (pllsource)
  1197. {
  1198. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1199. pllinputfreq = HSE_VALUE;
  1200. break;
  1201. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1202. default:
  1203. pllinputfreq = HSI_VALUE;
  1204. break;
  1205. }
  1206. #if defined(RCC_DCKCFGR_PLLDIVR)
  1207. plloutputfreq = __LL_RCC_CALC_PLLCLK_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1208. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR(), LL_RCC_PLL_GetDIVR());
  1209. #else
  1210. plloutputfreq = __LL_RCC_CALC_PLLCLK_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1211. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  1212. #endif /* RCC_DCKCFGR_PLLDIVR */
  1213. return plloutputfreq;
  1214. }
  1215. #endif /* SAI1 */
  1216. #endif /* RCC_PLLCFGR_PLLR */
  1217. #if defined(RCC_PLLSAI_SUPPORT)
  1218. /**
  1219. * @brief Return PLLSAI clock frequency used for SAI domain
  1220. * @retval PLLSAI clock frequency (in Hz)
  1221. */
  1222. uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void)
  1223. {
  1224. uint32_t pllinputfreq = 0U;
  1225. uint32_t pllsource = 0U;
  1226. /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN
  1227. SAI domain clock = (PLLSAI_VCO / PLLSAIQ) / PLLSAIDIVQ
  1228. */
  1229. pllsource = LL_RCC_PLL_GetMainSource();
  1230. switch (pllsource)
  1231. {
  1232. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */
  1233. pllinputfreq = HSI_VALUE;
  1234. break;
  1235. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */
  1236. pllinputfreq = HSE_VALUE;
  1237. break;
  1238. default:
  1239. pllinputfreq = HSI_VALUE;
  1240. break;
  1241. }
  1242. return __LL_RCC_CALC_PLLSAI_SAI_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(),
  1243. LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetQ(), LL_RCC_PLLSAI_GetDIVQ());
  1244. }
  1245. #if defined(RCC_PLLSAICFGR_PLLSAIP)
  1246. /**
  1247. * @brief Return PLLSAI clock frequency used for 48Mhz domain
  1248. * @retval PLLSAI clock frequency (in Hz)
  1249. */
  1250. uint32_t RCC_PLLSAI_GetFreqDomain_48M(void)
  1251. {
  1252. uint32_t pllinputfreq = 0U;
  1253. uint32_t pllsource = 0U;
  1254. /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN
  1255. 48M Domain clock = PLLSAI_VCO / PLLSAIP
  1256. */
  1257. pllsource = LL_RCC_PLL_GetMainSource();
  1258. switch (pllsource)
  1259. {
  1260. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */
  1261. pllinputfreq = HSI_VALUE;
  1262. break;
  1263. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */
  1264. pllinputfreq = HSE_VALUE;
  1265. break;
  1266. default:
  1267. pllinputfreq = HSI_VALUE;
  1268. break;
  1269. }
  1270. return __LL_RCC_CALC_PLLSAI_48M_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(),
  1271. LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetP());
  1272. }
  1273. #endif /* RCC_PLLSAICFGR_PLLSAIP */
  1274. #if defined(LTDC)
  1275. /**
  1276. * @brief Return PLLSAI clock frequency used for LTDC domain
  1277. * @retval PLLSAI clock frequency (in Hz)
  1278. */
  1279. uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void)
  1280. {
  1281. uint32_t pllinputfreq = 0U;
  1282. uint32_t pllsource = 0U;
  1283. /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN
  1284. LTDC Domain clock = (PLLSAI_VCO / PLLSAIR) / PLLSAIDIVR
  1285. */
  1286. pllsource = LL_RCC_PLL_GetMainSource();
  1287. switch (pllsource)
  1288. {
  1289. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */
  1290. pllinputfreq = HSI_VALUE;
  1291. break;
  1292. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */
  1293. pllinputfreq = HSE_VALUE;
  1294. break;
  1295. default:
  1296. pllinputfreq = HSI_VALUE;
  1297. break;
  1298. }
  1299. return __LL_RCC_CALC_PLLSAI_LTDC_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(),
  1300. LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetR(), LL_RCC_PLLSAI_GetDIVR());
  1301. }
  1302. #endif /* LTDC */
  1303. #endif /* RCC_PLLSAI_SUPPORT */
  1304. #if defined(RCC_PLLI2S_SUPPORT)
  1305. #if defined(SAI1)
  1306. /**
  1307. * @brief Return PLLI2S clock frequency used for SAI domains
  1308. * @retval PLLI2S clock frequency (in Hz)
  1309. */
  1310. uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void)
  1311. {
  1312. uint32_t plli2sinputfreq = 0;
  1313. uint32_t plli2ssource = 0U;
  1314. uint32_t plli2soutputfreq = 0U;
  1315. /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
  1316. SAI domain clock = (PLLI2S_VCO / PLLI2SQ) / PLLI2SDIVQ
  1317. or
  1318. SAI domain clock = (PLLI2S_VCO / PLLI2SR) / PLLI2SDIVR
  1319. */
  1320. plli2ssource = LL_RCC_PLLI2S_GetMainSource();
  1321. switch (plli2ssource)
  1322. {
  1323. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1324. plli2sinputfreq = HSE_VALUE;
  1325. break;
  1326. #if defined(RCC_PLLI2SCFGR_PLLI2SSRC)
  1327. case LL_RCC_PLLI2SSOURCE_PIN: /* External pin input clock used as PLLI2S clock source */
  1328. plli2sinputfreq = EXTERNAL_CLOCK_VALUE;
  1329. break;
  1330. #endif /* RCC_PLLI2SCFGR_PLLI2SSRC */
  1331. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1332. default:
  1333. plli2sinputfreq = HSI_VALUE;
  1334. break;
  1335. }
  1336. #if defined(RCC_DCKCFGR_PLLI2SDIVQ)
  1337. plli2soutputfreq = __LL_RCC_CALC_PLLI2S_SAI_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
  1338. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetQ(), LL_RCC_PLLI2S_GetDIVQ());
  1339. #else
  1340. plli2soutputfreq = __LL_RCC_CALC_PLLI2S_SAI_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
  1341. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetR(), LL_RCC_PLLI2S_GetDIVR());
  1342. #endif /* RCC_DCKCFGR_PLLI2SDIVQ */
  1343. return plli2soutputfreq;
  1344. }
  1345. #endif /* SAI1 */
  1346. #if defined(SPDIFRX)
  1347. /**
  1348. * @brief Return PLLI2S clock frequency used for SPDIFRX domain
  1349. * @retval PLLI2S clock frequency (in Hz)
  1350. */
  1351. uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void)
  1352. {
  1353. uint32_t pllinputfreq = 0U;
  1354. uint32_t pllsource = 0U;
  1355. /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
  1356. SPDIFRX Domain clock = PLLI2S_VCO / PLLI2SP
  1357. */
  1358. pllsource = LL_RCC_PLLI2S_GetMainSource();
  1359. switch (pllsource)
  1360. {
  1361. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1362. pllinputfreq = HSE_VALUE;
  1363. break;
  1364. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1365. default:
  1366. pllinputfreq = HSI_VALUE;
  1367. break;
  1368. }
  1369. return __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(pllinputfreq, LL_RCC_PLLI2S_GetDivider(),
  1370. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetP());
  1371. }
  1372. #endif /* SPDIFRX */
  1373. /**
  1374. * @brief Return PLLI2S clock frequency used for I2S domain
  1375. * @retval PLLI2S clock frequency (in Hz)
  1376. */
  1377. uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void)
  1378. {
  1379. uint32_t plli2sinputfreq = 0U;
  1380. uint32_t plli2ssource = 0U;
  1381. uint32_t plli2soutputfreq = 0U;
  1382. /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
  1383. I2S Domain clock = PLLI2S_VCO / PLLI2SR
  1384. */
  1385. plli2ssource = LL_RCC_PLLI2S_GetMainSource();
  1386. switch (plli2ssource)
  1387. {
  1388. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1389. plli2sinputfreq = HSE_VALUE;
  1390. break;
  1391. #if defined(RCC_PLLI2SCFGR_PLLI2SSRC)
  1392. case LL_RCC_PLLI2SSOURCE_PIN: /* External pin input clock used as PLLI2S clock source */
  1393. plli2sinputfreq = EXTERNAL_CLOCK_VALUE;
  1394. break;
  1395. #endif /* RCC_PLLI2SCFGR_PLLI2SSRC */
  1396. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1397. default:
  1398. plli2sinputfreq = HSI_VALUE;
  1399. break;
  1400. }
  1401. plli2soutputfreq = __LL_RCC_CALC_PLLI2S_I2S_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
  1402. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetR());
  1403. return plli2soutputfreq;
  1404. }
  1405. #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
  1406. /**
  1407. * @brief Return PLLI2S clock frequency used for 48Mhz domain
  1408. * @retval PLLI2S clock frequency (in Hz)
  1409. */
  1410. uint32_t RCC_PLLI2S_GetFreqDomain_48M(void)
  1411. {
  1412. uint32_t plli2sinputfreq = 0U;
  1413. uint32_t plli2ssource = 0U;
  1414. uint32_t plli2soutputfreq = 0U;
  1415. /* PLL48M_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
  1416. 48M Domain clock = PLLI2S_VCO / PLLI2SQ
  1417. */
  1418. plli2ssource = LL_RCC_PLLI2S_GetMainSource();
  1419. switch (plli2ssource)
  1420. {
  1421. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1422. plli2sinputfreq = HSE_VALUE;
  1423. break;
  1424. #if defined(RCC_PLLI2SCFGR_PLLI2SSRC)
  1425. case LL_RCC_PLLI2SSOURCE_PIN: /* External pin input clock used as PLLI2S clock source */
  1426. plli2sinputfreq = EXTERNAL_CLOCK_VALUE;
  1427. break;
  1428. #endif /* RCC_PLLI2SCFGR_PLLI2SSRC */
  1429. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1430. default:
  1431. plli2sinputfreq = HSI_VALUE;
  1432. break;
  1433. }
  1434. plli2soutputfreq = __LL_RCC_CALC_PLLI2S_48M_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
  1435. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetQ());
  1436. return plli2soutputfreq;
  1437. }
  1438. #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
  1439. #endif /* RCC_PLLI2S_SUPPORT */
  1440. /**
  1441. * @}
  1442. */
  1443. /**
  1444. * @}
  1445. */
  1446. #endif /* defined(RCC) */
  1447. /**
  1448. * @}
  1449. */
  1450. #endif /* USE_FULL_LL_DRIVER */