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.
 
 
 

1650 lines
50 KiB

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