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.
 
 
 

1582 lines
47 KiB

  1. /**
  2. ******************************************************************************
  3. * @file stm32f7xx_ll_rcc.c
  4. * @author MCD Application Team
  5. * @version V1.2.2
  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 "stm32f7xx_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 STM32F7xx_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. #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
  60. || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \
  61. || ((__VALUE__) == LL_RCC_USART3_CLKSOURCE) \
  62. || ((__VALUE__) == LL_RCC_USART6_CLKSOURCE))
  63. #define IS_LL_RCC_UART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_UART4_CLKSOURCE) \
  64. || ((__VALUE__) == LL_RCC_UART5_CLKSOURCE) \
  65. || ((__VALUE__) == LL_RCC_UART7_CLKSOURCE) \
  66. || ((__VALUE__) == LL_RCC_UART8_CLKSOURCE))
  67. #if defined(I2C4)
  68. #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
  69. || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
  70. || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE) \
  71. || ((__VALUE__) == LL_RCC_I2C4_CLKSOURCE))
  72. #else
  73. #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
  74. || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
  75. || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE))
  76. #endif /* I2C4 */
  77. #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE))
  78. #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
  79. || ((__VALUE__) == LL_RCC_SAI2_CLKSOURCE))
  80. #if defined(SDMMC2)
  81. #define IS_LL_RCC_SDMMC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SDMMC1_CLKSOURCE) \
  82. || ((__VALUE__) == LL_RCC_SDMMC2_CLKSOURCE))
  83. #else
  84. #define IS_LL_RCC_SDMMC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SDMMC1_CLKSOURCE))
  85. #endif /* SDMMC2 */
  86. #define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_RNG_CLKSOURCE))
  87. #define IS_LL_RCC_USB_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USB_CLKSOURCE))
  88. #if defined(DFSDM1_Channel0)
  89. #define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE))
  90. #define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE))
  91. #endif /* DFSDM1_Channel0 */
  92. #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE))
  93. #if defined(CEC)
  94. #define IS_LL_RCC_CEC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_CEC_CLKSOURCE))
  95. #endif /* CEC */
  96. #if defined(DSI)
  97. #define IS_LL_RCC_DSI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DSI_CLKSOURCE))
  98. #endif /* DSI */
  99. #if defined(LTDC)
  100. #define IS_LL_RCC_LTDC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LTDC_CLKSOURCE))
  101. #endif /* LTDC */
  102. #if defined(SPDIFRX)
  103. #define IS_LL_RCC_SPDIFRX_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPDIFRX1_CLKSOURCE))
  104. #endif /* SPDIFRX */
  105. /**
  106. * @}
  107. */
  108. /* Private function prototypes -----------------------------------------------*/
  109. /** @defgroup RCC_LL_Private_Functions RCC Private functions
  110. * @{
  111. */
  112. uint32_t RCC_GetSystemClockFreq(void);
  113. uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
  114. uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
  115. uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
  116. uint32_t RCC_PLL_GetFreqDomain_SYS(void);
  117. uint32_t RCC_PLL_GetFreqDomain_SAI(void);
  118. uint32_t RCC_PLL_GetFreqDomain_48M(void);
  119. #if defined(DSI)
  120. uint32_t RCC_PLL_GetFreqDomain_DSI(void);
  121. #endif /* DSI */
  122. uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void);
  123. uint32_t RCC_PLLSAI_GetFreqDomain_48M(void);
  124. #if defined(LTDC)
  125. uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void);
  126. #endif /* LTDC */
  127. uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void);
  128. uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void);
  129. #if defined(SPDIFRX)
  130. uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void);
  131. #endif /* SPDIFRX */
  132. /**
  133. * @}
  134. */
  135. /* Exported functions --------------------------------------------------------*/
  136. /** @addtogroup RCC_LL_Exported_Functions
  137. * @{
  138. */
  139. /** @addtogroup RCC_LL_EF_Init
  140. * @{
  141. */
  142. /**
  143. * @brief Reset the RCC clock configuration to the default reset state.
  144. * @note The default reset state of the clock configuration is given below:
  145. * - HSI ON and used as system clock source
  146. * - HSE and PLL OFF
  147. * - AHB, APB1 and APB2 prescaler set to 1.
  148. * - CSS, MCO OFF
  149. * - All interrupts disabled
  150. * @note This function doesn't modify the configuration of the
  151. * - Peripheral clocks
  152. * - LSI, LSE and RTC clocks
  153. * @retval An ErrorStatus enumeration value:
  154. * - SUCCESS: RCC registers are de-initialized
  155. * - ERROR: not applicable
  156. */
  157. ErrorStatus LL_RCC_DeInit(void)
  158. {
  159. uint32_t vl_mask = 0U;
  160. /* Set HSION bit */
  161. LL_RCC_HSI_Enable();
  162. /* Reset CFGR register */
  163. LL_RCC_WriteReg(CFGR, 0x00000000U);
  164. vl_mask = 0xFFFFFFFFU;
  165. /* Reset HSEON, PLLSYSON bits */
  166. CLEAR_BIT(vl_mask, (RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_PLLON | RCC_CR_CSSON));
  167. /* Reset PLLSAION bit */
  168. CLEAR_BIT(vl_mask, RCC_CR_PLLSAION);
  169. /* Reset PLLI2SON bit */
  170. CLEAR_BIT(vl_mask, RCC_CR_PLLI2SON);
  171. /* Write new mask in CR register */
  172. LL_RCC_WriteReg(CR, vl_mask);
  173. /* Set HSITRIM bits to the reset value*/
  174. LL_RCC_HSI_SetCalibTrimming(0x10U);
  175. /* Reset PLLCFGR register */
  176. LL_RCC_WriteReg(PLLCFGR, 0x24003010U);
  177. /* Reset PLLI2SCFGR register */
  178. LL_RCC_WriteReg(PLLI2SCFGR, 0x24003000U);
  179. /* Reset PLLSAICFGR register */
  180. LL_RCC_WriteReg(PLLSAICFGR, 0x24003000U);
  181. /* Reset HSEBYP bit */
  182. LL_RCC_HSE_DisableBypass();
  183. /* Disable all interrupts */
  184. LL_RCC_WriteReg(CIR, 0x00000000U);
  185. return SUCCESS;
  186. }
  187. /**
  188. * @}
  189. */
  190. /** @addtogroup RCC_LL_EF_Get_Freq
  191. * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks
  192. * and different peripheral clocks available on the device.
  193. * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(**)
  194. * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(***)
  195. * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(***)
  196. * or HSI_VALUE(**) multiplied/divided by the PLL factors.
  197. * @note (**) HSI_VALUE is a constant defined in this file (default value
  198. * 16 MHz) but the real value may vary depending on the variations
  199. * in voltage and temperature.
  200. * @note (***) HSE_VALUE is a constant defined in this file (default value
  201. * 25 MHz), user has to ensure that HSE_VALUE is same as the real
  202. * frequency of the crystal used. Otherwise, this function may
  203. * have wrong result.
  204. * @note The result of this function could be incorrect when using fractional
  205. * value for HSE crystal.
  206. * @note This function can be used by the user application to compute the
  207. * baud-rate for the communication peripherals or configure other parameters.
  208. * @{
  209. */
  210. /**
  211. * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks
  212. * @note Each time SYSCLK, HCLK, PCLK1 and/or PCLK2 clock changes, this function
  213. * must be called to update structure fields. Otherwise, any
  214. * configuration based on this function will be incorrect.
  215. * @param RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
  216. * @retval None
  217. */
  218. void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks)
  219. {
  220. /* Get SYSCLK frequency */
  221. RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
  222. /* HCLK clock frequency */
  223. RCC_Clocks->HCLK_Frequency = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
  224. /* PCLK1 clock frequency */
  225. RCC_Clocks->PCLK1_Frequency = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
  226. /* PCLK2 clock frequency */
  227. RCC_Clocks->PCLK2_Frequency = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency);
  228. }
  229. /**
  230. * @brief Return USARTx clock frequency
  231. * @param USARTxSource This parameter can be one of the following values:
  232. * @arg @ref LL_RCC_USART1_CLKSOURCE
  233. * @arg @ref LL_RCC_USART2_CLKSOURCE
  234. * @arg @ref LL_RCC_USART3_CLKSOURCE
  235. * @arg @ref LL_RCC_USART6_CLKSOURCE
  236. * @retval USART clock frequency (in Hz)
  237. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
  238. */
  239. uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)
  240. {
  241. uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  242. /* Check parameter */
  243. assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource));
  244. if (USARTxSource == LL_RCC_USART1_CLKSOURCE)
  245. {
  246. /* USART1CLK clock frequency */
  247. switch (LL_RCC_GetUSARTClockSource(USARTxSource))
  248. {
  249. case LL_RCC_USART1_CLKSOURCE_SYSCLK: /* USART1 Clock is System Clock */
  250. usart_frequency = RCC_GetSystemClockFreq();
  251. break;
  252. case LL_RCC_USART1_CLKSOURCE_HSI: /* USART1 Clock is HSI Osc. */
  253. if (LL_RCC_HSI_IsReady())
  254. {
  255. usart_frequency = HSI_VALUE;
  256. }
  257. break;
  258. case LL_RCC_USART1_CLKSOURCE_LSE: /* USART1 Clock is LSE Osc. */
  259. if (LL_RCC_LSE_IsReady())
  260. {
  261. usart_frequency = LSE_VALUE;
  262. }
  263. break;
  264. case LL_RCC_USART1_CLKSOURCE_PCLK2: /* USART1 Clock is PCLK2 */
  265. default:
  266. usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  267. break;
  268. }
  269. }
  270. else if (USARTxSource == LL_RCC_USART2_CLKSOURCE)
  271. {
  272. /* USART2CLK clock frequency */
  273. switch (LL_RCC_GetUSARTClockSource(USARTxSource))
  274. {
  275. case LL_RCC_USART2_CLKSOURCE_SYSCLK: /* USART2 Clock is System Clock */
  276. usart_frequency = RCC_GetSystemClockFreq();
  277. break;
  278. case LL_RCC_USART2_CLKSOURCE_HSI: /* USART2 Clock is HSI Osc. */
  279. if (LL_RCC_HSI_IsReady())
  280. {
  281. usart_frequency = HSI_VALUE;
  282. }
  283. break;
  284. case LL_RCC_USART2_CLKSOURCE_LSE: /* USART2 Clock is LSE Osc. */
  285. if (LL_RCC_LSE_IsReady())
  286. {
  287. usart_frequency = LSE_VALUE;
  288. }
  289. break;
  290. case LL_RCC_USART2_CLKSOURCE_PCLK1: /* USART2 Clock is PCLK1 */
  291. default:
  292. usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  293. break;
  294. }
  295. }
  296. else if (USARTxSource == LL_RCC_USART6_CLKSOURCE)
  297. {
  298. /* USART6CLK clock frequency */
  299. switch (LL_RCC_GetUSARTClockSource(USARTxSource))
  300. {
  301. case LL_RCC_USART6_CLKSOURCE_SYSCLK: /* USART6 Clock is System Clock */
  302. usart_frequency = RCC_GetSystemClockFreq();
  303. break;
  304. case LL_RCC_USART6_CLKSOURCE_HSI: /* USART6 Clock is HSI Osc. */
  305. if (LL_RCC_HSI_IsReady())
  306. {
  307. usart_frequency = HSI_VALUE;
  308. }
  309. break;
  310. case LL_RCC_USART6_CLKSOURCE_LSE: /* USART6 Clock is LSE Osc. */
  311. if (LL_RCC_LSE_IsReady())
  312. {
  313. usart_frequency = LSE_VALUE;
  314. }
  315. break;
  316. case LL_RCC_USART6_CLKSOURCE_PCLK2: /* USART6 Clock is PCLK2 */
  317. default:
  318. usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  319. break;
  320. }
  321. }
  322. else
  323. {
  324. if (USARTxSource == LL_RCC_USART3_CLKSOURCE)
  325. {
  326. /* USART3CLK clock frequency */
  327. switch (LL_RCC_GetUSARTClockSource(USARTxSource))
  328. {
  329. case LL_RCC_USART3_CLKSOURCE_SYSCLK: /* USART3 Clock is System Clock */
  330. usart_frequency = RCC_GetSystemClockFreq();
  331. break;
  332. case LL_RCC_USART3_CLKSOURCE_HSI: /* USART3 Clock is HSI Osc. */
  333. if (LL_RCC_HSI_IsReady())
  334. {
  335. usart_frequency = HSI_VALUE;
  336. }
  337. break;
  338. case LL_RCC_USART3_CLKSOURCE_LSE: /* USART3 Clock is LSE Osc. */
  339. if (LL_RCC_LSE_IsReady())
  340. {
  341. usart_frequency = LSE_VALUE;
  342. }
  343. break;
  344. case LL_RCC_USART3_CLKSOURCE_PCLK1: /* USART3 Clock is PCLK1 */
  345. default:
  346. usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  347. break;
  348. }
  349. }
  350. }
  351. return usart_frequency;
  352. }
  353. /**
  354. * @brief Return UARTx clock frequency
  355. * @param UARTxSource This parameter can be one of the following values:
  356. * @arg @ref LL_RCC_UART4_CLKSOURCE
  357. * @arg @ref LL_RCC_UART5_CLKSOURCE
  358. * @arg @ref LL_RCC_UART7_CLKSOURCE
  359. * @arg @ref LL_RCC_UART8_CLKSOURCE
  360. * @retval UART clock frequency (in Hz)
  361. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
  362. */
  363. uint32_t LL_RCC_GetUARTClockFreq(uint32_t UARTxSource)
  364. {
  365. uint32_t uart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  366. /* Check parameter */
  367. assert_param(IS_LL_RCC_UART_CLKSOURCE(UARTxSource));
  368. if (UARTxSource == LL_RCC_UART4_CLKSOURCE)
  369. {
  370. /* UART4CLK clock frequency */
  371. switch (LL_RCC_GetUARTClockSource(UARTxSource))
  372. {
  373. case LL_RCC_UART4_CLKSOURCE_SYSCLK: /* UART4 Clock is System Clock */
  374. uart_frequency = RCC_GetSystemClockFreq();
  375. break;
  376. case LL_RCC_UART4_CLKSOURCE_HSI: /* UART4 Clock is HSI Osc. */
  377. if (LL_RCC_HSI_IsReady())
  378. {
  379. uart_frequency = HSI_VALUE;
  380. }
  381. break;
  382. case LL_RCC_UART4_CLKSOURCE_LSE: /* UART4 Clock is LSE Osc. */
  383. if (LL_RCC_LSE_IsReady())
  384. {
  385. uart_frequency = LSE_VALUE;
  386. }
  387. break;
  388. case LL_RCC_UART4_CLKSOURCE_PCLK1: /* UART4 Clock is PCLK1 */
  389. default:
  390. uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  391. break;
  392. }
  393. }
  394. else if (UARTxSource == LL_RCC_UART5_CLKSOURCE)
  395. {
  396. /* UART5CLK clock frequency */
  397. switch (LL_RCC_GetUARTClockSource(UARTxSource))
  398. {
  399. case LL_RCC_UART5_CLKSOURCE_SYSCLK: /* UART5 Clock is System Clock */
  400. uart_frequency = RCC_GetSystemClockFreq();
  401. break;
  402. case LL_RCC_UART5_CLKSOURCE_HSI: /* UART5 Clock is HSI Osc. */
  403. if (LL_RCC_HSI_IsReady())
  404. {
  405. uart_frequency = HSI_VALUE;
  406. }
  407. break;
  408. case LL_RCC_UART5_CLKSOURCE_LSE: /* UART5 Clock is LSE Osc. */
  409. if (LL_RCC_LSE_IsReady())
  410. {
  411. uart_frequency = LSE_VALUE;
  412. }
  413. break;
  414. case LL_RCC_UART5_CLKSOURCE_PCLK1: /* UART5 Clock is PCLK1 */
  415. default:
  416. uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  417. break;
  418. }
  419. }
  420. else if (UARTxSource == LL_RCC_UART7_CLKSOURCE)
  421. {
  422. /* UART7CLK clock frequency */
  423. switch (LL_RCC_GetUARTClockSource(UARTxSource))
  424. {
  425. case LL_RCC_UART7_CLKSOURCE_SYSCLK: /* UART7 Clock is System Clock */
  426. uart_frequency = RCC_GetSystemClockFreq();
  427. break;
  428. case LL_RCC_UART7_CLKSOURCE_HSI: /* UART7 Clock is HSI Osc. */
  429. if (LL_RCC_HSI_IsReady())
  430. {
  431. uart_frequency = HSI_VALUE;
  432. }
  433. break;
  434. case LL_RCC_UART7_CLKSOURCE_LSE: /* UART7 Clock is LSE Osc. */
  435. if (LL_RCC_LSE_IsReady())
  436. {
  437. uart_frequency = LSE_VALUE;
  438. }
  439. break;
  440. case LL_RCC_UART7_CLKSOURCE_PCLK1: /* UART7 Clock is PCLK1 */
  441. default:
  442. uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  443. break;
  444. }
  445. }
  446. else
  447. {
  448. if (UARTxSource == LL_RCC_UART8_CLKSOURCE)
  449. {
  450. /* UART8CLK clock frequency */
  451. switch (LL_RCC_GetUARTClockSource(UARTxSource))
  452. {
  453. case LL_RCC_UART8_CLKSOURCE_SYSCLK: /* UART8 Clock is System Clock */
  454. uart_frequency = RCC_GetSystemClockFreq();
  455. break;
  456. case LL_RCC_UART8_CLKSOURCE_HSI: /* UART8 Clock is HSI Osc. */
  457. if (LL_RCC_HSI_IsReady())
  458. {
  459. uart_frequency = HSI_VALUE;
  460. }
  461. break;
  462. case LL_RCC_UART8_CLKSOURCE_LSE: /* UART8 Clock is LSE Osc. */
  463. if (LL_RCC_LSE_IsReady())
  464. {
  465. uart_frequency = LSE_VALUE;
  466. }
  467. break;
  468. case LL_RCC_UART8_CLKSOURCE_PCLK1: /* UART8 Clock is PCLK1 */
  469. default:
  470. uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  471. break;
  472. }
  473. }
  474. }
  475. return uart_frequency;
  476. }
  477. /**
  478. * @brief Return I2Cx clock frequency
  479. * @param I2CxSource This parameter can be one of the following values:
  480. * @arg @ref LL_RCC_I2C1_CLKSOURCE
  481. * @arg @ref LL_RCC_I2C2_CLKSOURCE
  482. * @arg @ref LL_RCC_I2C3_CLKSOURCE
  483. * @arg @ref LL_RCC_I2C4_CLKSOURCE (*)
  484. *
  485. * (*) value not defined in all devices.
  486. * @retval I2C clock frequency (in Hz)
  487. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that HSI oscillator is not ready
  488. */
  489. uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)
  490. {
  491. uint32_t i2c_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  492. /* Check parameter */
  493. assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource));
  494. if (I2CxSource == LL_RCC_I2C1_CLKSOURCE)
  495. {
  496. /* I2C1 CLK clock frequency */
  497. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  498. {
  499. case LL_RCC_I2C1_CLKSOURCE_SYSCLK: /* I2C1 Clock is System Clock */
  500. i2c_frequency = RCC_GetSystemClockFreq();
  501. break;
  502. case LL_RCC_I2C1_CLKSOURCE_HSI: /* I2C1 Clock is HSI Osc. */
  503. if (LL_RCC_HSI_IsReady())
  504. {
  505. i2c_frequency = HSI_VALUE;
  506. }
  507. break;
  508. case LL_RCC_I2C1_CLKSOURCE_PCLK1: /* I2C1 Clock is PCLK1 */
  509. default:
  510. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  511. break;
  512. }
  513. }
  514. else if (I2CxSource == LL_RCC_I2C2_CLKSOURCE)
  515. {
  516. /* I2C2 CLK clock frequency */
  517. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  518. {
  519. case LL_RCC_I2C2_CLKSOURCE_SYSCLK: /* I2C2 Clock is System Clock */
  520. i2c_frequency = RCC_GetSystemClockFreq();
  521. break;
  522. case LL_RCC_I2C2_CLKSOURCE_HSI: /* I2C2 Clock is HSI Osc. */
  523. if (LL_RCC_HSI_IsReady())
  524. {
  525. i2c_frequency = HSI_VALUE;
  526. }
  527. break;
  528. case LL_RCC_I2C2_CLKSOURCE_PCLK1: /* I2C2 Clock is PCLK1 */
  529. default:
  530. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  531. break;
  532. }
  533. }
  534. else if (I2CxSource == LL_RCC_I2C3_CLKSOURCE)
  535. {
  536. /* I2C3 CLK clock frequency */
  537. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  538. {
  539. case LL_RCC_I2C3_CLKSOURCE_SYSCLK: /* I2C3 Clock is System Clock */
  540. i2c_frequency = RCC_GetSystemClockFreq();
  541. break;
  542. case LL_RCC_I2C3_CLKSOURCE_HSI: /* I2C3 Clock is HSI Osc. */
  543. if (LL_RCC_HSI_IsReady())
  544. {
  545. i2c_frequency = HSI_VALUE;
  546. }
  547. break;
  548. case LL_RCC_I2C3_CLKSOURCE_PCLK1: /* I2C3 Clock is PCLK1 */
  549. default:
  550. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  551. break;
  552. }
  553. }
  554. #if defined(I2C4)
  555. else
  556. {
  557. if (I2CxSource == LL_RCC_I2C4_CLKSOURCE)
  558. {
  559. /* I2C4 CLK clock frequency */
  560. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  561. {
  562. case LL_RCC_I2C4_CLKSOURCE_SYSCLK: /* I2C4 Clock is System Clock */
  563. i2c_frequency = RCC_GetSystemClockFreq();
  564. break;
  565. case LL_RCC_I2C4_CLKSOURCE_HSI: /* I2C4 Clock is HSI Osc. */
  566. if (LL_RCC_HSI_IsReady())
  567. {
  568. i2c_frequency = HSI_VALUE;
  569. }
  570. break;
  571. case LL_RCC_I2C4_CLKSOURCE_PCLK1: /* I2C4 Clock is PCLK1 */
  572. default:
  573. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  574. break;
  575. }
  576. }
  577. }
  578. #endif /* I2C4 */
  579. return i2c_frequency;
  580. }
  581. /**
  582. * @brief Return I2Sx clock frequency
  583. * @param I2SxSource This parameter can be one of the following values:
  584. * @arg @ref LL_RCC_I2S1_CLKSOURCE
  585. * @retval I2S clock frequency (in Hz)
  586. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that PLLI2S oscillator is not ready
  587. */
  588. uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource)
  589. {
  590. uint32_t i2s_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  591. /* Check parameter */
  592. assert_param(IS_LL_RCC_I2S_CLKSOURCE(I2SxSource));
  593. if (I2SxSource == LL_RCC_I2S1_CLKSOURCE)
  594. {
  595. /* I2S1 CLK clock frequency */
  596. switch (LL_RCC_GetI2SClockSource(I2SxSource))
  597. {
  598. case LL_RCC_I2S1_CLKSOURCE_PLLI2S: /* I2S1 Clock is PLLI2S */
  599. if (LL_RCC_PLLI2S_IsReady())
  600. {
  601. i2s_frequency = RCC_PLLI2S_GetFreqDomain_I2S();
  602. }
  603. break;
  604. case LL_RCC_I2S1_CLKSOURCE_PIN: /* I2S1 Clock is External clock */
  605. default:
  606. i2s_frequency = EXTERNAL_CLOCK_VALUE;
  607. break;
  608. }
  609. }
  610. return i2s_frequency;
  611. }
  612. /**
  613. * @brief Return LPTIMx clock frequency
  614. * @param LPTIMxSource This parameter can be one of the following values:
  615. * @arg @ref LL_RCC_LPTIM1_CLKSOURCE
  616. * @retval LPTIM clock frequency (in Hz)
  617. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready
  618. */
  619. uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
  620. {
  621. uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  622. /* Check parameter */
  623. assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
  624. if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE)
  625. {
  626. /* LPTIM1CLK clock frequency */
  627. switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
  628. {
  629. case LL_RCC_LPTIM1_CLKSOURCE_LSI: /* LPTIM1 Clock is LSI Osc. */
  630. if (LL_RCC_LSI_IsReady())
  631. {
  632. lptim_frequency = LSI_VALUE;
  633. }
  634. break;
  635. case LL_RCC_LPTIM1_CLKSOURCE_HSI: /* LPTIM1 Clock is HSI Osc. */
  636. if (LL_RCC_HSI_IsReady())
  637. {
  638. lptim_frequency = HSI_VALUE;
  639. }
  640. break;
  641. case LL_RCC_LPTIM1_CLKSOURCE_LSE: /* LPTIM1 Clock is LSE Osc. */
  642. if (LL_RCC_LSE_IsReady())
  643. {
  644. lptim_frequency = LSE_VALUE;
  645. }
  646. break;
  647. case LL_RCC_LPTIM1_CLKSOURCE_PCLK1: /* LPTIM1 Clock is PCLK1 */
  648. default:
  649. lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  650. break;
  651. }
  652. }
  653. return lptim_frequency;
  654. }
  655. /**
  656. * @brief Return SAIx clock frequency
  657. * @param SAIxSource This parameter can be one of the following values:
  658. * @arg @ref LL_RCC_SAI1_CLKSOURCE
  659. * @arg @ref LL_RCC_SAI2_CLKSOURCE
  660. * @retval SAI clock frequency (in Hz)
  661. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that PLL is not ready
  662. * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used
  663. */
  664. uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
  665. {
  666. uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  667. /* Check parameter */
  668. assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
  669. if (SAIxSource == LL_RCC_SAI1_CLKSOURCE)
  670. {
  671. /* SAI1CLK clock frequency */
  672. switch (LL_RCC_GetSAIClockSource(SAIxSource))
  673. {
  674. case LL_RCC_SAI1_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI1 clock source */
  675. if (LL_RCC_PLLSAI_IsReady())
  676. {
  677. sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI();
  678. }
  679. break;
  680. case LL_RCC_SAI1_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI1 clock source */
  681. if (LL_RCC_PLLI2S_IsReady())
  682. {
  683. sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI();
  684. }
  685. break;
  686. #if defined(RCC_SAI1SEL_PLLSRC_SUPPORT)
  687. case LL_RCC_SAI1_CLKSOURCE_PLLSRC:
  688. switch (LL_RCC_PLL_GetMainSource())
  689. {
  690. case LL_RCC_PLLSOURCE_HSE: /* HSE clock used as SAI1 clock source */
  691. if (LL_RCC_HSE_IsReady())
  692. {
  693. sai_frequency = HSE_VALUE;
  694. }
  695. break;
  696. case LL_RCC_PLLSOURCE_HSI: /* HSI clock used as SAI1 clock source */
  697. default:
  698. if (LL_RCC_HSI_IsReady())
  699. {
  700. sai_frequency = HSI_VALUE;
  701. }
  702. break;
  703. }
  704. break;
  705. #endif /* RCC_SAI1SEL_PLLSRC_SUPPORT */
  706. case LL_RCC_SAI1_CLKSOURCE_PIN: /* External input clock used as SAI1 clock source */
  707. default:
  708. sai_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  709. break;
  710. }
  711. }
  712. else
  713. {
  714. if (SAIxSource == LL_RCC_SAI2_CLKSOURCE)
  715. {
  716. /* SAI2CLK clock frequency */
  717. switch (LL_RCC_GetSAIClockSource(SAIxSource))
  718. {
  719. case LL_RCC_SAI2_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI2 clock source */
  720. if (LL_RCC_PLLSAI_IsReady())
  721. {
  722. sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI();
  723. }
  724. break;
  725. case LL_RCC_SAI2_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI2 clock source */
  726. if (LL_RCC_PLLI2S_IsReady())
  727. {
  728. sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI();
  729. }
  730. break;
  731. #if defined(RCC_SAI2SEL_PLLSRC_SUPPORT)
  732. case LL_RCC_SAI2_CLKSOURCE_PLLSRC:
  733. switch (LL_RCC_PLL_GetMainSource())
  734. {
  735. case LL_RCC_PLLSOURCE_HSE: /* HSE clock used as SAI2 clock source */
  736. if (LL_RCC_HSE_IsReady())
  737. {
  738. sai_frequency = HSE_VALUE;
  739. }
  740. break;
  741. case LL_RCC_PLLSOURCE_HSI: /* HSI clock used as SAI2 clock source */
  742. default:
  743. if (LL_RCC_HSI_IsReady())
  744. {
  745. sai_frequency = HSI_VALUE;
  746. }
  747. break;
  748. }
  749. break;
  750. #endif /* RCC_SAI2SEL_PLLSRC_SUPPORT */
  751. case LL_RCC_SAI2_CLKSOURCE_PIN: /* External input clock used as SAI2 clock source */
  752. default:
  753. sai_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  754. break;
  755. }
  756. }
  757. }
  758. return sai_frequency;
  759. }
  760. /**
  761. * @brief Return SDMMCx clock frequency
  762. * @param SDMMCxSource This parameter can be one of the following values:
  763. * @arg @ref LL_RCC_SDMMC1_CLKSOURCE
  764. * @arg @ref LL_RCC_SDMMC2_CLKSOURCE (*)
  765. *
  766. * (*) value not defined in all devices.
  767. * @retval SDMMC clock frequency (in Hz)
  768. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator PLL is not ready
  769. */
  770. uint32_t LL_RCC_GetSDMMCClockFreq(uint32_t SDMMCxSource)
  771. {
  772. uint32_t sdmmc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  773. /* Check parameter */
  774. assert_param(IS_LL_RCC_SDMMC_CLKSOURCE(SDMMCxSource));
  775. if (SDMMCxSource == LL_RCC_SDMMC1_CLKSOURCE)
  776. {
  777. /* SDMMC1CLK clock frequency */
  778. switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
  779. {
  780. case LL_RCC_SDMMC1_CLKSOURCE_PLL48CLK: /* PLL48 clock used as SDMMC1 clock source */
  781. switch (LL_RCC_GetCK48MClockSource(LL_RCC_CK48M_CLKSOURCE))
  782. {
  783. case LL_RCC_CK48M_CLKSOURCE_PLL: /* PLL clock used as 48Mhz domain clock */
  784. if (LL_RCC_PLL_IsReady())
  785. {
  786. sdmmc_frequency = RCC_PLL_GetFreqDomain_48M();
  787. }
  788. break;
  789. case LL_RCC_CK48M_CLKSOURCE_PLLSAI: /* PLLSAI clock used as 48Mhz domain clock */
  790. default:
  791. if (LL_RCC_PLLSAI_IsReady())
  792. {
  793. sdmmc_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  794. }
  795. break;
  796. }
  797. break;
  798. case LL_RCC_SDMMC1_CLKSOURCE_SYSCLK: /* PLL clock used as SDMMC1 clock source */
  799. default:
  800. sdmmc_frequency = RCC_GetSystemClockFreq();
  801. break;
  802. }
  803. }
  804. #if defined(SDMMC2)
  805. else
  806. {
  807. /* SDMMC2CLK clock frequency */
  808. switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
  809. {
  810. case LL_RCC_SDMMC2_CLKSOURCE_PLL48CLK: /* PLL48 clock used as SDMMC2 clock source */
  811. switch (LL_RCC_GetCK48MClockSource(LL_RCC_CK48M_CLKSOURCE))
  812. {
  813. case LL_RCC_CK48M_CLKSOURCE_PLL: /* PLL clock used as 48Mhz domain clock */
  814. if (LL_RCC_PLL_IsReady())
  815. {
  816. sdmmc_frequency = RCC_PLL_GetFreqDomain_48M();
  817. }
  818. break;
  819. case LL_RCC_CK48M_CLKSOURCE_PLLSAI: /* PLLSAI clock used as 48Mhz domain clock */
  820. default:
  821. if (LL_RCC_PLLSAI_IsReady())
  822. {
  823. sdmmc_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  824. }
  825. break;
  826. }
  827. break;
  828. case LL_RCC_SDMMC2_CLKSOURCE_SYSCLK: /* PLL clock used as SDMMC2 clock source */
  829. default:
  830. sdmmc_frequency = RCC_GetSystemClockFreq();
  831. break;
  832. }
  833. }
  834. #endif /* SDMMC2 */
  835. return sdmmc_frequency;
  836. }
  837. /**
  838. * @brief Return RNGx clock frequency
  839. * @param RNGxSource This parameter can be one of the following values:
  840. * @arg @ref LL_RCC_RNG_CLKSOURCE
  841. * @retval RNG clock frequency (in Hz)
  842. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  843. */
  844. uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
  845. {
  846. uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  847. /* Check parameter */
  848. assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource));
  849. /* RNGCLK clock frequency */
  850. switch (LL_RCC_GetRNGClockSource(RNGxSource))
  851. {
  852. case LL_RCC_RNG_CLKSOURCE_PLL: /* PLL clock used as RNG clock source */
  853. if (LL_RCC_PLL_IsReady())
  854. {
  855. rng_frequency = RCC_PLL_GetFreqDomain_48M();
  856. }
  857. break;
  858. case LL_RCC_RNG_CLKSOURCE_PLLSAI: /* PLLSAI clock used as RNG clock source */
  859. default:
  860. if (LL_RCC_PLLSAI_IsReady())
  861. {
  862. rng_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  863. }
  864. break;
  865. }
  866. return rng_frequency;
  867. }
  868. #if defined(CEC)
  869. /**
  870. * @brief Return CEC clock frequency
  871. * @param CECxSource This parameter can be one of the following values:
  872. * @arg @ref LL_RCC_CEC_CLKSOURCE
  873. * @retval CEC clock frequency (in Hz)
  874. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
  875. */
  876. uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource)
  877. {
  878. uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  879. /* Check parameter */
  880. assert_param(IS_LL_RCC_CEC_CLKSOURCE(CECxSource));
  881. /* CECCLK clock frequency */
  882. switch (LL_RCC_GetCECClockSource(CECxSource))
  883. {
  884. case LL_RCC_CEC_CLKSOURCE_LSE: /* CEC Clock is LSE Osc. */
  885. if (LL_RCC_LSE_IsReady())
  886. {
  887. cec_frequency = LSE_VALUE;
  888. }
  889. break;
  890. case LL_RCC_CEC_CLKSOURCE_HSI_DIV488: /* CEC Clock is HSI Osc. */
  891. default:
  892. if (LL_RCC_HSI_IsReady())
  893. {
  894. cec_frequency = HSI_VALUE/488U;
  895. }
  896. break;
  897. }
  898. return cec_frequency;
  899. }
  900. #endif /* CEC */
  901. /**
  902. * @brief Return USBx clock frequency
  903. * @param USBxSource This parameter can be one of the following values:
  904. * @arg @ref LL_RCC_USB_CLKSOURCE
  905. * @retval USB clock frequency (in Hz)
  906. */
  907. uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
  908. {
  909. uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  910. /* Check parameter */
  911. assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource));
  912. /* USBCLK clock frequency */
  913. switch (LL_RCC_GetUSBClockSource(USBxSource))
  914. {
  915. case LL_RCC_USB_CLKSOURCE_PLL: /* PLL clock used as USB clock source */
  916. if (LL_RCC_PLL_IsReady())
  917. {
  918. usb_frequency = RCC_PLL_GetFreqDomain_48M();
  919. }
  920. break;
  921. case LL_RCC_USB_CLKSOURCE_PLLSAI: /* PLLSAI clock used as USB clock source */
  922. default:
  923. if (LL_RCC_PLLSAI_IsReady())
  924. {
  925. usb_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  926. }
  927. break;
  928. }
  929. return usb_frequency;
  930. }
  931. #if defined(DFSDM1_Channel0)
  932. /**
  933. * @brief Return DFSDMx clock frequency
  934. * @param DFSDMxSource This parameter can be one of the following values:
  935. * @arg @ref LL_RCC_DFSDM1_CLKSOURCE
  936. * @retval DFSDM clock frequency (in Hz)
  937. */
  938. uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource)
  939. {
  940. uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  941. /* Check parameter */
  942. assert_param(IS_LL_RCC_DFSDM_CLKSOURCE(DFSDMxSource));
  943. /* DFSDM1CLK clock frequency */
  944. switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
  945. {
  946. case LL_RCC_DFSDM1_CLKSOURCE_SYSCLK: /* DFSDM1 Clock is SYSCLK */
  947. dfsdm_frequency = RCC_GetSystemClockFreq();
  948. break;
  949. case LL_RCC_DFSDM1_CLKSOURCE_PCLK2: /* DFSDM1 Clock is PCLK2 */
  950. default:
  951. dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  952. break;
  953. }
  954. return dfsdm_frequency;
  955. }
  956. /**
  957. * @brief Return DFSDMx Audio clock frequency
  958. * @param DFSDMxSource This parameter can be one of the following values:
  959. * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE
  960. * @retval DFSDM clock frequency (in Hz)
  961. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  962. */
  963. uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource)
  964. {
  965. uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  966. /* Check parameter */
  967. assert_param(IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(DFSDMxSource));
  968. /* DFSDM1CLK clock frequency */
  969. switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource))
  970. {
  971. case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_SAI1: /* SAI1 clock used as DFSDM1 audio clock */
  972. dfsdm_frequency = LL_RCC_GetSAIClockFreq(LL_RCC_SAI1_CLKSOURCE);
  973. break;
  974. case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_SAI2: /* SAI2 clock used as DFSDM1 audio clock */
  975. default:
  976. dfsdm_frequency = LL_RCC_GetSAIClockFreq(LL_RCC_SAI2_CLKSOURCE);
  977. break;
  978. }
  979. return dfsdm_frequency;
  980. }
  981. #endif /* DFSDM1_Channel0 */
  982. #if defined(DSI)
  983. /**
  984. * @brief Return DSI clock frequency
  985. * @param DSIxSource This parameter can be one of the following values:
  986. * @arg @ref LL_RCC_DSI_CLKSOURCE
  987. * @retval DSI clock frequency (in Hz)
  988. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  989. * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used
  990. */
  991. uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource)
  992. {
  993. uint32_t dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  994. /* Check parameter */
  995. assert_param(IS_LL_RCC_DSI_CLKSOURCE(DSIxSource));
  996. /* DSICLK clock frequency */
  997. switch (LL_RCC_GetDSIClockSource(DSIxSource))
  998. {
  999. case LL_RCC_DSI_CLKSOURCE_PLL: /* DSI Clock is PLL Osc. */
  1000. if (LL_RCC_PLL_IsReady())
  1001. {
  1002. dsi_frequency = RCC_PLL_GetFreqDomain_DSI();
  1003. }
  1004. break;
  1005. case LL_RCC_DSI_CLKSOURCE_PHY: /* DSI Clock is DSI physical clock. */
  1006. default:
  1007. dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  1008. break;
  1009. }
  1010. return dsi_frequency;
  1011. }
  1012. #endif /* DSI */
  1013. #if defined(LTDC)
  1014. /**
  1015. * @brief Return LTDC clock frequency
  1016. * @param LTDCxSource This parameter can be one of the following values:
  1017. * @arg @ref LL_RCC_LTDC_CLKSOURCE
  1018. * @retval LTDC clock frequency (in Hz)
  1019. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator PLLSAI is not ready
  1020. */
  1021. uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource)
  1022. {
  1023. uint32_t ltdc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1024. /* Check parameter */
  1025. assert_param(IS_LL_RCC_LTDC_CLKSOURCE(LTDCxSource));
  1026. if (LL_RCC_PLLSAI_IsReady())
  1027. {
  1028. ltdc_frequency = RCC_PLLSAI_GetFreqDomain_LTDC();
  1029. }
  1030. return ltdc_frequency;
  1031. }
  1032. #endif /* LTDC */
  1033. #if defined(SPDIFRX)
  1034. /**
  1035. * @brief Return SPDIFRX clock frequency
  1036. * @param SPDIFRXxSource This parameter can be one of the following values:
  1037. * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE
  1038. * @retval SPDIFRX clock frequency (in Hz)
  1039. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  1040. */
  1041. uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource)
  1042. {
  1043. uint32_t spdifrx_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1044. /* Check parameter */
  1045. assert_param(IS_LL_RCC_SPDIFRX_CLKSOURCE(SPDIFRXxSource));
  1046. if (LL_RCC_PLLI2S_IsReady())
  1047. {
  1048. spdifrx_frequency = RCC_PLLI2S_GetFreqDomain_SPDIFRX();
  1049. }
  1050. return spdifrx_frequency;
  1051. }
  1052. #endif /* SPDIFRX */
  1053. /**
  1054. * @}
  1055. */
  1056. /**
  1057. * @}
  1058. */
  1059. /** @addtogroup RCC_LL_Private_Functions
  1060. * @{
  1061. */
  1062. /**
  1063. * @brief Return SYSTEM clock frequency
  1064. * @retval SYSTEM clock frequency (in Hz)
  1065. */
  1066. uint32_t RCC_GetSystemClockFreq(void)
  1067. {
  1068. uint32_t frequency = 0U;
  1069. /* Get SYSCLK source -------------------------------------------------------*/
  1070. switch (LL_RCC_GetSysClkSource())
  1071. {
  1072. case LL_RCC_SYS_CLKSOURCE_STATUS_HSI: /* HSI used as system clock source */
  1073. frequency = HSI_VALUE;
  1074. break;
  1075. case LL_RCC_SYS_CLKSOURCE_STATUS_HSE: /* HSE used as system clock source */
  1076. frequency = HSE_VALUE;
  1077. break;
  1078. case LL_RCC_SYS_CLKSOURCE_STATUS_PLL: /* PLL used as system clock source */
  1079. frequency = RCC_PLL_GetFreqDomain_SYS();
  1080. break;
  1081. default:
  1082. frequency = HSI_VALUE;
  1083. break;
  1084. }
  1085. return frequency;
  1086. }
  1087. /**
  1088. * @brief Return HCLK clock frequency
  1089. * @param SYSCLK_Frequency SYSCLK clock frequency
  1090. * @retval HCLK clock frequency (in Hz)
  1091. */
  1092. uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
  1093. {
  1094. /* HCLK clock frequency */
  1095. return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
  1096. }
  1097. /**
  1098. * @brief Return PCLK1 clock frequency
  1099. * @param HCLK_Frequency HCLK clock frequency
  1100. * @retval PCLK1 clock frequency (in Hz)
  1101. */
  1102. uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
  1103. {
  1104. /* PCLK1 clock frequency */
  1105. return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
  1106. }
  1107. /**
  1108. * @brief Return PCLK2 clock frequency
  1109. * @param HCLK_Frequency HCLK clock frequency
  1110. * @retval PCLK2 clock frequency (in Hz)
  1111. */
  1112. uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
  1113. {
  1114. /* PCLK2 clock frequency */
  1115. return __LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
  1116. }
  1117. /**
  1118. * @brief Return PLL clock frequency used for system domain
  1119. * @retval PLL clock frequency (in Hz)
  1120. */
  1121. uint32_t RCC_PLL_GetFreqDomain_SYS(void)
  1122. {
  1123. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1124. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1125. SYSCLK = PLL_VCO / PLLP
  1126. */
  1127. pllsource = LL_RCC_PLL_GetMainSource();
  1128. switch (pllsource)
  1129. {
  1130. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1131. pllinputfreq = HSI_VALUE;
  1132. break;
  1133. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1134. pllinputfreq = HSE_VALUE;
  1135. break;
  1136. default:
  1137. pllinputfreq = HSI_VALUE;
  1138. break;
  1139. }
  1140. return __LL_RCC_CALC_PLLCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1141. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP());
  1142. }
  1143. /**
  1144. * @brief Return PLL clock frequency used for 48 MHz domain
  1145. * @retval PLL clock frequency (in Hz)
  1146. */
  1147. uint32_t RCC_PLL_GetFreqDomain_48M(void)
  1148. {
  1149. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1150. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN
  1151. 48M Domain clock = PLL_VCO / PLLQ
  1152. */
  1153. pllsource = LL_RCC_PLL_GetMainSource();
  1154. switch (pllsource)
  1155. {
  1156. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1157. pllinputfreq = HSI_VALUE;
  1158. break;
  1159. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1160. pllinputfreq = HSE_VALUE;
  1161. break;
  1162. default:
  1163. pllinputfreq = HSI_VALUE;
  1164. break;
  1165. }
  1166. return __LL_RCC_CALC_PLLCLK_48M_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1167. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
  1168. }
  1169. #if defined(DSI)
  1170. /**
  1171. * @brief Return PLL clock frequency used for DSI clock
  1172. * @retval PLL clock frequency (in Hz)
  1173. */
  1174. uint32_t RCC_PLL_GetFreqDomain_DSI(void)
  1175. {
  1176. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1177. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1178. DSICLK = PLL_VCO / PLLR
  1179. */
  1180. pllsource = LL_RCC_PLL_GetMainSource();
  1181. switch (pllsource)
  1182. {
  1183. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1184. pllinputfreq = HSE_VALUE;
  1185. break;
  1186. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1187. default:
  1188. pllinputfreq = HSI_VALUE;
  1189. break;
  1190. }
  1191. return __LL_RCC_CALC_PLLCLK_DSI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1192. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  1193. }
  1194. #endif /* DSI */
  1195. /**
  1196. * @brief Return PLLSAI clock frequency used for SAI1 and SAI2 domains
  1197. * @retval PLLSAI clock frequency (in Hz)
  1198. */
  1199. uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void)
  1200. {
  1201. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1202. /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLSAIN
  1203. SAI1 and SAI2 domains clock = (PLLSAI_VCO / PLLSAIQ) / PLLSAIDIVQ
  1204. */
  1205. pllsource = LL_RCC_PLL_GetMainSource();
  1206. switch (pllsource)
  1207. {
  1208. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */
  1209. pllinputfreq = HSI_VALUE;
  1210. break;
  1211. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */
  1212. pllinputfreq = HSE_VALUE;
  1213. break;
  1214. default:
  1215. pllinputfreq = HSI_VALUE;
  1216. break;
  1217. }
  1218. return __LL_RCC_CALC_PLLSAI_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1219. LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetQ(), LL_RCC_PLLSAI_GetDIVQ());
  1220. }
  1221. /**
  1222. * @brief Return PLLSAI clock frequency used for 48Mhz domain
  1223. * @retval PLLSAI clock frequency (in Hz)
  1224. */
  1225. uint32_t RCC_PLLSAI_GetFreqDomain_48M(void)
  1226. {
  1227. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1228. /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLSAIN
  1229. 48M Domain clock = PLLSAI_VCO / PLLSAIP
  1230. */
  1231. pllsource = LL_RCC_PLL_GetMainSource();
  1232. switch (pllsource)
  1233. {
  1234. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */
  1235. pllinputfreq = HSI_VALUE;
  1236. break;
  1237. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */
  1238. pllinputfreq = HSE_VALUE;
  1239. break;
  1240. default:
  1241. pllinputfreq = HSI_VALUE;
  1242. break;
  1243. }
  1244. return __LL_RCC_CALC_PLLSAI_48M_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1245. LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetP());
  1246. }
  1247. #if defined(LTDC)
  1248. /**
  1249. * @brief Return PLLSAI clock frequency used for LTDC domain
  1250. * @retval PLLSAI clock frequency (in Hz)
  1251. */
  1252. uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void)
  1253. {
  1254. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1255. /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLSAIN
  1256. LTDC Domain clock = (PLLSAI_VCO / PLLSAIR) / PLLSAIDIVR
  1257. */
  1258. pllsource = LL_RCC_PLL_GetMainSource();
  1259. switch (pllsource)
  1260. {
  1261. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */
  1262. pllinputfreq = HSI_VALUE;
  1263. break;
  1264. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */
  1265. pllinputfreq = HSE_VALUE;
  1266. break;
  1267. default:
  1268. pllinputfreq = HSI_VALUE;
  1269. break;
  1270. }
  1271. return __LL_RCC_CALC_PLLSAI_LTDC_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1272. LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetR(), LL_RCC_PLLSAI_GetDIVR());
  1273. }
  1274. #endif /* LTDC */
  1275. /**
  1276. * @brief Return PLLI2S clock frequency used for SAI1 and SAI2 domains
  1277. * @retval PLLI2S clock frequency (in Hz)
  1278. */
  1279. uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void)
  1280. {
  1281. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1282. /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLI2SN
  1283. SAI1 and SAI2 domains clock = (PLLI2S_VCO / PLLI2SQ) / PLLI2SDIVQ
  1284. */
  1285. pllsource = LL_RCC_PLL_GetMainSource();
  1286. switch (pllsource)
  1287. {
  1288. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1289. pllinputfreq = HSI_VALUE;
  1290. break;
  1291. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1292. pllinputfreq = HSE_VALUE;
  1293. break;
  1294. default:
  1295. pllinputfreq = HSI_VALUE;
  1296. break;
  1297. }
  1298. return __LL_RCC_CALC_PLLI2S_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1299. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetQ(), LL_RCC_PLLI2S_GetDIVQ());
  1300. }
  1301. #if defined(SPDIFRX)
  1302. /**
  1303. * @brief Return PLLI2S clock frequency used for SPDIFRX domain
  1304. * @retval PLLI2S clock frequency (in Hz)
  1305. */
  1306. uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void)
  1307. {
  1308. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1309. /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLI2SN
  1310. SPDIFRX Domain clock = PLLI2S_VCO / PLLI2SP
  1311. */
  1312. pllsource = LL_RCC_PLL_GetMainSource();
  1313. switch (pllsource)
  1314. {
  1315. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1316. pllinputfreq = HSI_VALUE;
  1317. break;
  1318. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1319. pllinputfreq = HSE_VALUE;
  1320. break;
  1321. default:
  1322. pllinputfreq = HSI_VALUE;
  1323. break;
  1324. }
  1325. return __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1326. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetP());
  1327. }
  1328. #endif /* SPDIFRX */
  1329. /**
  1330. * @brief Return PLLI2S clock frequency used for I2S domain
  1331. * @retval PLLI2S clock frequency (in Hz)
  1332. */
  1333. uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void)
  1334. {
  1335. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1336. /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLI2SN
  1337. I2S Domain clock = PLLI2S_VCO / PLLI2SR
  1338. */
  1339. pllsource = LL_RCC_PLL_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_I2S_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1351. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetR());
  1352. }
  1353. /**
  1354. * @}
  1355. */
  1356. /**
  1357. * @}
  1358. */
  1359. #endif /* defined(RCC) */
  1360. /**
  1361. * @}
  1362. */
  1363. #endif /* USE_FULL_LL_DRIVER */
  1364. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/