1 /**
2   ******************************************************************************
3   * @file    stm32u5xx_hal_rcc_ex.c
4   * @author  MCD Application Team
5   * @brief   Extended RCC HAL module driver.
6   *          This file provides firmware functions to manage the following
7   *          functionalities RCC extended peripheral:
8   *           + Extended Peripheral Control functions
9   *           + Extended Clock management functions
10   *           + Extended Clock Recovery System Control functions
11   *
12   ******************************************************************************
13   * @attention
14   *
15   * Copyright (c) 2021 STMicroelectronics.
16   * All rights reserved.
17   *
18   * This software is licensed under terms that can be found in the LICENSE file
19   * in the root directory of this software component.
20   * If no LICENSE file comes with this software, it is provided AS-IS.
21   *
22   ******************************************************************************
23   */
24 
25 /* Includes ------------------------------------------------------------------*/
26 #include "stm32u5xx_hal.h"
27 
28 /** @addtogroup STM32U5xx_HAL_Driver
29   * @{
30   */
31 
32 /** @defgroup RCCEx RCCEx
33   * @brief RCC Extended HAL module driver
34   * @{
35   */
36 
37 #ifdef HAL_RCC_MODULE_ENABLED
38 
39 /* Private typedef -----------------------------------------------------------*/
40 /* Private defines -----------------------------------------------------------*/
41 /** @defgroup RCCEx_Private_Constants RCCEx Private Constants
42   * @{
43   */
44 #define PLL1_TIMEOUT_VALUE     2UL    /* 2 ms (minimum Tick + 1) */
45 #define PLL2_TIMEOUT_VALUE     2UL    /* 2 ms (minimum Tick + 1) */
46 #define PLL3_TIMEOUT_VALUE     2UL    /* 2 ms (minimum Tick + 1) */
47 
48 /* Not available in STM32U575/585 rev. X and and STM32U59x/5Ax rev. B/Y devices. */
49 #if defined (STM32U585xx) || defined (STM32U575xx)
50 #define RCC_EXTI_LINE_LSECSS               EXTI_IMR1_IM23        /*!< External interrupt line 23 connected to the LSE CSS interrupt Line */
51 #else
52 #define RCC_EXTI_LINE_LSECSS               EXTI_IMR1_IM24        /*!< External interrupt line 24 connected to the LSE CSS interrupt Line */
53 #endif /* STM32U585xx || STM32U575xx */
54 
55 /* Not available in STM32U575/585 rev. X and and STM32U59x/5Ax rev. B/Y devices. */
56 #define RCC_EXTI_LINE_MSIPLLUNLCK          EXTI_IMR1_IM23        /*!< External interrupt line 23 connected to the MSI PLL UNLOCK interrupt Line */
57 
58 /**
59   * @}
60   */
61 
62 /* Private macros ------------------------------------------------------------*/
63 /** @addtogroup RCCEx_Private_Macros
64   * @{
65   */
66 
67 #define IS_RCC_PLL2CLOCKOUT_VALUE(VALUE) ((0x00010000U <= (VALUE)) && ((VALUE) <= 0x00070000U))
68 
69 #define IS_RCC_PLL3CLOCKOUT_VALUE(VALUE) ((0x00010000U <= (VALUE)) && ((VALUE) <= 0x00070000U))
70 
71 #define IS_RCC_LSCOSOURCE(__SOURCE__) (((__SOURCE__) == RCC_LSCOSOURCE_LSI) || \
72                                        ((__SOURCE__) == RCC_LSCOSOURCE_LSE))
73 
74 #define IS_RCC_MSIPLLMODE_SELECT(__SOURCE__) (((__SOURCE__) == RCC_MSISPLL_MODE_SEL) || \
75                                               ((__SOURCE__) == RCC_MSIKPLL_MODE_SEL))
76 
77 #define IS_RCC_PERIPHCLOCK(__SELECTION__)   ((((__SELECTION__) & RCC_PERIPHCLOCK_ALL) != 0x00u) && \
78                                              (((__SELECTION__) & ~RCC_PERIPHCLOCK_ALL) == 0x00u))
79 
80 #define IS_RCC_USART1CLKSOURCE(__SOURCE__)  \
81   (((__SOURCE__) == RCC_USART1CLKSOURCE_PCLK2) || \
82    ((__SOURCE__) == RCC_USART1CLKSOURCE_SYSCLK) || \
83    ((__SOURCE__) == RCC_USART1CLKSOURCE_HSI) || \
84    ((__SOURCE__) == RCC_USART1CLKSOURCE_LSE))
85 
86 #if defined(USART2)
87 #define IS_RCC_USART2CLKSOURCE(__SOURCE__)  \
88   (((__SOURCE__) == RCC_USART2CLKSOURCE_PCLK1) || \
89    ((__SOURCE__) == RCC_USART2CLKSOURCE_SYSCLK) || \
90    ((__SOURCE__) == RCC_USART2CLKSOURCE_HSI) || \
91    ((__SOURCE__) == RCC_USART2CLKSOURCE_LSE))
92 #endif /* USART2 */
93 
94 #define IS_RCC_USART3CLKSOURCE(__SOURCE__)  \
95   (((__SOURCE__) == RCC_USART3CLKSOURCE_PCLK1) || \
96    ((__SOURCE__) == RCC_USART3CLKSOURCE_SYSCLK) || \
97    ((__SOURCE__) == RCC_USART3CLKSOURCE_HSI) || \
98    ((__SOURCE__) == RCC_USART3CLKSOURCE_LSE))
99 
100 #define IS_RCC_UART4CLKSOURCE(__SOURCE__)  \
101   (((__SOURCE__) == RCC_UART4CLKSOURCE_PCLK1) || \
102    ((__SOURCE__) == RCC_UART4CLKSOURCE_SYSCLK) || \
103    ((__SOURCE__) == RCC_UART4CLKSOURCE_HSI) || \
104    ((__SOURCE__) == RCC_UART4CLKSOURCE_LSE))
105 
106 #define IS_RCC_UART5CLKSOURCE(__SOURCE__)  \
107   (((__SOURCE__) == RCC_UART5CLKSOURCE_PCLK1) || \
108    ((__SOURCE__) == RCC_UART5CLKSOURCE_SYSCLK) || \
109    ((__SOURCE__) == RCC_UART5CLKSOURCE_HSI) || \
110    ((__SOURCE__) == RCC_UART5CLKSOURCE_LSE))
111 
112 #if defined(USART6)
113 #define IS_RCC_USART6CLKSOURCE(__SOURCE__)  \
114   (((__SOURCE__) == RCC_USART6CLKSOURCE_PCLK1) || \
115    ((__SOURCE__) == RCC_USART6CLKSOURCE_SYSCLK) || \
116    ((__SOURCE__) == RCC_USART6CLKSOURCE_HSI) || \
117    ((__SOURCE__) == RCC_USART6CLKSOURCE_LSE))
118 #endif /* USART6 */
119 
120 #define IS_RCC_LPUART1CLKSOURCE(__SOURCE__)  \
121   (((__SOURCE__) == RCC_LPUART1CLKSOURCE_PCLK3) || \
122    ((__SOURCE__) == RCC_LPUART1CLKSOURCE_SYSCLK) || \
123    ((__SOURCE__) == RCC_LPUART1CLKSOURCE_HSI) || \
124    ((__SOURCE__) == RCC_LPUART1CLKSOURCE_LSE) || \
125    ((__SOURCE__) == RCC_LPUART1CLKSOURCE_MSIK))
126 
127 #define IS_RCC_I2C1CLKSOURCE(__SOURCE__)   \
128   (((__SOURCE__) == RCC_I2C1CLKSOURCE_PCLK1) || \
129    ((__SOURCE__) == RCC_I2C1CLKSOURCE_SYSCLK)|| \
130    ((__SOURCE__) == RCC_I2C1CLKSOURCE_HSI)|| \
131    ((__SOURCE__) == RCC_I2C1CLKSOURCE_MSIK))
132 
133 #define IS_RCC_I2C2CLKSOURCE(__SOURCE__)   \
134   (((__SOURCE__) == RCC_I2C2CLKSOURCE_PCLK1) || \
135    ((__SOURCE__) == RCC_I2C2CLKSOURCE_SYSCLK)|| \
136    ((__SOURCE__) == RCC_I2C2CLKSOURCE_HSI)|| \
137    ((__SOURCE__) == RCC_I2C2CLKSOURCE_MSIK))
138 
139 #define IS_RCC_I2C3CLKSOURCE(__SOURCE__)   \
140   (((__SOURCE__) == RCC_I2C3CLKSOURCE_PCLK3) || \
141    ((__SOURCE__) == RCC_I2C3CLKSOURCE_SYSCLK ) || \
142    ((__SOURCE__) == RCC_I2C3CLKSOURCE_HSI    ) || \
143    ((__SOURCE__) == RCC_I2C3CLKSOURCE_MSIK))
144 
145 #define IS_RCC_I2C4CLKSOURCE(__SOURCE__)   \
146   (((__SOURCE__) == RCC_I2C4CLKSOURCE_PCLK1) || \
147    ((__SOURCE__) == RCC_I2C4CLKSOURCE_SYSCLK)|| \
148    ((__SOURCE__) == RCC_I2C4CLKSOURCE_HSI)|| \
149    ((__SOURCE__) == RCC_I2C4CLKSOURCE_MSIK))
150 
151 #if defined(I2C5)
152 #define IS_RCC_I2C5CLKSOURCE(__SOURCE__)   \
153   (((__SOURCE__) == RCC_I2C5CLKSOURCE_PCLK1) || \
154    ((__SOURCE__) == RCC_I2C5CLKSOURCE_SYSCLK)|| \
155    ((__SOURCE__) == RCC_I2C5CLKSOURCE_HSI)|| \
156    ((__SOURCE__) == RCC_I2C5CLKSOURCE_MSIK))
157 #endif /* I2C5 */
158 
159 #if defined(I2C6)
160 #define IS_RCC_I2C6CLKSOURCE(__SOURCE__)   \
161   (((__SOURCE__) == RCC_I2C6CLKSOURCE_PCLK1) || \
162    ((__SOURCE__) == RCC_I2C6CLKSOURCE_SYSCLK)|| \
163    ((__SOURCE__) == RCC_I2C6CLKSOURCE_HSI)|| \
164    ((__SOURCE__) == RCC_I2C6CLKSOURCE_MSIK))
165 #endif /* I2C6 */
166 
167 #define IS_RCC_SAI1CLK(__SOURCE__)   \
168   (((__SOURCE__) == RCC_SAI1CLKSOURCE_PLL2) || \
169    ((__SOURCE__) == RCC_SAI1CLKSOURCE_PLL3) || \
170    ((__SOURCE__) == RCC_SAI1CLKSOURCE_PLL1) || \
171    ((__SOURCE__) == RCC_SAI1CLKSOURCE_PIN)  || \
172    ((__SOURCE__) == RCC_SAI1CLKSOURCE_HSI))
173 
174 #if defined(SAI2)
175 #define IS_RCC_SAI2CLK(__SOURCE__)   \
176   (((__SOURCE__) == RCC_SAI2CLKSOURCE_PLL2) || \
177    ((__SOURCE__) == RCC_SAI2CLKSOURCE_PLL3) || \
178    ((__SOURCE__) == RCC_SAI2CLKSOURCE_PLL1) || \
179    ((__SOURCE__) == RCC_SAI2CLKSOURCE_PIN) || \
180    ((__SOURCE__) == RCC_SAI2CLKSOURCE_HSI))
181 #endif /* SAI2 */
182 
183 #define IS_RCC_LPTIM1CLK(__SOURCE__)  \
184   (((__SOURCE__) == RCC_LPTIM1CLKSOURCE_MSIK) || \
185    ((__SOURCE__) == RCC_LPTIM1CLKSOURCE_LSI) || \
186    ((__SOURCE__) == RCC_LPTIM1CLKSOURCE_HSI) || \
187    ((__SOURCE__) == RCC_LPTIM1CLKSOURCE_LSE))
188 
189 #define IS_RCC_LPTIM2CLK(__SOURCE__)  \
190   (((__SOURCE__) == RCC_LPTIM2CLKSOURCE_PCLK1) || \
191    ((__SOURCE__) == RCC_LPTIM2CLKSOURCE_LSI) || \
192    ((__SOURCE__) == RCC_LPTIM2CLKSOURCE_HSI) || \
193    ((__SOURCE__) == RCC_LPTIM2CLKSOURCE_LSE))
194 
195 #define IS_RCC_LPTIM34CLK(__SOURCE__)  \
196   (((__SOURCE__) == RCC_LPTIM34CLKSOURCE_MSIK) || \
197    ((__SOURCE__) == RCC_LPTIM34CLKSOURCE_LSI) || \
198    ((__SOURCE__) == RCC_LPTIM34CLKSOURCE_HSI) || \
199    ((__SOURCE__) == RCC_LPTIM34CLKSOURCE_LSE))
200 
201 #define IS_RCC_FDCAN1CLK(__SOURCE__)  \
202   (((__SOURCE__) == RCC_FDCAN1CLKSOURCE_HSE) || \
203    ((__SOURCE__) == RCC_FDCAN1CLKSOURCE_PLL1) || \
204    ((__SOURCE__) == RCC_FDCAN1CLKSOURCE_PLL2))
205 
206 #define IS_RCC_SDMMCCLKSOURCE(__SOURCE__)  \
207   (((__SOURCE__) == RCC_SDMMCCLKSOURCE_CLK48) || \
208    ((__SOURCE__) == RCC_SDMMCCLKSOURCE_PLL1))
209 
210 #define IS_RCC_RNGCLKSOURCE(__SOURCE__)  \
211   (((__SOURCE__) == RCC_RNGCLKSOURCE_HSI48)   || \
212    ((__SOURCE__) == RCC_RNGCLKSOURCE_HSI48_DIV2)  || \
213    ((__SOURCE__) == RCC_RNGCLKSOURCE_HSI))
214 
215 #if defined(SAES)
216 #define IS_RCC_SAESCLKSOURCE(__SOURCE__)  \
217   (((__SOURCE__) == RCC_SAESCLKSOURCE_SHSI)   || \
218    ((__SOURCE__) == RCC_SAESCLKSOURCE_SHSI_DIV2))
219 #endif /* SAES */
220 
221 #define IS_RCC_ADCDACCLKSOURCE(__SOURCE__)  \
222   (((__SOURCE__) == RCC_ADCDACCLKSOURCE_HCLK)   || \
223    ((__SOURCE__) == RCC_ADCDACCLKSOURCE_SYSCLK) || \
224    ((__SOURCE__) == RCC_ADCDACCLKSOURCE_PLL2)   || \
225    ((__SOURCE__) == RCC_ADCDACCLKSOURCE_HSE)     || \
226    ((__SOURCE__) == RCC_ADCDACCLKSOURCE_HSI)     || \
227    ((__SOURCE__) == RCC_ADCDACCLKSOURCE_MSIK))
228 
229 #define IS_RCC_MDF1CLKSOURCE(__SOURCE__)  \
230   (((__SOURCE__) == RCC_MDF1CLKSOURCE_HCLK) || \
231    ((__SOURCE__) == RCC_MDF1CLKSOURCE_PLL1) || \
232    ((__SOURCE__) == RCC_MDF1CLKSOURCE_PLL3) || \
233    ((__SOURCE__) == RCC_MDF1CLKSOURCE_PIN) || \
234    ((__SOURCE__) == RCC_MDF1CLKSOURCE_MSIK))
235 
236 #define IS_RCC_ADF1CLKSOURCE(__SOURCE__)  \
237   (((__SOURCE__) == RCC_ADF1CLKSOURCE_HCLK) || \
238    ((__SOURCE__) == RCC_ADF1CLKSOURCE_PLL1) || \
239    ((__SOURCE__) == RCC_ADF1CLKSOURCE_PLL3) || \
240    ((__SOURCE__) == RCC_ADF1CLKSOURCE_PIN) || \
241    ((__SOURCE__) == RCC_ADF1CLKSOURCE_MSIK))
242 
243 #define IS_RCC_OSPICLKSOURCE(__SOURCE__)  \
244   (((__SOURCE__) == RCC_OSPICLKSOURCE_SYSCLK) || \
245    ((__SOURCE__) == RCC_OSPICLKSOURCE_MSIK) || \
246    ((__SOURCE__) == RCC_OSPICLKSOURCE_PLL1) ||\
247    ((__SOURCE__) == RCC_OSPICLKSOURCE_PLL2))
248 
249 #if defined(HSPI1)
250 #define IS_RCC_HSPICLKSOURCE(__SOURCE__)  \
251   (((__SOURCE__) == RCC_HSPICLKSOURCE_SYSCLK) || \
252    ((__SOURCE__) == RCC_HSPICLKSOURCE_PLL1) || \
253    ((__SOURCE__) == RCC_HSPICLKSOURCE_PLL2) || \
254    ((__SOURCE__) == RCC_HSPICLKSOURCE_PLL3))
255 #endif /* HSPI1 */
256 
257 #define IS_RCC_ICLKCLKSOURCE(__SOURCE__)\
258   (((__SOURCE__) == RCC_ICLK_CLKSOURCE_HSI48)|| \
259    ((__SOURCE__) == RCC_ICLK_CLKSOURCE_PLL2) || \
260    ((__SOURCE__) == RCC_ICLK_CLKSOURCE_PLL1) || \
261    ((__SOURCE__) == RCC_ICLK_CLKSOURCE_MSIK))
262 
263 #define IS_RCC_SPI1CLKSOURCE(__SOURCE__) \
264   (((__SOURCE__) == RCC_SPI1CLKSOURCE_PCLK2) || \
265    ((__SOURCE__) == RCC_SPI1CLKSOURCE_SYSCLK) || \
266    ((__SOURCE__) == RCC_SPI1CLKSOURCE_HSI)|| \
267    ((__SOURCE__) == RCC_SPI1CLKSOURCE_MSIK))
268 
269 #define IS_RCC_SPI2CLKSOURCE(__SOURCE__) \
270   (((__SOURCE__) == RCC_SPI2CLKSOURCE_PCLK1) || \
271    ((__SOURCE__) == RCC_SPI2CLKSOURCE_SYSCLK) || \
272    ((__SOURCE__) == RCC_SPI2CLKSOURCE_HSI)|| \
273    ((__SOURCE__) == RCC_SPI2CLKSOURCE_MSIK))
274 
275 #define IS_RCC_SPI3CLKSOURCE(__SOURCE__) \
276   (((__SOURCE__) == RCC_SPI3CLKSOURCE_PCLK3) || \
277    ((__SOURCE__) == RCC_SPI3CLKSOURCE_SYSCLK) || \
278    ((__SOURCE__) == RCC_SPI3CLKSOURCE_HSI)|| \
279    ((__SOURCE__) == RCC_SPI3CLKSOURCE_MSIK))
280 
281 #define IS_RCC_DAC1CLKSOURCE(__SOURCE__) \
282   (((__SOURCE__) == RCC_DAC1CLKSOURCE_LSE) || \
283    ((__SOURCE__) == RCC_DAC1CLKSOURCE_LSI))
284 
285 #define IS_RCC_RTCCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_RTCCLKSOURCE_NO_CLK) || \
286                                          ((__SOURCE__) == RCC_RTCCLKSOURCE_LSE)    || \
287                                          ((__SOURCE__) == RCC_RTCCLKSOURCE_LSI)    || \
288                                          ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV32))
289 
290 #if defined(LTDC)
291 
292 #define IS_RCC_LTDCCLKSOURCE(__SOURCE__) \
293   (((__SOURCE__) == RCC_LTDCCLKSOURCE_PLL3) || \
294    ((__SOURCE__) == RCC_LTDCCLKSOURCE_PLL2))
295 
296 #endif /* LTDC */
297 
298 #if defined(DSI)
299 
300 #define IS_RCC_DSICLKSOURCE(__SOURCE__) \
301   (((__SOURCE__) == RCC_DSICLKSOURCE_PLL3) || \
302    ((__SOURCE__) == RCC_DSICLKSOURCE_DSIPHY))
303 
304 #endif /* DSI */
305 
306 #if defined(USB_OTG_HS)
307 
308 #define IS_RCC_USBPHYCLKSOURCE(__SOURCE__) \
309   (((__SOURCE__) == RCC_USBPHYCLKSOURCE_HSE) || \
310    ((__SOURCE__) == RCC_USBPHYCLKSOURCE_HSE_DIV2) || \
311    ((__SOURCE__) == RCC_USBPHYCLKSOURCE_PLL1) || \
312    ((__SOURCE__) == RCC_USBPHYCLKSOURCE_PLL1_DIV2))
313 
314 #endif /* USB_OTG_HS */
315 
316 #if defined(CRS)
317 
318 #define IS_RCC_CRS_SYNC_SOURCE(__SOURCE__) (((__SOURCE__) == RCC_CRS_SYNC_SOURCE_GPIO) || \
319                                             ((__SOURCE__) == RCC_CRS_SYNC_SOURCE_LSE) || \
320                                             ((__SOURCE__) == RCC_CRS_SYNC_SOURCE_USB))
321 
322 #define IS_RCC_CRS_SYNC_DIV(__DIV__)       (((__DIV__) == RCC_CRS_SYNC_DIV1) || ((__DIV__) == RCC_CRS_SYNC_DIV2) || \
323                                             ((__DIV__) == RCC_CRS_SYNC_DIV4) || ((__DIV__) == RCC_CRS_SYNC_DIV8) || \
324                                             ((__DIV__) == RCC_CRS_SYNC_DIV16) || ((__DIV__) == RCC_CRS_SYNC_DIV32) || \
325                                             ((__DIV__) == RCC_CRS_SYNC_DIV64) || ((__DIV__) == RCC_CRS_SYNC_DIV128))
326 
327 #define IS_RCC_CRS_SYNC_POLARITY(__POLARITY__) (((__POLARITY__) == RCC_CRS_SYNC_POLARITY_RISING) || \
328                                                 ((__POLARITY__) == RCC_CRS_SYNC_POLARITY_FALLING))
329 
330 #define IS_RCC_CRS_RELOADVALUE(__VALUE__)  (((__VALUE__) <= 0xFFFFU))
331 
332 #define IS_RCC_CRS_ERRORLIMIT(__VALUE__)   (((__VALUE__) <= 0xFFU))
333 
334 #define IS_RCC_CRS_HSI48CALIBRATION(__VALUE__) (((__VALUE__) <= 0x7FU))
335 
336 #define IS_RCC_CRS_FREQERRORDIR(__DIR__)   (((__DIR__) == RCC_CRS_FREQERRORDIR_UP) || \
337                                             ((__DIR__) == RCC_CRS_FREQERRORDIR_DOWN))
338 
339 #endif /* CRS */
340 
341 /**
342   * @}
343   */
344 
345 /* Private variables ---------------------------------------------------------*/
346 /* Private function prototypes -----------------------------------------------*/
347 /** @defgroup RCCEx_Private_Functions RCCEx Private Functions
348   * @{
349   */
350 static HAL_StatusTypeDef RCCEx_PLLSource_Enable(uint32_t PllSource);
351 static HAL_StatusTypeDef RCCEx_PLL2_Config(const RCC_PLL2InitTypeDef *Pll2);
352 static HAL_StatusTypeDef RCCEx_PLL3_Config(const RCC_PLL3InitTypeDef *Pll3);
353 /**
354   * @}
355   */
356 
357 /* Exported functions --------------------------------------------------------*/
358 
359 /** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions
360   * @{
361   */
362 
363 /** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions
364   *  @brief  Extended Peripheral Control functions
365   *
366 @verbatim
367  ===============================================================================
368                 ##### Extended Peripheral Control functions  #####
369  ===============================================================================
370     [..]
371     This subsection provides a set of functions allowing to control the RCC Clocks
372     frequencies.
373     [..]
374     (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to
375         select the RTC clock source; in this case the Backup domain will be reset in
376         order to modify the RTC Clock source, as consequence RTC registers (including
377         the backup registers) are set to their reset values.
378 
379 @endverbatim
380   * @{
381   */
382 /**
383   * @brief  Initialize the RCC extended peripherals clocks according to the specified
384   *         parameters in the RCC_PeriphCLKInitTypeDef.
385   * @param  pPeriphClkInit  pointer to an RCC_PeriphCLKInitTypeDef structure that
386   *         contains a field PeriphClockSelection which can be a combination of the following values:
387   *            @arg @ref RCC_PERIPHCLK_USART1 USART1 peripheral clock
388   *            @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock
389   *            @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock
390   *            @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock
391   *            @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock
392   *            @arg @ref RCC_PERIPHCLK_USART6 USART6 peripheral clock
393   *            @arg @ref RCC_PERIPHCLK_LPUART1 LPUART1 peripheral clock
394   *            @arg @ref RCC_PERIPHCLK_I2C1 I2C1 peripheral clock
395   *            @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock
396   *            @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock
397   *            @arg @ref RCC_PERIPHCLK_I2C4 I2C4 peripheral clock
398   *            @arg @ref RCC_PERIPHCLK_I2C5 I2C5 peripheral clock
399   *            @arg @ref RCC_PERIPHCLK_I2C6 I2C6 peripheral clock
400   *            @arg @ref RCC_PERIPHCLK_LPTIM34 LPTIM34 peripheral clock
401   *            @arg @ref RCC_PERIPHCLK_LPTIM2 LPTIM2 peripheral clock
402   *            @arg @ref RCC_PERIPHCLK_SAES SAES peripheral clock (*)
403   *            @arg @ref RCC_PERIPHCLK_SAI1 SAI1 peripheral clock
404   *            @arg @ref RCC_PERIPHCLK_SAI2 SAI2 peripheral clock
405   *            @arg @ref RCC_PERIPHCLK_ADCDAC ADC1 ADC2 ADC4 DAC1 peripheral clock
406   *            @arg @ref RCC_PERIPHCLK_MDF1 MDF1 peripheral clock
407   *            @arg @ref RCC_PERIPHCLK_ADF1 ADF1 peripheral clock
408   *            @arg @ref RCC_PERIPHCLK_RTC RTC peripheral clock
409   *            @arg @ref RCC_PERIPHCLK_RNG RNG peripheral clock
410   *            @arg @ref RCC_PERIPHCLK_ICLK ICLK peripheral clock
411   *            @arg @ref RCC_PERIPHCLK_SDMMC SDMMC1 peripheral clock
412   *            @arg @ref RCC_PERIPHCLK_SPI1 SPI1 peripheral clock
413   *            @arg @ref RCC_PERIPHCLK_SPI2 SPI2 peripheral clock
414   *            @arg @ref RCC_PERIPHCLK_SPI3 SPI3 peripheral clock
415   *            @arg @ref RCC_PERIPHCLK_OSPI OSPI peripheral clock
416   *            @arg @ref RCC_PERIPHCLK_FDCAN1 FDCAN1 peripheral clock
417   *            @arg @ref RCC_PERIPHCLK_DAC1 DAC1 peripheral clock
418   *            @arg @ref RCC_PERIPHCLK_HSPI HSPI peripheral clock
419   *            @arg @ref RCC_PERIPHCLK_LTDC LTDC peripheral clock
420   *            @arg @ref RCC_PERIPHCLK_DSI DSI peripheral clock
421   *            @arg @ref RCC_PERIPHCLK_USBPHY USBPHY peripheral clock
422   *
423   * @note   Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select
424   *         the RTC clock source: in this case the access to Backup domain is enabled.
425   *
426   * @retval HAL status
427   *
428   *         (*) value not defined in all devices.
429   */
HAL_RCCEx_PeriphCLKConfig(const RCC_PeriphCLKInitTypeDef * pPeriphClkInit)430 HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(const RCC_PeriphCLKInitTypeDef  *pPeriphClkInit)
431 {
432   uint32_t tmpregister;
433   uint32_t tickstart;
434   HAL_StatusTypeDef ret = HAL_OK;      /* Intermediate status */
435   HAL_StatusTypeDef status = HAL_OK;   /* Final status */
436 
437   /* Check the parameters */
438   assert_param(IS_RCC_PERIPHCLOCK(pPeriphClkInit->PeriphClockSelection));
439 
440   /*-------------------------- USART1 clock source configuration -------------------*/
441   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART1) == RCC_PERIPHCLK_USART1)
442   {
443     /* Check the parameters */
444     assert_param(IS_RCC_USART1CLKSOURCE(pPeriphClkInit->Usart1ClockSelection));
445 
446     /* Configure the USART1 clock source */
447     __HAL_RCC_USART1_CONFIG(pPeriphClkInit->Usart1ClockSelection);
448   }
449 
450 #if defined(USART2)
451   /*-------------------------- USART2 clock source configuration -------------------*/
452   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART2) == RCC_PERIPHCLK_USART2)
453   {
454     /* Check the parameters */
455     assert_param(IS_RCC_USART2CLKSOURCE(pPeriphClkInit->Usart2ClockSelection));
456 
457     /* Configure the USART2 clock source */
458     __HAL_RCC_USART2_CONFIG(pPeriphClkInit->Usart2ClockSelection);
459   }
460 #endif /* USART2 */
461 
462   /*-------------------------- USART3 clock source configuration -------------------*/
463   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART3) == RCC_PERIPHCLK_USART3)
464   {
465     /* Check the parameters */
466     assert_param(IS_RCC_USART3CLKSOURCE(pPeriphClkInit->Usart3ClockSelection));
467 
468     /* Configure the USART3 clock source */
469     __HAL_RCC_USART3_CONFIG(pPeriphClkInit->Usart3ClockSelection);
470   }
471 
472   /*-------------------------- UART4 clock source configuration --------------------*/
473   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART4) == RCC_PERIPHCLK_UART4)
474   {
475     /* Check the parameters */
476     assert_param(IS_RCC_UART4CLKSOURCE(pPeriphClkInit->Uart4ClockSelection));
477 
478     /* Configure the UART4 clock source */
479     __HAL_RCC_UART4_CONFIG(pPeriphClkInit->Uart4ClockSelection);
480   }
481 
482   /*-------------------------- UART5 clock source configuration --------------------*/
483   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART5) == RCC_PERIPHCLK_UART5)
484   {
485     /* Check the parameters */
486     assert_param(IS_RCC_UART5CLKSOURCE(pPeriphClkInit->Uart5ClockSelection));
487 
488     /* Configure the UART5 clock source */
489     __HAL_RCC_UART5_CONFIG(pPeriphClkInit->Uart5ClockSelection);
490   }
491 #if defined(USART6)
492   /*-------------------------- USART6 clock source configuration -------------------*/
493   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART6) == RCC_PERIPHCLK_USART6)
494   {
495     /* Check the parameters */
496     assert_param(IS_RCC_USART6CLKSOURCE(pPeriphClkInit->Usart6ClockSelection));
497 
498     /* Configure the USART6 clock source */
499     __HAL_RCC_USART6_CONFIG(pPeriphClkInit->Usart6ClockSelection);
500   }
501 #endif /* USART6 */
502 
503   /*-------------------------- LPUART1 clock source configuration ------------------*/
504   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1)
505   {
506     /* Check the parameters */
507     assert_param(IS_RCC_LPUART1CLKSOURCE(pPeriphClkInit->Lpuart1ClockSelection));
508 
509     /* Configure the LPUART1 clock source */
510     __HAL_RCC_LPUART1_CONFIG(pPeriphClkInit->Lpuart1ClockSelection);
511   }
512 
513   /*-------------------------- I2C1 clock source configuration ---------------------*/
514   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C1) == RCC_PERIPHCLK_I2C1)
515   {
516     /* Check the parameters */
517     assert_param(IS_RCC_I2C1CLKSOURCE(pPeriphClkInit->I2c1ClockSelection));
518 
519     /* Configure the I2C1 clock source */
520     __HAL_RCC_I2C1_CONFIG(pPeriphClkInit->I2c1ClockSelection);
521   }
522 
523   /*-------------------------- I2C2 clock source configuration ---------------------*/
524   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C2) == RCC_PERIPHCLK_I2C2)
525   {
526     /* Check the parameters */
527     assert_param(IS_RCC_I2C2CLKSOURCE(pPeriphClkInit->I2c2ClockSelection));
528 
529     /* Configure the I2C2 clock source */
530     __HAL_RCC_I2C2_CONFIG(pPeriphClkInit->I2c2ClockSelection);
531   }
532 
533   /*-------------------------- I2C3 clock source configuration ---------------------*/
534   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C3) == RCC_PERIPHCLK_I2C3)
535   {
536     /* Check the parameters */
537     assert_param(IS_RCC_I2C3CLKSOURCE(pPeriphClkInit->I2c3ClockSelection));
538 
539     /* Configure the I2C3 clock source */
540     __HAL_RCC_I2C3_CONFIG(pPeriphClkInit->I2c3ClockSelection);
541   }
542 
543   /*-------------------------- I2C4 clock source configuration ---------------------*/
544   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C4) == RCC_PERIPHCLK_I2C4)
545   {
546     /* Check the parameters */
547     assert_param(IS_RCC_I2C4CLKSOURCE(pPeriphClkInit->I2c4ClockSelection));
548 
549     /* Configure the I2C4 clock source */
550     __HAL_RCC_I2C4_CONFIG(pPeriphClkInit->I2c4ClockSelection);
551   }
552 
553 #if defined(I2C5)
554   /*-------------------------- I2C5 clock source configuration ---------------------*/
555   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C5) == RCC_PERIPHCLK_I2C5)
556   {
557     /* Check the parameters */
558     assert_param(IS_RCC_I2C5CLKSOURCE(pPeriphClkInit->I2c5ClockSelection));
559 
560     /* Configure the I2C5 clock source */
561     __HAL_RCC_I2C5_CONFIG(pPeriphClkInit->I2c5ClockSelection);
562   }
563 #endif /* I2C5 */
564 
565 #if defined(I2C6)
566   /*-------------------------- I2C6 clock source configuration ---------------------*/
567   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C6) == RCC_PERIPHCLK_I2C6)
568   {
569     /* Check the parameters */
570     assert_param(IS_RCC_I2C6CLKSOURCE(pPeriphClkInit->I2c6ClockSelection));
571 
572     /* Configure the I2C6 clock source */
573     __HAL_RCC_I2C6_CONFIG(pPeriphClkInit->I2c6ClockSelection);
574   }
575 #endif /* I2C6 */
576 
577   /*-------------------------- LPTIM1 clock source configuration -------------------*/
578   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == (RCC_PERIPHCLK_LPTIM1))
579   {
580     assert_param(IS_RCC_LPTIM1CLK(pPeriphClkInit->Lptim1ClockSelection));
581     __HAL_RCC_LPTIM1_CONFIG(pPeriphClkInit->Lptim1ClockSelection);
582   }
583 
584   /*-------------------------- LPTIM2 clock source configuration -------------------*/
585   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM2) == (RCC_PERIPHCLK_LPTIM2))
586   {
587     assert_param(IS_RCC_LPTIM2CLK(pPeriphClkInit->Lptim2ClockSelection));
588     __HAL_RCC_LPTIM2_CONFIG(pPeriphClkInit->Lptim2ClockSelection);
589   }
590 
591   /*-------------------------- LPTIM34 clock source configuration -------------------*/
592   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM34) == (RCC_PERIPHCLK_LPTIM34))
593   {
594     assert_param(IS_RCC_LPTIM34CLK(pPeriphClkInit->Lptim34ClockSelection));
595     __HAL_RCC_LPTIM34_CONFIG(pPeriphClkInit->Lptim34ClockSelection);
596   }
597 
598   /*-------------------------- SAI1 clock source configuration ---------------------*/
599   if ((((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1))
600   {
601     /* Check the parameters */
602     assert_param(IS_RCC_SAI1CLK(pPeriphClkInit->Sai1ClockSelection));
603 
604     switch (pPeriphClkInit->Sai1ClockSelection)
605     {
606       case RCC_SAI1CLKSOURCE_PLL1:      /* PLL is used as clock source for SAI1*/
607         /* Enable SAI Clock output generated from System PLL  */
608         __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVP);
609         /* SAI1 clock source config set later after clock selection check */
610         break;
611 
612       case RCC_SAI1CLKSOURCE_PLL2:  /* PLL2 is used as clock source for SAI1*/
613         /* PLL2 P input clock, parameters M, N & P configuration and clock output (PLL2ClockOut) */
614         ret = RCCEx_PLL2_Config(&(pPeriphClkInit->PLL2));
615         /* SAI1 clock source config set later after clock selection check */
616         break;
617 
618       case RCC_SAI1CLKSOURCE_PLL3:  /* PLL3 is used as clock source for SAI1*/
619         /* PLL3 P input clock, parameters M, N & P configuration clock output (PLL3ClockOut) */
620         ret = RCCEx_PLL3_Config(&(pPeriphClkInit->PLL3));
621         /* SAI1 clock source config set later after clock selection check */
622         break;
623 
624       case RCC_SAI1CLKSOURCE_PIN:      /* External clock is used as source of SAI1 clock*/
625         /* SAI1 clock source configuration done later after clock selection check */
626         break;
627 
628       case RCC_SAI1CLKSOURCE_HSI:      /* HSI is used as source of SAI1 clock*/
629         /* SAI1 clock source config set later after clock selection check */
630         break;
631 
632       default:
633         ret = HAL_ERROR;
634         break;
635     }
636 
637     if (ret == HAL_OK)
638     {
639       /* Set the source of SAI1 clock*/
640       __HAL_RCC_SAI1_CONFIG(pPeriphClkInit->Sai1ClockSelection);
641     }
642     else
643     {
644       /* set overall return value */
645       status = ret;
646     }
647   }
648 
649 #if defined(SAI2)
650   /*-------------------------- SAI2 clock source configuration ---------------------*/
651   if ((((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2))
652   {
653     /* Check the parameters */
654     assert_param(IS_RCC_SAI2CLK(pPeriphClkInit->Sai2ClockSelection));
655 
656     switch (pPeriphClkInit->Sai2ClockSelection)
657     {
658       case RCC_SAI2CLKSOURCE_PLL1:      /* PLL is used as clock source for SAI2*/
659         /* Enable SAI Clock output generated from System PLL  */
660         __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVP);
661         /* SAI2 clock source config set later after clock selection check */
662         break;
663 
664       case RCC_SAI2CLKSOURCE_PLL2: /* PLL2 is used as clock source for SAI2*/
665         /* PLL2 P input clock, parameters M, N & P configuration and clock output (PLL2ClockOut) */
666         ret = RCCEx_PLL2_Config(&(pPeriphClkInit->PLL2));
667         /* SAI2 clock source config set later after clock selection check */
668         break;
669 
670       case RCC_SAI2CLKSOURCE_PLL3:  /* PLL3 is used as clock source for SAI2*/
671         /* PLL3 P input clock, parameters M, N & P configuration and clock output (PLL3ClockOut) */
672         ret = RCCEx_PLL3_Config(&(pPeriphClkInit->PLL3));
673         /* SAI2 clock source config set later after clock selection check */
674         break;
675 
676       case RCC_SAI2CLKSOURCE_PIN:      /* External clock is used as source of SAI2 clock*/
677         /* SAI2 clock source configuration done later after clock selection check */
678         break;
679       case RCC_SAI2CLKSOURCE_HSI:      /* HSI is used as source of SAI2 clock*/
680         /* SAI2 clock source config set later after clock selection check */
681         break;
682 
683       default:
684         ret = HAL_ERROR;
685         break;
686     }
687 
688     if (ret == HAL_OK)
689     {
690       /* Set the source of SAI2 clock*/
691       __HAL_RCC_SAI2_CONFIG(pPeriphClkInit->Sai2ClockSelection);
692     }
693     else
694     {
695       /* set overall return value */
696       status = ret;
697     }
698   }
699 #endif /* SAI2 */
700 
701   /*-------------------------- ADCDAC clock source configuration ----------------------*/
702   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADCDAC) == RCC_PERIPHCLK_ADCDAC)
703   {
704     /* Check the parameters */
705     assert_param(IS_RCC_ADCDACCLKSOURCE(pPeriphClkInit->AdcDacClockSelection));
706 
707     switch (pPeriphClkInit->AdcDacClockSelection)
708     {
709       case RCC_ADCDACCLKSOURCE_PLL2:
710         /* PLL2 input clock, parameters M, N,P, & R configuration and clock output (PLL2ClockOut) */
711         ret = RCCEx_PLL2_Config(&(pPeriphClkInit->PLL2));
712         break;
713 
714       case RCC_ADCDACCLKSOURCE_SYSCLK:
715       case RCC_ADCDACCLKSOURCE_HCLK:
716       case RCC_ADCDACCLKSOURCE_HSE:
717       case RCC_ADCDACCLKSOURCE_HSI:
718       case RCC_ADCDACCLKSOURCE_MSIK:
719         break;
720       default:
721         ret = HAL_ERROR;
722         break;
723     }
724 
725     if (ret == HAL_OK)
726     {
727       /* Configure the ADC1 interface clock source */
728       __HAL_RCC_ADCDAC_CONFIG(pPeriphClkInit->AdcDacClockSelection);
729     }
730     else
731     {
732       /* set overall return value */
733       status = ret;
734     }
735   }
736 
737   /*-------------------------- MDF1 clock source configuration -------------------*/
738   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_MDF1) == RCC_PERIPHCLK_MDF1)
739   {
740     /* Check the parameters */
741     assert_param(IS_RCC_MDF1CLKSOURCE(pPeriphClkInit->Mdf1ClockSelection));
742 
743     switch (pPeriphClkInit->Mdf1ClockSelection)
744     {
745       case RCC_MDF1CLKSOURCE_PLL1:
746         /* Enable PLL1 Clock output generated from System PLL  */
747         __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVP);
748         break;
749       case RCC_MDF1CLKSOURCE_PLL3:
750         /* PLL3 Q input clock, parameters M, N & Q configuration and clock output (PLL3ClockOut) */
751         ret = RCCEx_PLL3_Config(&(pPeriphClkInit->PLL3));
752         break;
753       case RCC_MDF1CLKSOURCE_HCLK:
754         break;
755       case RCC_MDF1CLKSOURCE_PIN:
756         break;
757       case RCC_MDF1CLKSOURCE_MSIK:
758         break;
759       default:
760         ret = HAL_ERROR;
761         break;
762     }
763     if (ret == HAL_OK)
764     {
765       /* Configure the MDF1 interface clock source */
766       __HAL_RCC_MDF1_CONFIG(pPeriphClkInit->Mdf1ClockSelection);
767     }
768     else
769     {
770       /* set overall return value */
771       status = ret;
772     }
773   }
774 
775   /*-------------------------- ADF1 clock source configuration -------------------*/
776   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADF1) == RCC_PERIPHCLK_ADF1)
777   {
778     /* Check the parameters */
779     assert_param(IS_RCC_ADF1CLKSOURCE(pPeriphClkInit->Adf1ClockSelection));
780     switch (pPeriphClkInit->Adf1ClockSelection)
781     {
782       case RCC_ADF1CLKSOURCE_PLL1:
783         /* Enable PLL1 Clock output generated from System PLL  */
784         __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVP);
785         break;
786       case RCC_ADF1CLKSOURCE_PLL3:
787         /* PLL3 Q input clock, parameters M, N & Q configuration and clock output (PLL3ClockOut) */
788         ret = RCCEx_PLL3_Config(&(pPeriphClkInit->PLL3));
789         break;
790       case RCC_ADF1CLKSOURCE_HCLK:
791         break;
792       case RCC_ADF1CLKSOURCE_PIN:
793         break;
794       case RCC_ADF1CLKSOURCE_MSIK:
795         break;
796       default:
797         ret = HAL_ERROR;
798         break;
799     }
800     if (ret == HAL_OK)
801     {
802       /* Configure the ADF1 interface clock source */
803       __HAL_RCC_ADF1_CONFIG(pPeriphClkInit->Adf1ClockSelection);
804     }
805     else
806     {
807       /* set overall return value */
808       status = ret;
809     }
810   }
811 
812   /*-------------------------- RTC clock source configuration ----------------------*/
813   if ((pPeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_RTC) == RCC_PERIPHCLK_RTC)
814   {
815     FlagStatus       pwrclkchanged = RESET;
816     /* Check for RTC Parameters used to output RTCCLK */
817     assert_param(IS_RCC_RTCCLKSOURCE(pPeriphClkInit->RTCClockSelection));
818     /* Enable Power Clock */
819     if (__HAL_RCC_PWR_IS_CLK_DISABLED())
820     {
821       __HAL_RCC_PWR_CLK_ENABLE();
822       pwrclkchanged = SET;
823     }
824     /* Enable write access to Backup domain */
825     SET_BIT(PWR->DBPR, PWR_DBPR_DBP);
826 
827     /* Wait for Backup domain Write protection disable */
828     tickstart = HAL_GetTick();
829 
830     while (HAL_IS_BIT_CLR(PWR->DBPR, PWR_DBPR_DBP))
831     {
832       if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE)
833       {
834         ret = HAL_TIMEOUT;
835         break;
836       }
837     }
838 
839     if (ret == HAL_OK)
840     {
841       /* Reset the Backup domain only if the RTC Clock source selection is modified from default */
842       tmpregister = READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL);
843 
844       if ((tmpregister != RCC_RTCCLKSOURCE_NO_CLK) && (tmpregister != pPeriphClkInit->RTCClockSelection))
845       {
846         /* Store the content of BDCR register before the reset of Backup Domain */
847         tmpregister = READ_BIT(RCC->BDCR, ~(RCC_BDCR_RTCSEL));
848         /* RTC Clock selection can be changed only if the Backup Domain is reset */
849         __HAL_RCC_BACKUPRESET_FORCE();
850         __HAL_RCC_BACKUPRESET_RELEASE();
851         /* Restore the Content of BDCR register */
852         RCC->BDCR = tmpregister;
853       }
854 
855       /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */
856       if (HAL_IS_BIT_SET(tmpregister, RCC_BDCR_LSEON))
857       {
858         /* Get Start Tick*/
859         tickstart = HAL_GetTick();
860 
861         /* Wait till LSE is ready */
862         while (READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == 0U)
863         {
864           if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)
865           {
866             ret = HAL_TIMEOUT;
867             break;
868           }
869         }
870       }
871 
872       if (ret == HAL_OK)
873       {
874         /* Apply new RTC clock source selection */
875         __HAL_RCC_RTC_CONFIG(pPeriphClkInit->RTCClockSelection);
876       }
877       else
878       {
879         /* set overall return value */
880         status = ret;
881       }
882     }
883     else
884     {
885       /* set overall return value */
886       status = ret;
887     }
888 
889     /* Restore clock configuration if changed */
890     if (pwrclkchanged == SET)
891     {
892       __HAL_RCC_PWR_CLK_DISABLE();
893     }
894   }
895 
896   /*-------------------------------------- ICLK Configuration -----------------------------------*/
897   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ICLK) == RCC_PERIPHCLK_ICLK)
898   {
899     /* Check the parameters */
900     assert_param(IS_RCC_ICLKCLKSOURCE(pPeriphClkInit->IclkClockSelection));
901 
902     switch (pPeriphClkInit->IclkClockSelection)
903     {
904       case RCC_ICLK_CLKSOURCE_PLL2:
905         /* PLL2 input clock, parameters M, N,P,Q & R configuration and clock output (PLL2ClockOut) */
906         ret = RCCEx_PLL2_Config(&(pPeriphClkInit->PLL2));
907         break;
908       case RCC_ICLK_CLKSOURCE_PLL1:
909         /* Enable ICLK Clock output generated from System PLL  */
910         __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
911         break;
912       case RCC_ICLK_CLKSOURCE_HSI48:
913         break;
914       case RCC_ICLK_CLKSOURCE_MSIK:
915         break;
916       default:
917         ret = HAL_ERROR;
918         break;
919     }
920     if (ret == HAL_OK)
921     {
922       /* Configure the CLK48 source */
923       __HAL_RCC_CLK48_CONFIG(pPeriphClkInit->IclkClockSelection);
924     }
925     else
926     {
927       /* set overall return value */
928       status = ret;
929     }
930   }
931 
932   /*------------------------------ RNG Configuration -------------------------*/
933   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RNG) == RCC_PERIPHCLK_RNG)
934   {
935 
936     /* Check the parameters */
937     assert_param(IS_RCC_RNGCLKSOURCE(pPeriphClkInit->RngClockSelection));
938 
939     switch (pPeriphClkInit->RngClockSelection)
940     {
941       case RCC_RNGCLKSOURCE_HSI48_DIV2: /* HSI48/2 is used as clock source for RNG*/
942         /* RNG clock source configuration done later after clock selection check */
943         break;
944       case RCC_RNGCLKSOURCE_HSI: /* HSI is used as clock source for RNG*/
945         /* RNG clock source configuration done later after clock selection check */
946         break;
947       case RCC_RNGCLKSOURCE_HSI48:
948         /* HSI48 oscillator is used as source of RNG clock */
949         /* RNG clock source configuration done later after clock selection check */
950         break;
951       default:
952         ret = HAL_ERROR;
953         break;
954     }
955     if (ret == HAL_OK)
956     {
957       /* Set the source of RNG clock*/
958       __HAL_RCC_RNG_CONFIG(pPeriphClkInit->RngClockSelection);
959     }
960     else
961     {
962       /* set overall return value */
963       status = ret;
964     }
965   }
966 
967 #if defined(SAES)
968   /*-------------------------- SAES clock source configuration ----------------*/
969   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAES) == RCC_PERIPHCLK_SAES)
970   {
971     /* Check the parameters */
972     assert_param(IS_RCC_SAESCLKSOURCE(pPeriphClkInit->SaesClockSelection));
973 
974     /* Configure the SAES clock source */
975     __HAL_RCC_SAES_CONFIG(pPeriphClkInit->SaesClockSelection);
976   }
977 #endif /* SAES */
978 
979   /*-------------------------- SDMMC1/2 clock source configuration -------------------*/
980   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDMMC) == (RCC_PERIPHCLK_SDMMC))
981   {
982     /* Check the parameters */
983     assert_param(IS_RCC_SDMMCCLKSOURCE(pPeriphClkInit->SdmmcClockSelection));
984 
985     if (pPeriphClkInit->SdmmcClockSelection == RCC_SDMMCCLKSOURCE_PLL1)
986     {
987       /* Enable PLL1 P CLK output */
988       __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVP);
989     }
990 
991     /* Configure the SDMMC1/2 clock source */
992     __HAL_RCC_SDMMC_CONFIG(pPeriphClkInit->SdmmcClockSelection);
993   }
994 
995   /*-------------------------- SPI1 clock source configuration ----------------*/
996   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPI1) == RCC_PERIPHCLK_SPI1)
997   {
998     /* Check the parameters */
999     assert_param(IS_RCC_SPI1CLKSOURCE(pPeriphClkInit->Spi1ClockSelection));
1000 
1001     /* Configure the SPI1 clock source */
1002     __HAL_RCC_SPI1_CONFIG(pPeriphClkInit->Spi1ClockSelection);
1003   }
1004 
1005   /*-------------------------- SPI2 clock source configuration ----------------*/
1006   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPI2) == RCC_PERIPHCLK_SPI2)
1007   {
1008     /* Check the parameters */
1009     assert_param(IS_RCC_SPI2CLKSOURCE(pPeriphClkInit->Spi2ClockSelection));
1010 
1011     /* Configure the SPI2 clock source */
1012     __HAL_RCC_SPI2_CONFIG(pPeriphClkInit->Spi2ClockSelection);
1013   }
1014 
1015   /*-------------------------- SPI3 clock source configuration ----------------*/
1016   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPI3) == RCC_PERIPHCLK_SPI3)
1017   {
1018     /* Check the parameters */
1019     assert_param(IS_RCC_SPI3CLKSOURCE(pPeriphClkInit->Spi3ClockSelection));
1020 
1021     /* Configure the SPI3 clock source */
1022     __HAL_RCC_SPI3_CONFIG(pPeriphClkInit->Spi3ClockSelection);
1023   }
1024 
1025   /*-------------------------- OctoSPIx clock source configuration ----------------*/
1026   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_OSPI) == RCC_PERIPHCLK_OSPI)
1027   {
1028     /* Check the parameters */
1029     assert_param(IS_RCC_OSPICLKSOURCE(pPeriphClkInit->OspiClockSelection));
1030 
1031     if (pPeriphClkInit->OspiClockSelection == RCC_OSPICLKSOURCE_PLL1)
1032     {
1033       /* Enable PLL1 Q CLK output */
1034       __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
1035     }
1036     if (pPeriphClkInit->OspiClockSelection == RCC_OSPICLKSOURCE_PLL2)
1037     {
1038       /* PLL2 input clock, parameters M, N & Q configuration and clock output (PLL2ClockOut) */
1039       ret = RCCEx_PLL2_Config(&(pPeriphClkInit->PLL2));
1040     }
1041     if (ret == HAL_OK)
1042     {
1043       /* Configure the OctoSPI clock source */
1044       __HAL_RCC_OSPI_CONFIG(pPeriphClkInit->OspiClockSelection);
1045     }
1046     else
1047     {
1048       /* set overall return value */
1049       status = ret;
1050     }
1051   }
1052 
1053 #if defined(HSPI1)
1054   /*-------------------------- HSPIx kernel clock source configuration ----------------*/
1055   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_HSPI) == RCC_PERIPHCLK_HSPI)
1056   {
1057 
1058     /* Check the parameters */
1059     assert_param(IS_RCC_HSPICLKSOURCE(pPeriphClkInit->HspiClockSelection));
1060 
1061     switch (pPeriphClkInit->HspiClockSelection)
1062     {
1063       case RCC_HSPICLKSOURCE_SYSCLK:  /* SYSCLK is used as clock source for HSPI kernel clock*/
1064         /* HSPI kernel clock source config set later after clock selection check */
1065         break;
1066 
1067       case RCC_HSPICLKSOURCE_PLL1:  /* PLL1 is used as clock source for HSPI kernel clock*/
1068         /* Enable 48M2 Clock output generated from System PLL . */
1069         __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
1070         /* HSPI kernel clock source config set later after clock selection check */
1071         break;
1072 
1073       case RCC_HSPICLKSOURCE_PLL2:  /* PLL2 is used as clock source for HSPI kernel clock*/
1074         /* PLL2 input clock, parameters M, N & Q configuration and clock output (PLL2ClockOut) */
1075         ret = RCCEx_PLL2_Config(&(pPeriphClkInit->PLL2));
1076         /* HSPI kernel clock source config set later after clock selection check */
1077         break;
1078 
1079       case RCC_HSPICLKSOURCE_PLL3:  /* PLL3 is used as clock source for HSPI kernel clock*/
1080         /* PLL3 input clock, parameters M, N & R configuration and clock output (PLL3ClockOut) */
1081         ret = RCCEx_PLL3_Config(&(pPeriphClkInit->PLL3));
1082         /* HSPI kernel clock source config set later after clock selection check */
1083         break;
1084 
1085       default:
1086         ret = HAL_ERROR;
1087         break;
1088     }
1089 
1090     if (ret == HAL_OK)
1091     {
1092       /* Set the source of HSPI kernel clock*/
1093       __HAL_RCC_HSPI_CONFIG(pPeriphClkInit->HspiClockSelection);
1094     }
1095     else
1096     {
1097       /* set overall return value */
1098       status = ret;
1099     }
1100   }
1101 #endif /* defined(HSPI1) */
1102 
1103   /*-------------------------- FDCAN1 kernel clock source configuration -------------*/
1104   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FDCAN1) == (RCC_PERIPHCLK_FDCAN1))
1105   {
1106     assert_param(IS_RCC_FDCAN1CLK(pPeriphClkInit->Fdcan1ClockSelection));
1107 
1108     switch (pPeriphClkInit->Fdcan1ClockSelection)
1109     {
1110       case RCC_FDCAN1CLKSOURCE_HSE:      /* HSE is used as source of FDCAN1 kernel clock*/
1111         /* FDCAN1 kernel clock source config set later after clock selection check */
1112         break;
1113       case RCC_FDCAN1CLKSOURCE_PLL1:      /* PLL1 is used as clock source for FDCAN1 kernel clock*/
1114         /* Enable 48M2 Clock output generated from System PLL  */
1115         __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVQ);
1116         /* FDCAN1 kernel clock source config set later after clock selection check */
1117         break;
1118       case RCC_FDCAN1CLKSOURCE_PLL2:  /* PLL2 is used as clock source for FDCAN1 kernel clock*/
1119         /* PLL2 input clock, parameters M, N & P configuration and clock output (PLL2ClockOut) */
1120         ret = RCCEx_PLL2_Config(&(pPeriphClkInit->PLL2));
1121         /* FDCAN1 kernel clock source config set later after clock selection check */
1122         break;
1123       default:
1124         ret = HAL_ERROR;
1125         break;
1126     }
1127     if (ret == HAL_OK)
1128     {
1129       /* Set the source of FDCAN1 kernel clock*/
1130       __HAL_RCC_FDCAN1_CONFIG(pPeriphClkInit->Fdcan1ClockSelection);
1131     }
1132     else
1133     {
1134       /* set overall return value */
1135       status = ret;
1136     }
1137   }
1138 
1139   /*-------------------------- DAC1 clock source configuration ----------------*/
1140   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DAC1) == RCC_PERIPHCLK_DAC1)
1141   {
1142 
1143     /* Check the parameters */
1144     assert_param(IS_RCC_DAC1CLKSOURCE(pPeriphClkInit->Dac1ClockSelection));
1145 
1146     /* Configure the DAC1 clock source */
1147     __HAL_RCC_DAC1_CONFIG(pPeriphClkInit->Dac1ClockSelection);
1148   }
1149 
1150 #if defined(LTDC)
1151 
1152   /*-------------------------- LTDC clock source configuration ----------------*/
1153   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)
1154   {
1155 
1156     /* Check the parameters */
1157     assert_param(IS_RCC_LTDCCLKSOURCE(pPeriphClkInit->LtdcClockSelection));
1158 
1159     switch (pPeriphClkInit->LtdcClockSelection)
1160     {
1161       case RCC_LTDCCLKSOURCE_PLL2:  /* PLL2 is used as clock source for LTDC clock*/
1162         /* PLL2 input clock, parameters M, N & P configuration and clock output (PLL2ClockOut) */
1163         ret = RCCEx_PLL2_Config(&(pPeriphClkInit->PLL2));
1164         /* LTDC clock source config set later after clock selection check */
1165         break;
1166 
1167       case RCC_LTDCCLKSOURCE_PLL3:  /* PLL3 is used as clock source for LTDC clock*/
1168         /* PLL3 input clock, parameters M, N & P configuration and clock output (PLL3ClockOut) */
1169         ret = RCCEx_PLL3_Config(&(pPeriphClkInit->PLL3));
1170         /* LTDC clock source config set later after clock selection check */
1171         break;
1172 
1173       default:
1174         ret = HAL_ERROR;
1175         break;
1176     }
1177 
1178     if (ret == HAL_OK)
1179     {
1180       /* Set the source of LTDC clock*/
1181       __HAL_RCC_LTDC_CONFIG(pPeriphClkInit->LtdcClockSelection);
1182     }
1183     else
1184     {
1185       /* set overall return value */
1186       status = ret;
1187     }
1188   }
1189 
1190 #endif /* defined(LTDC) */
1191 
1192 #if defined(DSI)
1193 
1194   /*-------------------------- DSI clock source configuration ----------------*/
1195   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DSI) == RCC_PERIPHCLK_DSI)
1196   {
1197 
1198     /* Check the parameters */
1199     assert_param(IS_RCC_DSICLKSOURCE(pPeriphClkInit->DsiClockSelection));
1200 
1201     if (pPeriphClkInit->DsiClockSelection == RCC_DSICLKSOURCE_PLL3)
1202     {
1203       /* PLL3 is used as clock source for DSI clock*/
1204       /* PLL3 input clock, parameters M, N & P configuration and clock output (PLL3ClockOut) */
1205       ret = RCCEx_PLL3_Config(&(pPeriphClkInit->PLL3));
1206     }
1207 
1208     if (ret == HAL_OK)
1209     {
1210       /* Set the source of DSI clock*/
1211       __HAL_RCC_DSI_CONFIG(pPeriphClkInit->DsiClockSelection);
1212     }
1213     else
1214     {
1215       /* set overall return value */
1216       status = ret;
1217     }
1218   }
1219 
1220 #endif /* defined(DSI) */
1221 
1222 #if defined(USB_OTG_HS)
1223 
1224   /*-------------------------- USB PHY clock source configuration ----------------*/
1225   if (((pPeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USBPHY) == RCC_PERIPHCLK_USBPHY)
1226   {
1227 
1228     /* Check the parameters */
1229     assert_param(IS_RCC_USBPHYCLKSOURCE(pPeriphClkInit->UsbPhyClockSelection));
1230 
1231     switch (pPeriphClkInit->UsbPhyClockSelection)
1232     {
1233       case RCC_USBPHYCLKSOURCE_HSE:       /* HSE is used as clock source for USB PHY clock*/
1234       case RCC_USBPHYCLKSOURCE_HSE_DIV2:  /* HSE div 2 is used as clock source for USB PHY clock*/
1235         /* USB-PHY clock source config set later after clock selection check */
1236         break;
1237 
1238       case RCC_USBPHYCLKSOURCE_PLL1:      /* PLL1 P divider clock selected as USB PHY clock */
1239       case RCC_USBPHYCLKSOURCE_PLL1_DIV2: /* PLL1 P divider clock div 2 selected as USB PHY clock */
1240         /* Enable P Clock output generated from System PLL . */
1241         __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL1_DIVP);
1242         /* USB-PHY clock source config set later after clock selection check */
1243         break;
1244 
1245       default:
1246         ret = HAL_ERROR;
1247         break;
1248     }
1249 
1250     if (ret == HAL_OK)
1251     {
1252       /* Set the source of USBPHY clock*/
1253       __HAL_RCC_USBPHY_CONFIG(pPeriphClkInit->UsbPhyClockSelection);
1254     }
1255     else
1256     {
1257       /* set overall return value */
1258       status = ret;
1259     }
1260   }
1261 
1262 #endif /* defined(USB_OTG_HS) */
1263 
1264   return status;
1265 }
1266 
1267 
1268 /**
1269   * @brief  Get the RCC_ClkInitStruct according to the internal RCC configuration registers.
1270   * @param  pPeriphClkInit  pointer to an RCC_PeriphCLKInitTypeDef structure that
1271   *         returns the configuration information for the Extended Peripherals
1272   *         clocks(USART1, USART2, USART3, UART4, UART5, LPUART, I2C1, I2C2, I2C3, LPTIM1, LPTIM2, SAI1, SAI2,
1273   *         ADC1, ADC2, MDF1, MDF2, RTC, CLK48, SDMMC1, I2C4, SPI12, SPI3, OSPI, FDCAN1, DAC1).
1274   * @retval None
1275   */
HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef * pPeriphClkInit)1276 void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *pPeriphClkInit)
1277 {
1278   /* Set all possible values for the extended clock type parameter------------*/
1279 #if (defined(STM32U599xx) || defined(STM32U5A9xx) || defined (STM32U5F9xx) || defined (STM32U5G9xx))
1280   pPeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \
1281                                          RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 | RCC_PERIPHCLK_USART6 | \
1282                                          RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | \
1283                                          RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_I2C5 | RCC_PERIPHCLK_I2C6 | \
1284                                          RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_LPTIM34 | RCC_PERIPHCLK_LPTIM2 | \
1285                                          RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 | RCC_PERIPHCLK_ADCDAC | \
1286                                          RCC_PERIPHCLK_MDF1 | RCC_PERIPHCLK_ADF1 | RCC_PERIPHCLK_RTC | \
1287                                          RCC_PERIPHCLK_ICLK | RCC_PERIPHCLK_SDMMC | RCC_PERIPHCLK_RNG | \
1288                                          RCC_PERIPHCLK_I2C4 | RCC_PERIPHCLK_SPI1 | RCC_PERIPHCLK_SPI2 | \
1289                                          RCC_PERIPHCLK_SPI3 | RCC_PERIPHCLK_OSPI | RCC_PERIPHCLK_FDCAN1 | \
1290                                          RCC_PERIPHCLK_DAC1 | RCC_PERIPHCLK_HSPI | RCC_PERIPHCLK_LTDC | \
1291                                          RCC_PERIPHCLK_DSI | RCC_PERIPHCLK_USBPHY;
1292 #elif (defined(STM32U595xx) || defined(STM32U5A5xx))
1293   pPeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \
1294                                          RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 | RCC_PERIPHCLK_USART6 | \
1295                                          RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | \
1296                                          RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_I2C5 | RCC_PERIPHCLK_I2C6 | \
1297                                          RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_LPTIM34 | RCC_PERIPHCLK_LPTIM2 | \
1298                                          RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 | RCC_PERIPHCLK_ADCDAC | \
1299                                          RCC_PERIPHCLK_MDF1 | RCC_PERIPHCLK_ADF1 | RCC_PERIPHCLK_RTC | \
1300                                          RCC_PERIPHCLK_ICLK | RCC_PERIPHCLK_SDMMC | RCC_PERIPHCLK_RNG | \
1301                                          RCC_PERIPHCLK_I2C4 | RCC_PERIPHCLK_SPI1 | RCC_PERIPHCLK_SPI2 | \
1302                                          RCC_PERIPHCLK_SPI3 | RCC_PERIPHCLK_OSPI | RCC_PERIPHCLK_FDCAN1 | \
1303                                          RCC_PERIPHCLK_DAC1 | RCC_PERIPHCLK_HSPI | RCC_PERIPHCLK_USBPHY;
1304 #elif (defined(STM32U585xx) || defined(STM32U575xx))
1305   pPeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \
1306                                          RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 | RCC_PERIPHCLK_LPUART1 | \
1307                                          RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | RCC_PERIPHCLK_I2C3 | \
1308                                          RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_LPTIM34 | RCC_PERIPHCLK_LPTIM2 | \
1309                                          RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 | \
1310                                          RCC_PERIPHCLK_ADCDAC | RCC_PERIPHCLK_MDF1 | RCC_PERIPHCLK_ADF1 | \
1311                                          RCC_PERIPHCLK_RTC | RCC_PERIPHCLK_ICLK | RCC_PERIPHCLK_SDMMC | \
1312                                          RCC_PERIPHCLK_RNG | RCC_PERIPHCLK_I2C4 | RCC_PERIPHCLK_SPI1 | \
1313                                          RCC_PERIPHCLK_SPI2 | RCC_PERIPHCLK_SPI3 | RCC_PERIPHCLK_OSPI | \
1314                                          RCC_PERIPHCLK_FDCAN1 | RCC_PERIPHCLK_DAC1;
1315 
1316 #else
1317   pPeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4 | \
1318                                          RCC_PERIPHCLK_UART5 | RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1 | \
1319                                          RCC_PERIPHCLK_I2C2 | RCC_PERIPHCLK_I2C3 |  RCC_PERIPHCLK_LPTIM1 | \
1320                                          RCC_PERIPHCLK_LPTIM34 | RCC_PERIPHCLK_LPTIM2 | \
1321                                          RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_ADCDAC | RCC_PERIPHCLK_MDF1 | \
1322                                          RCC_PERIPHCLK_ADF1 | RCC_PERIPHCLK_RTC | RCC_PERIPHCLK_ICLK | \
1323                                          RCC_PERIPHCLK_SDMMC | RCC_PERIPHCLK_RNG | RCC_PERIPHCLK_I2C4 | \
1324                                          RCC_PERIPHCLK_SPI1 | RCC_PERIPHCLK_SPI2 | RCC_PERIPHCLK_SPI3 | \
1325                                          RCC_PERIPHCLK_OSPI | RCC_PERIPHCLK_FDCAN1 | RCC_PERIPHCLK_DAC1;
1326 #endif /* (defined(STM32U599xx) || defined(STM32U5A9xx) || defined (STM32U5F9xx) || defined (STM32U5G9xx)) */
1327 
1328 #if defined(SAES)
1329   pPeriphClkInit->PeriphClockSelection |=  RCC_PERIPHCLK_SAES;
1330 #endif /* SAES */
1331 
1332   /* Get the PLL2 Clock configuration -----------------------------------------------*/
1333   pPeriphClkInit->PLL2.PLL2Source = (uint32_t)((RCC->PLL2CFGR & RCC_PLL2CFGR_PLL2SRC) >> RCC_PLL2CFGR_PLL2SRC_Pos);
1334   pPeriphClkInit->PLL2.PLL2M = (uint32_t)((RCC->PLL2CFGR & RCC_PLL2CFGR_PLL2M) >> RCC_PLL2CFGR_PLL2M_Pos) + 1U;
1335   pPeriphClkInit->PLL2.PLL2N = (uint32_t)((RCC->PLL2DIVR & RCC_PLL2DIVR_PLL2N) >> RCC_PLL2DIVR_PLL2N_Pos) + 1U;
1336   pPeriphClkInit->PLL2.PLL2P = (uint32_t)((RCC->PLL2DIVR & RCC_PLL2DIVR_PLL2P) >> RCC_PLL2DIVR_PLL2P_Pos) + 1U;
1337   pPeriphClkInit->PLL2.PLL2Q = (uint32_t)((RCC->PLL2DIVR & RCC_PLL2DIVR_PLL2Q) >> RCC_PLL2DIVR_PLL2Q_Pos) + 1U;
1338   pPeriphClkInit->PLL2.PLL2R = (uint32_t)((RCC->PLL2DIVR & RCC_PLL2DIVR_PLL2R) >> RCC_PLL2DIVR_PLL2R_Pos) + 1U;
1339   pPeriphClkInit->PLL2.PLL2RGE = (uint32_t)((RCC->PLL2CFGR & RCC_PLL2CFGR_PLL2RGE) >> RCC_PLL2CFGR_PLL2RGE_Pos);
1340   pPeriphClkInit->PLL2.PLL2FRACN = (uint32_t)((RCC->PLL2FRACR & RCC_PLL2FRACR_PLL2FRACN) >> \
1341                                               RCC_PLL2FRACR_PLL2FRACN_Pos);
1342 
1343   /* Get the PLL3 Clock configuration -----------------------------------------------*/
1344   pPeriphClkInit->PLL3.PLL3Source = (uint32_t)((RCC->PLL3CFGR & RCC_PLL3CFGR_PLL3SRC) >> RCC_PLL3CFGR_PLL3SRC_Pos);
1345   pPeriphClkInit->PLL3.PLL3M = (uint32_t)((RCC->PLL3CFGR & RCC_PLL3CFGR_PLL3M) >> RCC_PLL3CFGR_PLL3M_Pos) + 1U;
1346   pPeriphClkInit->PLL3.PLL3N = (uint32_t)((RCC->PLL3DIVR & RCC_PLL3DIVR_PLL3N) >> RCC_PLL3DIVR_PLL3N_Pos) + 1U;
1347   pPeriphClkInit->PLL3.PLL3P = (uint32_t)((RCC->PLL3DIVR & RCC_PLL3DIVR_PLL3P) >> RCC_PLL3DIVR_PLL3P_Pos) + 1U;
1348   pPeriphClkInit->PLL3.PLL3Q = (uint32_t)((RCC->PLL3DIVR & RCC_PLL3DIVR_PLL3Q) >> RCC_PLL3DIVR_PLL3Q_Pos) + 1U;
1349   pPeriphClkInit->PLL3.PLL3R = (uint32_t)((RCC->PLL3DIVR & RCC_PLL3DIVR_PLL3R) >> RCC_PLL3DIVR_PLL3R_Pos) + 1U;
1350   pPeriphClkInit->PLL3.PLL3RGE = (uint32_t)((RCC->PLL3CFGR & RCC_PLL3CFGR_PLL3RGE) >> RCC_PLL3CFGR_PLL3RGE_Pos);
1351   pPeriphClkInit->PLL3.PLL3FRACN = (uint32_t)((RCC->PLL3FRACR & RCC_PLL3FRACR_PLL3FRACN) >> \
1352                                               RCC_PLL3FRACR_PLL3FRACN_Pos);
1353 
1354   /* Get the USART1 clock source ---------------------------------------------*/
1355   pPeriphClkInit->Usart1ClockSelection = __HAL_RCC_GET_USART1_SOURCE();
1356 
1357 #if defined(USART2)
1358   /* Get the USART2 clock source ---------------------------------------------*/
1359   pPeriphClkInit->Usart2ClockSelection = __HAL_RCC_GET_USART2_SOURCE();
1360 #endif /* USART2 */
1361 
1362   /* Get the USART3 clock source ---------------------------------------------*/
1363   pPeriphClkInit->Usart3ClockSelection = __HAL_RCC_GET_USART3_SOURCE();
1364 
1365   /* Get the UART4 clock source ----------------------------------------------*/
1366   pPeriphClkInit->Uart4ClockSelection = __HAL_RCC_GET_UART4_SOURCE();
1367 
1368   /* Get the UART5 clock source ----------------------------------------------*/
1369   pPeriphClkInit->Uart5ClockSelection = __HAL_RCC_GET_UART5_SOURCE();
1370 
1371   /* Get the LPUART1 clock source --------------------------------------------*/
1372   pPeriphClkInit->Lpuart1ClockSelection = __HAL_RCC_GET_LPUART1_SOURCE();
1373 
1374 #if defined(USART6)
1375   /* Get the UART6 clock source ---------------------------------------------*/
1376   pPeriphClkInit->Usart6ClockSelection = __HAL_RCC_GET_USART6_SOURCE();
1377 #endif /* defined(USART6) */
1378 
1379   /* Get the I2C1 clock source -----------------------------------------------*/
1380   pPeriphClkInit->I2c1ClockSelection = __HAL_RCC_GET_I2C1_SOURCE();
1381 
1382   /* Get the I2C2 clock source -----------------------------------------------*/
1383   pPeriphClkInit->I2c2ClockSelection = __HAL_RCC_GET_I2C2_SOURCE();
1384 
1385   /* Get the I2C3 clock source -----------------------------------------------*/
1386   pPeriphClkInit->I2c3ClockSelection = __HAL_RCC_GET_I2C3_SOURCE();
1387 
1388   /* Get the I2C4 clock source -----------------------------------------------*/
1389   pPeriphClkInit->I2c4ClockSelection = __HAL_RCC_GET_I2C4_SOURCE();
1390 
1391 #if defined(I2C5)
1392   /* Get the  clock source ---------------------------------------------*/
1393   pPeriphClkInit->I2c5ClockSelection = __HAL_RCC_GET_I2C5_SOURCE();
1394 #endif /* defined(I2C5) */
1395 
1396 #if defined(I2C6)
1397   /* Get the  clock source ---------------------------------------------*/
1398   pPeriphClkInit->I2c6ClockSelection = __HAL_RCC_GET_I2C6_SOURCE();
1399 #endif /* defined(I2C6) */
1400 
1401   /* Get the LPTIM1 clock source ---------------------------------------------*/
1402   pPeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE();
1403 
1404   /* Get the LPTIM2 clock source ---------------------------------------------*/
1405   pPeriphClkInit->Lptim2ClockSelection = __HAL_RCC_GET_LPTIM2_SOURCE();
1406 
1407   /* Get the LPTIM34 clock source --------------------------------------------*/
1408   pPeriphClkInit->Lptim34ClockSelection = __HAL_RCC_GET_LPTIM34_SOURCE();
1409 
1410   /* Get the FDCAN1 clock source ---------------------------------------------*/
1411   pPeriphClkInit->Fdcan1ClockSelection = __HAL_RCC_GET_FDCAN1_SOURCE();
1412 
1413   /* Get the MDF1 clock source -----------------------------------------------*/
1414   pPeriphClkInit->Mdf1ClockSelection = __HAL_RCC_GET_MDF1_SOURCE();
1415 
1416   /* Get the ADF1 clock source -----------------------------------------------*/
1417   pPeriphClkInit->Adf1ClockSelection = __HAL_RCC_GET_ADF1_SOURCE();
1418 
1419 #if defined(SAES)
1420   /* Get the SAES clock source -----------------------------------------------*/
1421   pPeriphClkInit->SaesClockSelection = __HAL_RCC_GET_SAES_SOURCE();
1422 #endif /* SAES */
1423 
1424   /* Get the SAI1 clock source -----------------------------------------------*/
1425   pPeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE();
1426 
1427 #if defined(SAI2)
1428   /* Get the SAI2 clock source -----------------------------------------------*/
1429   pPeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE();
1430 #endif /* SAI2 */
1431 
1432   /* Get the CLK48 clock source ----------------------------------------------*/
1433   pPeriphClkInit->IclkClockSelection = __HAL_RCC_GET_ICLK_SOURCE();
1434 
1435   /* Get the SDMMC clock source ----------------------------------------------*/
1436   pPeriphClkInit->SdmmcClockSelection = __HAL_RCC_GET_SDMMC_SOURCE();
1437 
1438   /* Get the ADCDAC clock source ---------------------------------------------*/
1439   pPeriphClkInit->AdcDacClockSelection = __HAL_RCC_GET_ADCDAC_SOURCE();
1440 
1441   /* Get the DAC1 clock source -----------------------------------------------*/
1442   pPeriphClkInit->Dac1ClockSelection = __HAL_RCC_GET_DAC1_SOURCE();
1443 
1444   /* Get the OSPI clock source -----------------------------------------------*/
1445   pPeriphClkInit->OspiClockSelection = __HAL_RCC_GET_OSPI_SOURCE();
1446 
1447   /* Get the SPI1 clock source -----------------------------------------------*/
1448   pPeriphClkInit->Spi1ClockSelection = __HAL_RCC_GET_SPI1_SOURCE();
1449 
1450   /* Get the SPI2 clock source -----------------------------------------------*/
1451   pPeriphClkInit->Spi2ClockSelection = __HAL_RCC_GET_SPI2_SOURCE();
1452 
1453   /* Get the SPI3 clock source -----------------------------------------------*/
1454   pPeriphClkInit->Spi3ClockSelection = __HAL_RCC_GET_SPI3_SOURCE();
1455 
1456   /* Get the RTC clock source ------------------------------------------------*/
1457   pPeriphClkInit->RTCClockSelection = __HAL_RCC_GET_RTC_SOURCE();
1458 
1459   /* Get the RNG clock source ------------------------------------------------*/
1460   pPeriphClkInit->RngClockSelection = __HAL_RCC_GET_RNG_SOURCE();
1461 
1462 #if defined(HSPI1)
1463   /* Get the HSPI kernel clock source ------------------------------------------------*/
1464   pPeriphClkInit->HspiClockSelection = __HAL_RCC_GET_HSPI_SOURCE();
1465 #endif /* defined(HSPI1) */
1466 
1467 #if defined(LTDC)
1468   /* Get the LTDC clock source ------------------------------------------------*/
1469   pPeriphClkInit->LtdcClockSelection = __HAL_RCC_GET_LTDC_SOURCE();
1470 #endif /*  defined(LTDC) */
1471 
1472 #if defined(DSI)
1473   /* Get the DSI clock source ------------------------------------------------*/
1474   pPeriphClkInit->DsiClockSelection = __HAL_RCC_GET_DSI_SOURCE();
1475 #endif /* defined(DSI) */
1476 
1477 #if defined(USB_OTG_HS)
1478   /* Get the USB PHY clock source ------------------------------------------------*/
1479   pPeriphClkInit->UsbPhyClockSelection = __HAL_RCC_GET_USBPHY_SOURCE();
1480 #endif /*  defined(USB_OTG_HS) */
1481 }
1482 
1483 /**
1484   * @brief  Returns the PLL1 clock frequencies :PLL1_P_Frequency,PLL1_R_Frequency and PLL1_Q_Frequency
1485   * @note   The PLL1 clock frequencies computed by this function is not the real
1486   *         frequency in the chip. It is calculated based on the predefined
1487   *         constant and the selected clock source:
1488   * @note   The function returns values based on HSE_VALUE, HSI_VALUE or MSI Value multiplied/divided by the PLL
1489   *         factors.
1490   * @note   This function can be used by the user application to compute the
1491   *         baud-rate for the communication peripherals or configure other parameters.
1492   *
1493   * @note   Each time PLL1CLK changes, this function must be called to update the
1494   *         right PLL1CLK value. Otherwise, any configuration based on this function will be incorrect.
1495   * @param  PLL1_Clocks structure.
1496   * @retval None
1497   */
HAL_RCCEx_GetPLL1ClockFreq(PLL1_ClocksTypeDef * PLL1_Clocks)1498 void HAL_RCCEx_GetPLL1ClockFreq(PLL1_ClocksTypeDef *PLL1_Clocks)
1499 {
1500   uint32_t pll1source;
1501   uint32_t  pll1m;
1502   uint32_t pll1n;
1503   uint32_t pll1fracen;
1504   float_t fracn1;
1505   float_t pll1vco;
1506 
1507   pll1n = (RCC->PLL1DIVR & RCC_PLL1DIVR_PLL1N);
1508   pll1source = (RCC->PLL1CFGR & RCC_PLL1CFGR_PLL1SRC);
1509   pll1m = ((RCC->PLL1CFGR & RCC_PLL1CFGR_PLL1M) >> RCC_PLL1CFGR_PLL1M_Pos) + 1U;
1510   pll1fracen = ((RCC->PLL1CFGR & RCC_PLL1CFGR_PLL1FRACEN) >> RCC_PLL1CFGR_PLL1FRACEN_Pos);
1511   fracn1 = (float_t)(uint32_t)(pll1fracen * ((RCC->PLL1FRACR & RCC_PLL1FRACR_PLL1FRACN) >> \
1512                                              RCC_PLL1FRACR_PLL1FRACN_Pos));
1513 
1514   switch (pll1source)
1515   {
1516 
1517     case RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
1518       pll1vco = ((float_t)HSI_VALUE / (float_t)pll1m) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_PLL1N) + \
1519                                                          (fracn1 / (float_t)0x2000) + (float_t)1);
1520       break;
1521     case RCC_PLLSOURCE_MSI:  /* MSI used as PLL clock source */
1522       pll1vco = ((float_t)MSIRangeTable[(__HAL_RCC_GET_MSI_RANGE() >> RCC_ICSCR1_MSISRANGE_Pos)] / (float_t)pll1m) * \
1523                 ((float_t)pll1n + (fracn1 / (float_t)0x2000) + (float_t)1);
1524       break;
1525     case RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
1526       pll1vco = ((float_t)HSE_VALUE / (float_t)pll1m) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_PLL1N) + \
1527                                                          (fracn1 / (float_t)0x2000) + (float_t)1);
1528       break;
1529     default:
1530       pll1vco = ((float_t)MSIRangeTable[(__HAL_RCC_GET_MSI_RANGE() >> RCC_ICSCR1_MSISRANGE_Pos)] / (float_t)pll1m) * \
1531                 ((float_t)pll1n + (fracn1 / (float_t)0x2000) + (float_t)1);
1532       break;
1533   }
1534 
1535   if (__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLL1_DIVP) != 0U)
1536   {
1537     PLL1_Clocks->PLL1_P_Frequency = (uint32_t)(float_t)(pll1vco / ((float_t)(uint32_t)((RCC->PLL1DIVR & \
1538                                                                    RCC_PLL1DIVR_PLL1P) >> RCC_PLL1DIVR_PLL1P_Pos) + \
1539                                                                    (float_t)1));
1540   }
1541   else
1542   {
1543     PLL1_Clocks->PLL1_P_Frequency = 0U;
1544   }
1545 
1546   if (__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLL1_DIVQ) != 0U)
1547   {
1548     PLL1_Clocks->PLL1_Q_Frequency = (uint32_t)(float_t)(pll1vco / ((float_t)(uint32_t)((RCC->PLL1DIVR & \
1549                                                                    RCC_PLL1DIVR_PLL1Q) >> RCC_PLL1DIVR_PLL1Q_Pos) + \
1550                                                                    (float_t)1));
1551   }
1552   else
1553   {
1554     PLL1_Clocks->PLL1_Q_Frequency = 0U;
1555   }
1556 
1557   if (__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLL1_DIVR) != 0U)
1558   {
1559     PLL1_Clocks->PLL1_R_Frequency = (uint32_t)(float_t)(pll1vco / ((float_t)(uint32_t)((RCC->PLL1DIVR & \
1560                                                                    RCC_PLL1DIVR_PLL1R) >> RCC_PLL1DIVR_PLL1R_Pos) + \
1561                                                                    (float_t)1));
1562   }
1563   else
1564   {
1565     PLL1_Clocks->PLL1_R_Frequency = 0U;
1566   }
1567 
1568 }
1569 
1570 /**
1571   * @brief  Returns the PLL2 clock frequencies :PLL2_P_Frequency,PLL2_R_Frequency and PLL2_Q_Frequency
1572   * @note   The PLL2 clock frequencies computed by this function is not the real
1573   *         frequency in the chip. It is calculated based on the predefined
1574   *         constant and the selected clock source:
1575   * @note   The function returns values based on HSE_VALUE, HSI_VALUE or CSI Value multiplied/divided by the PLL
1576   *        factors.
1577   * @note   This function can be used by the user application to compute the
1578   *         baud-rate for the communication peripherals or configure other parameters.
1579   *
1580   * @note   Each time PLL2CLK changes, this function must be called to update the
1581   *         right PLL2CLK value. Otherwise, any configuration based on this function will be incorrect.
1582   * @param  PLL2_Clocks structure.
1583   * @retval None
1584   */
HAL_RCCEx_GetPLL2ClockFreq(PLL2_ClocksTypeDef * PLL2_Clocks)1585 void HAL_RCCEx_GetPLL2ClockFreq(PLL2_ClocksTypeDef *PLL2_Clocks)
1586 {
1587   uint32_t  pll2source;
1588   uint32_t pll2m;
1589   uint32_t pll2n;
1590   uint32_t pll2fracen;
1591   float_t fracn2;
1592   float_t pll2vco;
1593 
1594   /* PLL_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLL2M) * PLL2N
1595      PLL2xCLK = PLL2_VCO / PLL2x */
1596   pll2n = (RCC->PLL2DIVR & RCC_PLL2DIVR_PLL2N);
1597   pll2source = (RCC->PLL2CFGR & RCC_PLL2CFGR_PLL2SRC);
1598   pll2m = ((RCC->PLL2CFGR & RCC_PLL2CFGR_PLL2M) >> RCC_PLL2CFGR_PLL2M_Pos) + 1U;
1599   pll2fracen = ((RCC->PLL2CFGR & RCC_PLL2CFGR_PLL2FRACEN) >> RCC_PLL2CFGR_PLL2FRACEN_Pos);
1600   fracn2 = (float_t)(uint32_t)(pll2fracen * ((RCC->PLL2FRACR & RCC_PLL2FRACR_PLL2FRACN) >> \
1601                                              RCC_PLL2FRACR_PLL2FRACN_Pos));
1602 
1603   switch (pll2source)
1604   {
1605     case RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
1606       pll2vco = ((float_t)HSI_VALUE / (float_t)pll2m) * ((float_t)(uint32_t)(RCC->PLL2DIVR & RCC_PLL2DIVR_PLL2N) + \
1607                                                          (fracn2 / (float_t)0x2000) + (float_t)1);
1608       break;
1609 
1610     case RCC_PLLSOURCE_MSI:  /* MSI used as PLL clock source */
1611       pll2vco = ((float_t)MSIRangeTable[(__HAL_RCC_GET_MSI_RANGE() >> RCC_ICSCR1_MSISRANGE_Pos)] / (float_t)pll2m) * \
1612                 ((float_t)pll2n + (fracn2 / (float_t)0x2000) + (float_t)1);
1613       break;
1614 
1615     case RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
1616       pll2vco = ((float_t)HSE_VALUE / (float_t)pll2m) * ((float_t)(uint32_t)(RCC->PLL2DIVR & RCC_PLL2DIVR_PLL2N) + \
1617                                                          (fracn2 / (float_t)0x2000) + (float_t)1);
1618       break;
1619 
1620     default:
1621       pll2vco = ((float_t)MSIRangeTable[(__HAL_RCC_GET_MSI_RANGE() >> RCC_ICSCR1_MSISRANGE_Pos)] / (float_t) pll2m) \
1622                 * ((float_t)pll2n + (fracn2 / (float_t)0x2000) + (float_t)1);
1623       break;
1624   }
1625   if (__HAL_RCC_GET_PLL2CLKOUT_CONFIG(RCC_PLL2_DIVP) != 0U)
1626   {
1627     PLL2_Clocks->PLL2_P_Frequency = (uint32_t)(float_t)(pll2vco / ((float_t)(uint32_t)((RCC->PLL2DIVR & \
1628                                                                    RCC_PLL2DIVR_PLL2P) >> RCC_PLL2DIVR_PLL2P_Pos) + \
1629                                                                    (float_t)1));
1630   }
1631   else
1632   {
1633     PLL2_Clocks->PLL2_P_Frequency = 0U;
1634   }
1635   if (__HAL_RCC_GET_PLL2CLKOUT_CONFIG(RCC_PLL2_DIVQ) != 0U)
1636   {
1637     PLL2_Clocks->PLL2_Q_Frequency = (uint32_t)(float_t)(pll2vco / ((float_t)(uint32_t)((RCC->PLL2DIVR & \
1638                                                                    RCC_PLL2DIVR_PLL2Q) >> RCC_PLL2DIVR_PLL2Q_Pos) + \
1639                                                                    (float_t)1));
1640   }
1641   else
1642   {
1643     PLL2_Clocks->PLL2_Q_Frequency = 0U;
1644   }
1645   if (__HAL_RCC_GET_PLL2CLKOUT_CONFIG(RCC_PLL2_DIVR) != 0U)
1646   {
1647     PLL2_Clocks->PLL2_R_Frequency = (uint32_t)(float_t)(pll2vco / ((float_t)(uint32_t)((RCC->PLL2DIVR & \
1648                                                                    RCC_PLL2DIVR_PLL2R) >> RCC_PLL2DIVR_PLL2R_Pos) + \
1649                                                                    (float_t)1));
1650   }
1651   else
1652   {
1653     PLL2_Clocks->PLL2_R_Frequency = 0U;
1654   }
1655 }
1656 
1657 /**
1658   * @brief  Returns the PLL3 clock frequencies :PLL3_P_Frequency,PLL3_R_Frequency and PLL3_Q_Frequency
1659   * @note   The PLL3 clock frequencies computed by this function is not the real
1660   *         frequency in the chip. It is calculated based on the predefined
1661   *         constant and the selected clock source:
1662   * @note   The function returns values based on HSE_VALUE, HSI_VALUE or CSI Value multiplied/divided by the PLL
1663   *         factors.
1664   * @note   This function can be used by the user application to compute the
1665   *         baud-rate for the communication peripherals or configure other parameters.
1666   *
1667   * @note   Each time PLL3CLK changes, this function must be called to update the
1668   *         right PLL3CLK value. Otherwise, any configuration based on this function will be incorrect.
1669   * @param  PLL3_Clocks structure.
1670   * @retval None
1671   */
HAL_RCCEx_GetPLL3ClockFreq(PLL3_ClocksTypeDef * PLL3_Clocks)1672 void HAL_RCCEx_GetPLL3ClockFreq(PLL3_ClocksTypeDef *PLL3_Clocks)
1673 {
1674   uint32_t pll3source;
1675   uint32_t pll3m;
1676   uint32_t pll3n;
1677   uint32_t pll3fracen;
1678   float_t fracn3;
1679   float_t pll3vco;
1680 
1681   /* PLL3_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLL3M) * PLL3N
1682   PLL3xCLK = PLL3_VCO / PLLxR
1683   */
1684 
1685   pll3n = (RCC->PLL3DIVR & RCC_PLL3DIVR_PLL3N);
1686   pll3source = (RCC->PLL3CFGR & RCC_PLL3CFGR_PLL3SRC);
1687   pll3m = ((RCC->PLL3CFGR & RCC_PLL3CFGR_PLL3M) >> RCC_PLL3CFGR_PLL3M_Pos) + 1U;
1688   pll3fracen = ((RCC->PLL3CFGR & RCC_PLL3CFGR_PLL3FRACEN) >> RCC_PLL3CFGR_PLL3FRACEN_Pos);
1689   fracn3 = (float_t)(uint32_t)(pll3fracen * ((RCC->PLL3FRACR & RCC_PLL3FRACR_PLL3FRACN) >> \
1690                                              RCC_PLL3FRACR_PLL3FRACN_Pos));
1691 
1692   switch (pll3source)
1693   {
1694     case RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
1695       pll3vco = ((float_t)HSI_VALUE / (float_t)pll3m) * ((float_t)(uint32_t)(RCC->PLL3DIVR & RCC_PLL3DIVR_PLL3N) + \
1696                                                          (fracn3 / (float_t)0x2000) + (float_t)1);
1697 
1698       break;
1699     case RCC_PLLSOURCE_MSI:  /* MSI used as PLL clock source */
1700       pll3vco = ((float_t)MSIRangeTable[(__HAL_RCC_GET_MSI_RANGE() >> RCC_ICSCR1_MSISRANGE_Pos)] / (float_t)pll3m) * \
1701                 ((float_t)pll3n + (fracn3 / (float_t)0x2000) + (float_t)1);
1702       break;
1703 
1704     case RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
1705       pll3vco = ((float_t)HSE_VALUE / (float_t)pll3m) * ((float_t)(uint32_t)(RCC->PLL3DIVR & RCC_PLL3DIVR_PLL3N) + \
1706                                                          (fracn3 / (float_t)0x2000) + (float_t)1);
1707       break;
1708 
1709     default:
1710       pll3vco = ((float_t)MSIRangeTable[(__HAL_RCC_GET_MSI_RANGE() >> RCC_ICSCR1_MSISRANGE_Pos)] / (float_t)pll3m) * \
1711                 ((float_t)pll3n + (fracn3 / (float_t)0x2000) + (float_t)1);
1712       break;
1713   }
1714 
1715   if (__HAL_RCC_GET_PLL3CLKOUT_CONFIG(RCC_PLL3_DIVP) != 0U)
1716   {
1717     PLL3_Clocks->PLL3_P_Frequency = (uint32_t)(float_t)(pll3vco / ((float_t)(uint32_t)((RCC->PLL3DIVR & \
1718                                                                    RCC_PLL3DIVR_PLL3P) >> RCC_PLL3DIVR_PLL3P_Pos) + \
1719                                                                    (float_t)1));
1720   }
1721   else
1722   {
1723     PLL3_Clocks->PLL3_P_Frequency = 0U;
1724   }
1725 
1726   if (__HAL_RCC_GET_PLL3CLKOUT_CONFIG(RCC_PLL3_DIVQ) != 0U)
1727   {
1728     PLL3_Clocks->PLL3_Q_Frequency = (uint32_t)(float_t)(pll3vco / ((float_t)(uint32_t)((RCC->PLL3DIVR & \
1729                                                                    RCC_PLL3DIVR_PLL3Q) >> RCC_PLL3DIVR_PLL3Q_Pos) + \
1730                                                                    (float_t)1));
1731   }
1732   else
1733   {
1734     PLL3_Clocks->PLL3_Q_Frequency = 0U;
1735   }
1736 
1737   if (__HAL_RCC_GET_PLL3CLKOUT_CONFIG(RCC_PLL3_DIVR) != 0U)
1738   {
1739     PLL3_Clocks->PLL3_R_Frequency = (uint32_t)(float_t)(pll3vco / ((float_t)(uint32_t)((RCC->PLL3DIVR & \
1740                                                                    RCC_PLL3DIVR_PLL3R) >> RCC_PLL3DIVR_PLL3R_Pos) + \
1741                                                                    (float_t)1));
1742   }
1743   else
1744   {
1745     PLL3_Clocks->PLL3_R_Frequency = 0U;
1746   }
1747 
1748 }
1749 
1750 /**
1751   * @brief  Return the peripheral clock frequency for peripherals
1752   * @note   Return 0 if peripheral clock identifier not managed by this API
1753   * @param  PeriphClk  Peripheral clock identifier
1754   *         This parameter can be one of the following values:
1755   *            @arg @ref RCC_PERIPHCLK_USART1 USART1 peripheral clock
1756   *            @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock
1757   *            @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock
1758   *            @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock
1759   *            @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock
1760   *            @arg @ref RCC_PERIPHCLK_I2C1 I2C1 peripheral clock
1761   *            @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock
1762   *            @arg @ref RCC_PERIPHCLK_I2C4 I2C4 peripheral clock
1763   *            @arg @ref RCC_PERIPHCLK_SPI2 SPI2 peripheral clock
1764   *            @arg @ref RCC_PERIPHCLK_LPTIM2 LPTIM2 peripheral clock
1765   *            @arg @ref RCC_PERIPHCLK_SPI1 SPI1 peripheral clock
1766   *            @arg @ref RCC_PERIPHCLK_FDCAN1 FDCAN1 peripheral clock
1767   *            @arg @ref RCC_PERIPHCLK_ICLK ICLK peripheral clock
1768   *            @arg @ref RCC_PERIPHCLK_MDF1 MDF1 peripheral clock
1769   *            @arg @ref RCC_PERIPHCLK_SAI1 SAI1 peripheral clock
1770   *            @arg @ref RCC_PERIPHCLK_SAI2 SAI2 peripheral clock
1771   *            @arg @ref RCC_PERIPHCLK_SAES SAES peripheral clock (*)
1772   *            @arg @ref RCC_PERIPHCLK_RNG RNG peripheral clock
1773   *            @arg @ref RCC_PERIPHCLK_SDMMC SDMMC peripheral clock
1774   *            @arg @ref RCC_PERIPHCLK_USART6 USART6 peripheral clock (*)
1775   *            @arg @ref RCC_PERIPHCLK_LTDC LTDC peripheral clock (*)
1776   *            @arg @ref RCC_PERIPHCLK_OSPI OSPI peripheral clock
1777   *            @arg @ref RCC_PERIPHCLK_HSPI HSPI peripheral clock (*)
1778   *            @arg @ref RCC_PERIPHCLK_I2C5 I2C5 peripheral clock (*)
1779   *            @arg @ref RCC_PERIPHCLK_I2C6 I2C6 peripheral clock (*)
1780   *            @arg @ref RCC_PERIPHCLK_USBPHY USB_OTG_HS peripheral clock (*)
1781   *            @arg @ref RCC_PERIPHCLK_LPUART1 LPUART1 peripheral clock
1782   *            @arg @ref RCC_PERIPHCLK_SPI3 SPI3 peripheral clock
1783   *            @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock
1784   *            @arg @ref RCC_PERIPHCLK_LPTIM34 LPTIM34 peripheral clock
1785   *            @arg @ref RCC_PERIPHCLK_LPTIM1 LPTIM1 peripheral clock
1786   *            @arg @ref RCC_PERIPHCLK_ADCDAC ADC1 ADC2 ADC4 DAC1 peripheral clock
1787   *            @arg @ref RCC_PERIPHCLK_DAC1 DAC1 peripheral clock
1788   *            @arg @ref RCC_PERIPHCLK_ADF1 ADF1 peripheral clock
1789   *            @arg @ref RCC_PERIPHCLK_RTC RTC peripheral clock
1790   * @retval Frequency in Hz
1791   *
1792   *        (*) value not defined in all devices.
1793   */
HAL_RCCEx_GetPeriphCLKFreq(uint64_t PeriphClk)1794 uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint64_t PeriphClk)
1795 {
1796   PLL1_ClocksTypeDef pll1_clocks;
1797   PLL2_ClocksTypeDef pll2_clocks;
1798   PLL3_ClocksTypeDef pll3_clocks;
1799 
1800   uint32_t frequency;
1801   uint32_t srcclk;
1802 
1803   /* Check the parameters */
1804   assert_param(IS_RCC_PERIPHCLOCK(PeriphClk));
1805 
1806   if (PeriphClk == RCC_PERIPHCLK_RTC)
1807   {
1808     /* Get the current RTC source */
1809     srcclk = __HAL_RCC_GET_RTC_SOURCE();
1810 
1811     /* Check if LSE is ready and if RTC clock selection is LSE */
1812     if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_RTCCLKSOURCE_LSE))
1813     {
1814       frequency = LSE_VALUE;
1815     }
1816     /* Check if LSI is ready and if RTC clock selection is LSI */
1817     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSIRDY)) && (srcclk == RCC_RTCCLKSOURCE_LSI))
1818     {
1819       if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSIPREDIV))
1820       {
1821         frequency = LSI_VALUE / 128U;
1822       }
1823       else
1824       {
1825         frequency = LSI_VALUE;
1826       }
1827     }
1828     /* Check if HSE is ready  and if RTC clock selection is HSI_DIV32*/
1829     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY)) && (srcclk == RCC_RTCCLKSOURCE_HSE_DIV32))
1830     {
1831       frequency = HSE_VALUE / 32U;
1832     }
1833     /* Clock not enabled for RTC*/
1834     else
1835     {
1836       frequency = 0U;
1837     }
1838   }
1839   else if (PeriphClk == RCC_PERIPHCLK_SAI1)
1840   {
1841     srcclk = __HAL_RCC_GET_SAI1_SOURCE();
1842 
1843     switch (srcclk)
1844     {
1845       case RCC_SAI1CLKSOURCE_PLL1: /* PLL1P is the clock source for SAI1 */
1846 
1847         HAL_RCCEx_GetPLL1ClockFreq(&pll1_clocks);
1848         frequency = pll1_clocks.PLL1_P_Frequency;
1849         break;
1850 
1851       case RCC_SAI1CLKSOURCE_PLL2: /* PLL2P is the clock source for SAI1 */
1852 
1853         HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
1854         frequency = pll2_clocks.PLL2_P_Frequency;
1855         break;
1856 
1857       case RCC_SAI1CLKSOURCE_PLL3: /* PLLI3P is the clock source for SAI1 */
1858 
1859         HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
1860         frequency = pll3_clocks.PLL3_P_Frequency;
1861         break;
1862 
1863       case RCC_SAI1CLKSOURCE_PIN:
1864 
1865         frequency = EXTERNAL_SAI1_CLOCK_VALUE;
1866         break;
1867 
1868       case RCC_SAI1CLKSOURCE_HSI: /* HSI is the clock source for SAI1 */
1869 
1870         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))
1871         {
1872           frequency = HSI_VALUE;
1873         }
1874         else
1875         {
1876           frequency = 0U;
1877         }
1878         break;
1879 
1880       default :
1881       {
1882         frequency = 0U;
1883         break;
1884       }
1885     }
1886   }
1887 #if defined(SAI2)
1888   else if (PeriphClk == RCC_PERIPHCLK_SAI2)
1889   {
1890     srcclk = __HAL_RCC_GET_SAI2_SOURCE();
1891 
1892     switch (srcclk)
1893     {
1894       case RCC_SAI2CLKSOURCE_PLL1: /* PLL1P is the clock source for SAI1 */
1895 
1896         HAL_RCCEx_GetPLL1ClockFreq(&pll1_clocks);
1897         frequency = pll1_clocks.PLL1_P_Frequency;
1898         break;
1899 
1900       case RCC_SAI2CLKSOURCE_PLL2: /* PLL2P is the clock source for SAI1 */
1901 
1902         HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
1903         frequency = pll2_clocks.PLL2_P_Frequency;
1904         break;
1905 
1906       case RCC_SAI2CLKSOURCE_PLL3: /* PLLI3P is the clock source for SAI1 */
1907 
1908         HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
1909         frequency = pll3_clocks.PLL3_P_Frequency;
1910         break;
1911 
1912       case RCC_SAI2CLKSOURCE_PIN:
1913 
1914         frequency = EXTERNAL_SAI1_CLOCK_VALUE;
1915         break;
1916 
1917       case RCC_SAI2CLKSOURCE_HSI: /* HSI is the clock source for SAI1 */
1918 
1919         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))
1920         {
1921           frequency = HSI_VALUE;
1922         }
1923         else
1924         {
1925           frequency = 0U;
1926         }
1927         break;
1928 
1929       default :
1930 
1931         frequency = 0U;
1932         break;
1933     }
1934   }
1935 #endif /* SAI2 */
1936 #if defined(SAES)
1937   else if (PeriphClk == RCC_PERIPHCLK_SAES)
1938   {
1939     /* Get the current SAES source */
1940     srcclk = __HAL_RCC_GET_SAES_SOURCE();
1941 
1942     if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY) && (srcclk == RCC_SAESCLKSOURCE_SHSI))
1943     {
1944       frequency = HSI_VALUE;
1945     }
1946     else if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY) && (srcclk == RCC_SAESCLKSOURCE_SHSI_DIV2))
1947     {
1948       frequency = HSI_VALUE >> 1U;
1949     }
1950     /* Clock not enabled for SAES */
1951     else
1952     {
1953       frequency = 0U;
1954     }
1955   }
1956 #endif /* SAES */
1957   else if (PeriphClk == RCC_PERIPHCLK_ICLK)
1958   {
1959     srcclk = __HAL_RCC_GET_ICLK_SOURCE();
1960 
1961     switch (srcclk)
1962     {
1963       case RCC_ICLK_CLKSOURCE_PLL1: /* PLL1Q  */
1964 
1965         HAL_RCCEx_GetPLL1ClockFreq(&pll1_clocks);
1966         frequency = pll1_clocks.PLL1_Q_Frequency;
1967         break;
1968 
1969       case RCC_ICLK_CLKSOURCE_PLL2: /* PLL2Q */
1970 
1971         HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
1972         frequency = pll2_clocks.PLL2_Q_Frequency;
1973         break;
1974 
1975       case RCC_ICLK_CLKSOURCE_HSI48: /* HSI48 */
1976 
1977         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSI48RDY))
1978         {
1979           frequency = HSI48_VALUE;
1980         }
1981         else
1982         {
1983           frequency = 0U;
1984         }
1985         break;
1986 
1987       case RCC_ICLK_CLKSOURCE_MSIK: /* MSIK frequency range in HZ */
1988 
1989         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY))
1990         {
1991           frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
1992         }
1993         else
1994         {
1995           frequency = 0U;
1996         }
1997         break;
1998 
1999       default :
2000 
2001         frequency = 0U;
2002         break;
2003     }
2004   }
2005   else if (PeriphClk == RCC_PERIPHCLK_SDMMC)
2006   {
2007     srcclk = __HAL_RCC_GET_SDMMC_SOURCE();
2008     if (srcclk == RCC_SDMMCCLKSOURCE_CLK48)
2009     {
2010       srcclk = __HAL_RCC_GET_ICLK_SOURCE();
2011 
2012       switch (srcclk)
2013       {
2014         case RCC_ICLK_CLKSOURCE_PLL1: /* PLL1Q  */
2015         {
2016           HAL_RCCEx_GetPLL1ClockFreq(&pll1_clocks);
2017           frequency = pll1_clocks.PLL1_Q_Frequency;
2018           break;
2019         }
2020         case RCC_ICLK_CLKSOURCE_PLL2: /* PLL2Q */
2021         {
2022           HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
2023           frequency = pll2_clocks.PLL2_Q_Frequency;
2024           break;
2025         }
2026         case RCC_ICLK_CLKSOURCE_HSI48: /* HSI48 */
2027         {
2028           if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSI48RDY))
2029           {
2030             frequency = HSI48_VALUE;
2031           }
2032           else
2033           {
2034             frequency = 0U;
2035           }
2036           break;
2037         }
2038         case RCC_ICLK_CLKSOURCE_MSIK: /* MSIK frequency range in HZ */
2039         {
2040           if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY))
2041           {
2042             frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2043           }
2044           else
2045           {
2046             frequency = 0U;
2047           }
2048           break;
2049         }
2050         default :
2051         {
2052           frequency = 0U;
2053           break;
2054         }
2055       }
2056     }
2057     else if (srcclk == RCC_SDMMCCLKSOURCE_PLL1)
2058     {
2059       HAL_RCCEx_GetPLL1ClockFreq(&pll1_clocks);
2060       frequency = pll1_clocks.PLL1_P_Frequency;
2061     }
2062     else
2063     {
2064       frequency = 0U;
2065     }
2066   }
2067   else if (PeriphClk == RCC_PERIPHCLK_USART1)
2068   {
2069     /* Get the current USART1 source */
2070     srcclk = __HAL_RCC_GET_USART1_SOURCE();
2071 
2072     if (srcclk == RCC_USART1CLKSOURCE_PCLK2)
2073     {
2074       frequency = HAL_RCC_GetPCLK2Freq();
2075     }
2076     else if (srcclk == RCC_USART1CLKSOURCE_SYSCLK)
2077     {
2078       frequency = HAL_RCC_GetSysClockFreq();
2079     }
2080     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_USART1CLKSOURCE_HSI))
2081     {
2082       frequency = HSI_VALUE;
2083     }
2084     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_USART1CLKSOURCE_LSE))
2085     {
2086       frequency = LSE_VALUE;
2087     }
2088     /* Clock not enabled for USART1 */
2089     else
2090     {
2091       frequency = 0U;
2092     }
2093   }
2094 #if defined(USART2)
2095   else if (PeriphClk == RCC_PERIPHCLK_USART2)
2096   {
2097     /* Get the current USART2 source */
2098     srcclk = __HAL_RCC_GET_USART2_SOURCE();
2099 
2100     if (srcclk == RCC_USART2CLKSOURCE_PCLK1)
2101     {
2102       frequency = HAL_RCC_GetPCLK1Freq();
2103     }
2104     else if (srcclk == RCC_USART2CLKSOURCE_SYSCLK)
2105     {
2106       frequency = HAL_RCC_GetSysClockFreq();
2107     }
2108     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_USART2CLKSOURCE_HSI))
2109     {
2110       frequency = HSI_VALUE;
2111     }
2112     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_USART2CLKSOURCE_LSE))
2113     {
2114       frequency = LSE_VALUE;
2115     }
2116     /* Clock not enabled for USART2 */
2117     else
2118     {
2119       frequency = 0U;
2120     }
2121   }
2122 #endif /* USART2 */
2123   else if (PeriphClk == RCC_PERIPHCLK_USART3)
2124   {
2125     /* Get the current USART3 source */
2126     srcclk = __HAL_RCC_GET_USART3_SOURCE();
2127 
2128     if (srcclk == RCC_USART3CLKSOURCE_PCLK1)
2129     {
2130       frequency = HAL_RCC_GetPCLK1Freq();
2131     }
2132     else if (srcclk == RCC_USART3CLKSOURCE_SYSCLK)
2133     {
2134       frequency = HAL_RCC_GetSysClockFreq();
2135     }
2136     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_USART3CLKSOURCE_HSI))
2137     {
2138       frequency = HSI_VALUE;
2139     }
2140     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_USART3CLKSOURCE_LSE))
2141     {
2142       frequency = LSE_VALUE;
2143     }
2144     /* Clock not enabled for USART3 */
2145     else
2146     {
2147       frequency = 0U;
2148     }
2149   }
2150   else if (PeriphClk == RCC_PERIPHCLK_UART4)
2151   {
2152     /* Get the current UART4 source */
2153     srcclk = __HAL_RCC_GET_UART4_SOURCE();
2154 
2155     if (srcclk == RCC_UART4CLKSOURCE_PCLK1)
2156     {
2157       frequency = HAL_RCC_GetPCLK1Freq();
2158     }
2159     else if (srcclk == RCC_UART4CLKSOURCE_SYSCLK)
2160     {
2161       frequency = HAL_RCC_GetSysClockFreq();
2162     }
2163     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_UART4CLKSOURCE_HSI))
2164     {
2165       frequency = HSI_VALUE;
2166     }
2167     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_UART4CLKSOURCE_LSE))
2168     {
2169       frequency = LSE_VALUE;
2170     }
2171     /* Clock not enabled for UART4 */
2172     else
2173     {
2174       frequency = 0U;
2175     }
2176   }
2177   else if (PeriphClk == RCC_PERIPHCLK_UART5)
2178   {
2179     /* Get the current UART5 source */
2180     srcclk = __HAL_RCC_GET_UART5_SOURCE();
2181 
2182     if (srcclk == RCC_UART5CLKSOURCE_PCLK1)
2183     {
2184       frequency = HAL_RCC_GetPCLK1Freq();
2185     }
2186     else if (srcclk == RCC_UART5CLKSOURCE_SYSCLK)
2187     {
2188       frequency = HAL_RCC_GetSysClockFreq();
2189     }
2190     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_UART5CLKSOURCE_HSI))
2191     {
2192       frequency = HSI_VALUE;
2193     }
2194     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_UART5CLKSOURCE_LSE))
2195     {
2196       frequency = LSE_VALUE;
2197     }
2198     /* Clock not enabled for UART5 */
2199     else
2200     {
2201       frequency = 0U;
2202     }
2203   }
2204 #if defined(USART6)
2205   else if (PeriphClk == RCC_PERIPHCLK_USART6)
2206   {
2207     /* Get the current USART6 source */
2208     srcclk = __HAL_RCC_GET_USART6_SOURCE();
2209 
2210     if (srcclk == RCC_USART6CLKSOURCE_PCLK1)
2211     {
2212       frequency = HAL_RCC_GetPCLK1Freq();
2213     }
2214     else if (srcclk == RCC_USART6CLKSOURCE_SYSCLK)
2215     {
2216       frequency = HAL_RCC_GetSysClockFreq();
2217     }
2218     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_USART6CLKSOURCE_HSI))
2219     {
2220       frequency = HSI_VALUE;
2221     }
2222     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_USART6CLKSOURCE_LSE))
2223     {
2224       frequency = LSE_VALUE;
2225     }
2226     /* Clock not enabled for UART5 */
2227     else
2228     {
2229       frequency = 0U;
2230     }
2231   }
2232 #endif /* USART6 */
2233   else if (PeriphClk == RCC_PERIPHCLK_LPUART1)
2234   {
2235     /* Get the current LPUART1 source */
2236     srcclk = __HAL_RCC_GET_LPUART1_SOURCE();
2237 
2238     if (srcclk == RCC_LPUART1CLKSOURCE_PCLK3)
2239     {
2240       frequency = HAL_RCC_GetPCLK3Freq();
2241     }
2242     else if (srcclk == RCC_LPUART1CLKSOURCE_SYSCLK)
2243     {
2244       frequency = HAL_RCC_GetSysClockFreq();
2245     }
2246     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_LPUART1CLKSOURCE_HSI))
2247     {
2248       frequency = HSI_VALUE;
2249     }
2250     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_LPUART1CLKSOURCE_LSE))
2251     {
2252       frequency = LSE_VALUE;
2253     }
2254     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY)) && (srcclk == RCC_LPUART1CLKSOURCE_MSIK))
2255     {
2256       frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2257     }
2258     /* Clock not enabled for LPUART1 */
2259     else
2260     {
2261       frequency = 0U;
2262     }
2263   }
2264   else if (PeriphClk == RCC_PERIPHCLK_ADCDAC)
2265   {
2266     srcclk = __HAL_RCC_GET_ADCDAC_SOURCE();
2267 
2268     if (srcclk == RCC_ADCDACCLKSOURCE_SYSCLK)
2269     {
2270       frequency = HAL_RCC_GetSysClockFreq();
2271     }
2272     else if (srcclk == RCC_ADCDACCLKSOURCE_PLL2)
2273     {
2274       HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
2275       frequency = pll2_clocks.PLL2_R_Frequency;
2276     }
2277     else if (srcclk == RCC_ADCDACCLKSOURCE_HCLK)
2278     {
2279       frequency = HAL_RCC_GetHCLKFreq();
2280     }
2281     else if (srcclk == RCC_ADCDACCLKSOURCE_MSIK)
2282     {
2283       if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY))
2284       {
2285         frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2286       }
2287       else
2288       {
2289         frequency = 0U;
2290       }
2291     }
2292     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY)) && (srcclk == RCC_ADCDACCLKSOURCE_HSE))
2293     {
2294       frequency = HSE_VALUE;
2295     }
2296     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_ADCDACCLKSOURCE_HSI))
2297     {
2298       frequency = HSI_VALUE;
2299     }
2300     /* Clock not enabled for ADC */
2301     else
2302     {
2303       frequency = 0U;
2304     }
2305   }
2306   else if (PeriphClk == RCC_PERIPHCLK_MDF1)
2307   {
2308     /* Get the current MDF1 source */
2309     srcclk = __HAL_RCC_GET_MDF1_SOURCE();
2310 
2311     switch (srcclk)
2312     {
2313       case RCC_MDF1CLKSOURCE_PLL1:
2314 
2315         HAL_RCCEx_GetPLL1ClockFreq(&pll1_clocks);
2316         frequency = pll1_clocks.PLL1_P_Frequency;
2317         break;
2318 
2319       case RCC_MDF1CLKSOURCE_PLL3:
2320 
2321         HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
2322         frequency = pll3_clocks.PLL3_Q_Frequency;
2323         break;
2324 
2325       case RCC_MDF1CLKSOURCE_HCLK:
2326 
2327         frequency = HAL_RCC_GetHCLKFreq();
2328         break;
2329 
2330       case RCC_MDF1CLKSOURCE_PIN:
2331 
2332         frequency = EXTERNAL_SAI1_CLOCK_VALUE;
2333         break;
2334 
2335       case RCC_MDF1CLKSOURCE_MSIK:
2336 
2337         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY))
2338         {
2339           frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2340         }
2341         else
2342         {
2343           frequency = 0U;
2344         }
2345         break;
2346 
2347       default:
2348 
2349         frequency = 0U;
2350         break;
2351     }
2352   }
2353   else if (PeriphClk == RCC_PERIPHCLK_ADF1)
2354   {
2355     /* Get the current ADF1 source */
2356     srcclk = __HAL_RCC_GET_ADF1_SOURCE();
2357 
2358     switch (srcclk)
2359     {
2360       case RCC_ADF1CLKSOURCE_PLL1:
2361 
2362         HAL_RCCEx_GetPLL1ClockFreq(&pll1_clocks);
2363         frequency = pll1_clocks.PLL1_P_Frequency;
2364         break;
2365 
2366       case RCC_ADF1CLKSOURCE_PLL3:
2367 
2368         HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
2369         frequency = pll3_clocks.PLL3_Q_Frequency;
2370         break;
2371 
2372       case RCC_ADF1CLKSOURCE_HCLK:
2373 
2374         frequency = HAL_RCC_GetHCLKFreq();
2375         break;
2376 
2377       case RCC_ADF1CLKSOURCE_PIN:
2378 
2379         frequency = EXTERNAL_SAI1_CLOCK_VALUE;
2380         break;
2381 
2382       case RCC_ADF1CLKSOURCE_MSIK:
2383 
2384         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY))
2385         {
2386           frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2387         }
2388         else
2389         {
2390           frequency = 0U;
2391         }
2392         break;
2393 
2394       default:
2395 
2396         frequency = 0U;
2397         break;
2398     }
2399   }
2400   else if (PeriphClk == RCC_PERIPHCLK_I2C1)
2401   {
2402     /* Get the current I2C1 source */
2403     srcclk = __HAL_RCC_GET_I2C1_SOURCE();
2404 
2405     if (srcclk == RCC_I2C1CLKSOURCE_PCLK1)
2406     {
2407       frequency = HAL_RCC_GetPCLK1Freq();
2408     }
2409     else if (srcclk == RCC_I2C1CLKSOURCE_SYSCLK)
2410     {
2411       frequency = HAL_RCC_GetSysClockFreq();
2412     }
2413     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_I2C1CLKSOURCE_HSI))
2414     {
2415       frequency = HSI_VALUE;
2416     }
2417     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY)) && (srcclk == RCC_I2C1CLKSOURCE_MSIK))
2418     {
2419       frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2420     }
2421     /* Clock not enabled for I2C1 */
2422     else
2423     {
2424       frequency = 0U;
2425     }
2426   }
2427   else if (PeriphClk == RCC_PERIPHCLK_I2C2)
2428   {
2429     /* Get the current I2C2 source */
2430     srcclk = __HAL_RCC_GET_I2C2_SOURCE();
2431 
2432     if (srcclk == RCC_I2C2CLKSOURCE_PCLK1)
2433     {
2434       frequency = HAL_RCC_GetPCLK1Freq();
2435     }
2436     else if (srcclk == RCC_I2C2CLKSOURCE_SYSCLK)
2437     {
2438       frequency = HAL_RCC_GetSysClockFreq();
2439     }
2440     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_I2C2CLKSOURCE_HSI))
2441     {
2442       frequency = HSI_VALUE;
2443     }
2444     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY)) && (srcclk == RCC_I2C2CLKSOURCE_MSIK))
2445     {
2446       frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2447     }
2448     /* Clock not enabled for I2C2 */
2449     else
2450     {
2451       frequency = 0U;
2452     }
2453   }
2454   else if (PeriphClk == RCC_PERIPHCLK_I2C3)
2455   {
2456     /* Get the current I2C3 source */
2457     srcclk = __HAL_RCC_GET_I2C3_SOURCE();
2458 
2459     switch (srcclk)
2460     {
2461       case RCC_I2C3CLKSOURCE_PCLK3:
2462       {
2463         frequency = HAL_RCC_GetPCLK3Freq();
2464         break;
2465       }
2466       case RCC_I2C3CLKSOURCE_HSI:
2467       {
2468         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))
2469         {
2470           frequency = HSI_VALUE;
2471         }
2472         else
2473         {
2474           frequency = 0U;
2475         }
2476         break;
2477       }
2478       case RCC_I2C3CLKSOURCE_SYSCLK:
2479       {
2480         frequency = HAL_RCC_GetSysClockFreq();
2481         break;
2482       }
2483       case RCC_I2C3CLKSOURCE_MSIK:
2484       {
2485         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY))
2486         {
2487           frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2488         }
2489         else
2490         {
2491           frequency = 0U;
2492         }
2493         break;
2494       }
2495       default:
2496       {
2497         frequency = 0U;
2498         break;
2499       }
2500     }
2501   }
2502   else if (PeriphClk == RCC_PERIPHCLK_I2C4)
2503   {
2504     /* Get the current I2C4 source */
2505     srcclk = __HAL_RCC_GET_I2C4_SOURCE();
2506 
2507     if (srcclk == RCC_I2C4CLKSOURCE_PCLK1)
2508     {
2509       frequency = HAL_RCC_GetPCLK1Freq();
2510     }
2511     else if (srcclk == RCC_I2C4CLKSOURCE_SYSCLK)
2512     {
2513       frequency = HAL_RCC_GetSysClockFreq();
2514     }
2515     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_I2C4CLKSOURCE_HSI))
2516     {
2517       frequency = HSI_VALUE;
2518     }
2519     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY)) && (srcclk == RCC_I2C4CLKSOURCE_MSIK))
2520     {
2521       frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2522     }
2523     /* Clock not enabled for I2C4 */
2524     else
2525     {
2526       frequency = 0U;
2527     }
2528   }
2529 #if defined (I2C5)
2530   else if (PeriphClk == RCC_PERIPHCLK_I2C5)
2531   {
2532     /* Get the current I2C5 source */
2533     srcclk = __HAL_RCC_GET_I2C5_SOURCE();
2534 
2535     if (srcclk == RCC_I2C5CLKSOURCE_PCLK1)
2536     {
2537       frequency = HAL_RCC_GetPCLK1Freq();
2538     }
2539     else if (srcclk == RCC_I2C5CLKSOURCE_SYSCLK)
2540     {
2541       frequency = HAL_RCC_GetSysClockFreq();
2542     }
2543     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_I2C5CLKSOURCE_HSI))
2544     {
2545       frequency = HSI_VALUE;
2546     }
2547     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY)) && (srcclk == RCC_I2C5CLKSOURCE_MSIK))
2548     {
2549       frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2550     }
2551     /* Clock not enabled for I2C5 */
2552     else
2553     {
2554       frequency = 0U;
2555     }
2556   }
2557 #endif /* I2C5 */
2558 #if defined (I2C6)
2559   else if (PeriphClk == RCC_PERIPHCLK_I2C6)
2560   {
2561     /* Get the current I2C6 source */
2562     srcclk = __HAL_RCC_GET_I2C6_SOURCE();
2563 
2564     if (srcclk == RCC_I2C6CLKSOURCE_PCLK1)
2565     {
2566       frequency = HAL_RCC_GetPCLK1Freq();
2567     }
2568     else if (srcclk == RCC_I2C6CLKSOURCE_SYSCLK)
2569     {
2570       frequency = HAL_RCC_GetSysClockFreq();
2571     }
2572     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_I2C6CLKSOURCE_HSI))
2573     {
2574       frequency = HSI_VALUE;
2575     }
2576     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY)) && (srcclk == RCC_I2C6CLKSOURCE_MSIK))
2577     {
2578       frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2579     }
2580     /* Clock not enabled for I2C6 */
2581     else
2582     {
2583       frequency = 0U;
2584     }
2585   }
2586 #endif /* I2C6 */
2587   else if (PeriphClk == RCC_PERIPHCLK_LPTIM34)
2588   {
2589     /* Get the current LPTIM34 source */
2590     srcclk = __HAL_RCC_GET_LPTIM34_SOURCE();
2591 
2592     if (srcclk == RCC_LPTIM34CLKSOURCE_MSIK)
2593     {
2594       if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY))
2595       {
2596         frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2597       }
2598       else
2599       {
2600         frequency = 0U;
2601       }
2602     }
2603     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSIRDY)) && (srcclk == RCC_LPTIM34CLKSOURCE_LSI))
2604     {
2605       if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSIPREDIV))
2606       {
2607         frequency = LSI_VALUE / 128U;
2608       }
2609       else
2610       {
2611         frequency = LSI_VALUE;
2612       }
2613     }
2614     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_LPTIM34CLKSOURCE_HSI))
2615     {
2616       frequency = HSI_VALUE;
2617     }
2618     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_LPTIM34CLKSOURCE_LSE))
2619     {
2620       frequency = LSE_VALUE;
2621     }
2622     /* Clock not enabled for LPTIM34 */
2623     else
2624     {
2625       frequency = 0U;
2626     }
2627   }
2628   else if (PeriphClk == RCC_PERIPHCLK_LPTIM1)
2629   {
2630     /* Get the current LPTIM1 source */
2631     srcclk = __HAL_RCC_GET_LPTIM1_SOURCE();
2632 
2633     if (srcclk == RCC_LPTIM1CLKSOURCE_MSIK)
2634     {
2635       if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY))
2636       {
2637         frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2638       }
2639       else
2640       {
2641         frequency = 0U;
2642       }
2643     }
2644     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSIRDY)) && (srcclk == RCC_LPTIM1CLKSOURCE_LSI))
2645     {
2646       if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSIPREDIV))
2647       {
2648         frequency = LSI_VALUE / 128U;
2649       }
2650       else
2651       {
2652         frequency = LSI_VALUE;
2653       }
2654     }
2655     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_LPTIM1CLKSOURCE_HSI))
2656     {
2657       frequency = HSI_VALUE;
2658     }
2659     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_LPTIM1CLKSOURCE_LSE))
2660     {
2661       frequency = LSE_VALUE;
2662     }
2663     /* Clock not enabled for LPTIM1 */
2664     else
2665     {
2666       frequency = 0U;
2667     }
2668   }
2669   else if (PeriphClk == RCC_PERIPHCLK_LPTIM2)
2670   {
2671     /* Get the current LPTIM2 source */
2672     srcclk = __HAL_RCC_GET_LPTIM2_SOURCE();
2673 
2674     if (srcclk == RCC_LPTIM2CLKSOURCE_PCLK1)
2675     {
2676       frequency = HAL_RCC_GetPCLK1Freq();
2677     }
2678     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSIRDY)) && (srcclk == RCC_LPTIM2CLKSOURCE_LSI))
2679     {
2680       if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSIPREDIV))
2681       {
2682         frequency = LSI_VALUE / 128U;
2683       }
2684       else
2685       {
2686         frequency = LSI_VALUE;
2687       }
2688     }
2689     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_LPTIM2CLKSOURCE_HSI))
2690     {
2691       frequency = HSI_VALUE;
2692     }
2693     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_LPTIM2CLKSOURCE_LSE))
2694     {
2695       frequency = LSE_VALUE;
2696     }
2697     /* Clock not enabled for LPTIM2 */
2698     else
2699     {
2700       frequency = 0U;
2701     }
2702   }
2703   else if (PeriphClk == RCC_PERIPHCLK_FDCAN1)
2704   {
2705     /* Get the current FDCAN1 kernel source */
2706     srcclk = __HAL_RCC_GET_FDCAN1_SOURCE();
2707 
2708     if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY)) && (srcclk == RCC_FDCAN1CLKSOURCE_HSE))
2709     {
2710       frequency = HSE_VALUE;
2711     }
2712     else if (srcclk == RCC_FDCAN1CLKSOURCE_PLL1) /* PLL1 ? */
2713     {
2714       HAL_RCCEx_GetPLL1ClockFreq(&pll1_clocks);
2715       frequency = pll1_clocks.PLL1_Q_Frequency;
2716     }
2717     else if (srcclk == RCC_FDCAN1CLKSOURCE_PLL2) /* PLL2 ? */
2718     {
2719       HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
2720       frequency = pll2_clocks.PLL2_P_Frequency;
2721     }
2722     /* Clock not enabled for FDCAN1 */
2723     else
2724     {
2725       frequency = 0U;
2726     }
2727   }
2728   else if (PeriphClk == RCC_PERIPHCLK_SPI1)
2729   {
2730     /* Get the current SPI1 kernel source */
2731     srcclk = __HAL_RCC_GET_SPI1_SOURCE();
2732     switch (srcclk)
2733     {
2734       case RCC_SPI1CLKSOURCE_PCLK2:
2735 
2736         frequency = HAL_RCC_GetPCLK2Freq();
2737         break;
2738 
2739       case RCC_SPI1CLKSOURCE_SYSCLK:
2740 
2741         frequency = HAL_RCC_GetSysClockFreq();
2742         break;
2743 
2744       case RCC_SPI1CLKSOURCE_HSI:
2745 
2746         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))
2747         {
2748           frequency = HSI_VALUE;
2749         }
2750         else
2751         {
2752           frequency = 0U;
2753         }
2754         break;
2755 
2756       case RCC_SPI1CLKSOURCE_MSIK:
2757 
2758         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY))
2759         {
2760           frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2761         }
2762         else
2763         {
2764           frequency = 0U;
2765         }
2766         break;
2767 
2768       default:
2769 
2770         frequency = 0U;
2771         break;
2772     }
2773   }
2774   else if (PeriphClk == RCC_PERIPHCLK_SPI2)
2775   {
2776     /* Get the current SPI2 kernel source */
2777     srcclk = __HAL_RCC_GET_SPI2_SOURCE();
2778     switch (srcclk)
2779     {
2780       case RCC_SPI2CLKSOURCE_PCLK1:
2781 
2782         frequency = HAL_RCC_GetPCLK1Freq();
2783         break;
2784 
2785       case RCC_SPI2CLKSOURCE_SYSCLK:
2786 
2787         frequency = HAL_RCC_GetSysClockFreq();
2788         break;
2789 
2790       case RCC_SPI2CLKSOURCE_HSI:
2791 
2792         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))
2793         {
2794           frequency = HSI_VALUE;
2795         }
2796         else
2797         {
2798           frequency = 0U;
2799         }
2800         break;
2801 
2802       case RCC_SPI2CLKSOURCE_MSIK:
2803 
2804         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY))
2805         {
2806           frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2807         }
2808         else
2809         {
2810           frequency = 0U;
2811         }
2812         break;
2813 
2814       default:
2815 
2816         frequency = 0U;
2817         break;
2818     }
2819   }
2820   else if (PeriphClk == RCC_PERIPHCLK_SPI3)
2821   {
2822     /* Get the current SPI3 kernel source */
2823     srcclk = __HAL_RCC_GET_SPI3_SOURCE();
2824     switch (srcclk)
2825     {
2826       case RCC_SPI3CLKSOURCE_PCLK3:
2827 
2828         frequency = HAL_RCC_GetPCLK3Freq();
2829         break;
2830 
2831       case RCC_SPI3CLKSOURCE_SYSCLK:
2832 
2833         frequency = HAL_RCC_GetSysClockFreq();
2834         break;
2835 
2836       case RCC_SPI3CLKSOURCE_HSI:
2837 
2838         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))
2839         {
2840           frequency = HSI_VALUE;
2841         }
2842         else
2843         {
2844           frequency = 0U;
2845         }
2846         break;
2847 
2848       case RCC_SPI3CLKSOURCE_MSIK:
2849 
2850         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY))
2851         {
2852           frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2853         }
2854         else
2855         {
2856           frequency = 0U;
2857         }
2858         break;
2859 
2860       default:
2861 
2862         frequency = 0U;
2863         break;
2864     }
2865   }
2866   else if (PeriphClk == RCC_PERIPHCLK_OSPI)
2867   {
2868     /* Get the current OSPI kernel source */
2869     srcclk = __HAL_RCC_GET_OSPI_SOURCE();
2870 
2871     switch (srcclk)
2872     {
2873       case RCC_OSPICLKSOURCE_PLL2:
2874 
2875         HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
2876         frequency = pll2_clocks.PLL2_Q_Frequency;
2877         break;
2878 
2879       case RCC_OSPICLKSOURCE_PLL1:
2880 
2881         HAL_RCCEx_GetPLL1ClockFreq(&pll1_clocks);
2882         frequency = pll1_clocks.PLL1_Q_Frequency;
2883         break;
2884 
2885       case RCC_OSPICLKSOURCE_SYSCLK:
2886 
2887         frequency = HAL_RCC_GetSysClockFreq();
2888         break;
2889 
2890       case RCC_OSPICLKSOURCE_MSIK:
2891 
2892         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIKRDY))
2893         {
2894           frequency = MSIRangeTable[(__HAL_RCC_GET_MSIK_RANGE() >> RCC_ICSCR1_MSIKRANGE_Pos)];
2895         }
2896         else
2897         {
2898           frequency = 0U;
2899         }
2900         break;
2901 
2902       default:
2903 
2904         frequency = 0U;
2905         break;
2906     }
2907   }
2908 #if defined(HSPI1)
2909 
2910   else if (PeriphClk == RCC_PERIPHCLK_HSPI)
2911   {
2912     /* Get the current HSPI kernel source */
2913     srcclk = __HAL_RCC_GET_HSPI_SOURCE();
2914 
2915     switch (srcclk)
2916     {
2917       case RCC_HSPICLKSOURCE_SYSCLK:
2918 
2919         frequency = HAL_RCC_GetSysClockFreq();
2920         break;
2921 
2922       case RCC_HSPICLKSOURCE_PLL1:
2923 
2924         HAL_RCCEx_GetPLL1ClockFreq(&pll1_clocks);
2925         frequency = pll1_clocks.PLL1_Q_Frequency;
2926         break;
2927 
2928       case RCC_HSPICLKSOURCE_PLL2:
2929 
2930         HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
2931         frequency = pll2_clocks.PLL2_Q_Frequency;
2932         break;
2933       case RCC_HSPICLKSOURCE_PLL3:
2934 
2935         HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
2936         frequency = pll3_clocks.PLL3_R_Frequency;
2937         break;
2938 
2939       default:
2940 
2941         frequency = 0U;
2942         break;
2943     }
2944   }
2945 #endif /* defined(HSPI1) */
2946   else if (PeriphClk == RCC_PERIPHCLK_DAC1)
2947   {
2948     /* Get the current DAC1 kernel source */
2949     srcclk = __HAL_RCC_GET_DAC1_SOURCE();
2950 
2951     /* Check if LSE is ready and if DAC1 clock selection is LSE */
2952     if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_DAC1CLKSOURCE_LSE))
2953     {
2954       frequency = LSE_VALUE;
2955     }
2956     /* Check if LSI is ready and if DAC1 clock selection is LSI */
2957     else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSIRDY)) && (srcclk == RCC_DAC1CLKSOURCE_LSI))
2958     {
2959       if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSIPREDIV))
2960       {
2961         frequency = LSI_VALUE / 128U;
2962       }
2963       else
2964       {
2965         frequency = LSI_VALUE;
2966       }
2967     }
2968     /* Clock not enabled for DAC1*/
2969     else
2970     {
2971       frequency = 0U;
2972     }
2973 
2974   }
2975   else if (PeriphClk == RCC_PERIPHCLK_RNG)
2976   {
2977     /* Get the current RNG kernel source */
2978     srcclk = __HAL_RCC_GET_RNG_SOURCE();
2979 
2980     /* Check if HSI48 is ready and if RNG clock selection is HSI48 */
2981     if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSI48RDY)) && (srcclk == RCC_RNGCLKSOURCE_HSI48))
2982     {
2983       frequency = HSI48_VALUE;
2984     }
2985 
2986     /* Check if HSI48 is ready and if RNG clock selection is HSI48_DIV2 */
2987     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSI48RDY)) && (srcclk == RCC_RNGCLKSOURCE_HSI48_DIV2))
2988     {
2989       frequency = HSI48_VALUE >> 1U ;
2990     }
2991 
2992     /* Check if HSI is ready and if RNG clock selection is HSI */
2993     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_RNGCLKSOURCE_HSI))
2994     {
2995       frequency = HSI_VALUE;
2996     }
2997     /* Clock not enabled for RNG */
2998     else
2999     {
3000       frequency = 0U;
3001     }
3002   }
3003 #if defined(LTDC)
3004   else if (PeriphClk == RCC_PERIPHCLK_LTDC)
3005   {
3006     /* Get the current LTDC kernel source */
3007     srcclk = __HAL_RCC_GET_LTDC_SOURCE();
3008 
3009     switch (srcclk)
3010     {
3011       case RCC_LTDCCLKSOURCE_PLL3:  /* PLL3R is the clock source for LTDC */
3012 
3013         HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
3014         frequency = pll3_clocks.PLL3_R_Frequency;
3015         break;
3016 
3017       case RCC_LTDCCLKSOURCE_PLL2:  /* PLL2R is the clock source for LTDC */
3018 
3019         HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
3020         frequency = pll2_clocks.PLL2_R_Frequency;
3021         break;
3022 
3023       default:
3024 
3025         frequency = 0U;
3026         break;
3027     }
3028   }
3029 #endif /* defined(LTDC) */
3030 
3031 #if defined(USB_OTG_HS)
3032 
3033   else if (PeriphClk == RCC_PERIPHCLK_USBPHY)
3034   {
3035     /* Get the current USB_OTG_HS kernel source */
3036     srcclk = __HAL_RCC_GET_USBPHY_SOURCE();
3037 
3038     if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY)) && (srcclk == RCC_USBPHYCLKSOURCE_HSE))
3039     {
3040       frequency = HSE_VALUE;
3041     }
3042     else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY)) && (srcclk == RCC_USBPHYCLKSOURCE_HSE_DIV2))
3043     {
3044       frequency = HSE_VALUE >> 1U ;
3045     }
3046     else if (srcclk == RCC_USBPHYCLKSOURCE_PLL1) /* PLL1P */
3047     {
3048       HAL_RCCEx_GetPLL1ClockFreq(&pll1_clocks);
3049       frequency = pll1_clocks.PLL1_P_Frequency;
3050     }
3051     else if (srcclk == RCC_USBPHYCLKSOURCE_PLL1_DIV2) /* PLL1P_DIV2 */
3052     {
3053       HAL_RCCEx_GetPLL1ClockFreq(&pll1_clocks);
3054       frequency = (pll1_clocks.PLL1_P_Frequency) / 2U;
3055     }
3056     /* Clock not enabled for USB_OTG_HS */
3057     else
3058     {
3059       frequency = 0U;
3060     }
3061   }
3062 #endif /* defined(USB_OTG_HS) */
3063 
3064   else
3065   {
3066     frequency = 0;
3067   }
3068   return (frequency);
3069 }
3070 
3071 
3072 /** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions
3073   *  @brief  Extended Clock management functions
3074   *
3075 @verbatim
3076  ===============================================================================
3077                 ##### Extended clock management functions  #####
3078  ===============================================================================
3079     [..]
3080     This subsection provides a set of functions allowing to control the
3081     activation or deactivation of MSI PLL-mode, PLL2, PLL3, LSE CSS,
3082     Low speed clock output and clock after wake-up from STOP mode.
3083 @endverbatim
3084   * @{
3085   */
3086 
3087 /**
3088   * @brief  Enable PLL2.
3089   * @param  PLL2Init  pointer to an RCC_PLL2InitTypeDef structure that
3090   *         contains the configuration information for the PLL2
3091   * @retval HAL status
3092   */
HAL_RCCEx_EnablePLL2(const RCC_PLL2InitTypeDef * PLL2Init)3093 HAL_StatusTypeDef HAL_RCCEx_EnablePLL2(const RCC_PLL2InitTypeDef  *PLL2Init)
3094 {
3095   uint32_t tickstart;
3096   HAL_StatusTypeDef status = HAL_OK;
3097 
3098   /* check for PLL2 Parameters used to output PLL2CLK */
3099   assert_param(IS_RCC_PLLSOURCE(PLL2Init->PLL2Source));
3100   assert_param(IS_RCC_PLLM_VALUE(PLL2Init->PLL2M));
3101   assert_param(IS_RCC_PLLN_VALUE(PLL2Init->PLL2N));
3102   assert_param(IS_RCC_PLLP_VALUE(PLL2Init->PLL2P));
3103   assert_param(IS_RCC_PLLQ_VALUE(PLL2Init->PLL2Q));
3104   assert_param(IS_RCC_PLLR_VALUE(PLL2Init->PLL2R));
3105   assert_param(IS_RCC_PLL2CLOCKOUT_VALUE(PLL2Init->PLL2ClockOut));
3106 
3107   /* Disable the PLL2 */
3108   __HAL_RCC_PLL2_DISABLE();
3109 
3110   /* Get Start Tick*/
3111   tickstart = HAL_GetTick();
3112 
3113   /* Wait till PLL2 is ready to be updated */
3114   while (READ_BIT(RCC->CR, RCC_CR_PLL2RDY) != 0U)
3115   {
3116     if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE)
3117     {
3118       status = HAL_TIMEOUT;
3119       break;
3120     }
3121   }
3122 
3123   if (status == HAL_OK)
3124   {
3125     /* Make sure PLL2Source is ready */
3126     status = RCCEx_PLLSource_Enable(PLL2Init->PLL2Source);
3127 
3128     if (status == HAL_OK)
3129     {
3130       /* Configure the PLL2 clock source, multiplication factor N, */
3131       /* and division factors M, P, Q and R */
3132       __HAL_RCC_PLL2_CONFIG(PLL2Init->PLL2Source, PLL2Init->PLL2M, PLL2Init->PLL2N,
3133                             PLL2Init->PLL2P, PLL2Init->PLL2Q, PLL2Init->PLL2R);
3134 
3135       /* Disable PLL2FRACN  */
3136       __HAL_RCC_PLL2FRACN_DISABLE();
3137 
3138       /* Configure PLL  PLL2FRACN */
3139       __HAL_RCC_PLL2FRACN_CONFIG(PLL2Init->PLL2FRACN);
3140 
3141       /* Enable PLL2FRACN  */
3142       __HAL_RCC_PLL2FRACN_ENABLE();
3143 
3144       /* Select PLL2 input reference frequency range: VCI */
3145       __HAL_RCC_PLL2_VCIRANGE(PLL2Init->PLL2RGE);
3146 
3147       /* Configure the PLL2 Clock output(s) */
3148       __HAL_RCC_PLL2CLKOUT_ENABLE(PLL2Init->PLL2ClockOut);
3149 
3150       /* Enable the PLL2 again by setting PLL2ON to 1*/
3151       __HAL_RCC_PLL2_ENABLE();
3152 
3153       /* Get Start Tick*/
3154       tickstart = HAL_GetTick();
3155 
3156       /* Wait till PLL2 is ready */
3157       while (READ_BIT(RCC->CR, RCC_CR_PLL2RDY) == 0U)
3158       {
3159         if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE)
3160         {
3161           status = HAL_TIMEOUT;
3162           break;
3163         }
3164       }
3165     }
3166   }
3167 
3168   return status;
3169 }
3170 
3171 /**
3172   * @brief  Disable PLL2.
3173   * @retval HAL status
3174   */
HAL_RCCEx_DisablePLL2(void)3175 HAL_StatusTypeDef HAL_RCCEx_DisablePLL2(void)
3176 {
3177   uint32_t tickstart;
3178   HAL_StatusTypeDef status = HAL_OK;
3179 
3180   /* Disable the PLL2 */
3181   __HAL_RCC_PLL2_DISABLE();
3182 
3183   /* Get Start Tick*/
3184   tickstart = HAL_GetTick();
3185 
3186   /* Wait till PLL2 is ready */
3187   while (READ_BIT(RCC->CR, RCC_CR_PLL2RDY) != 0U)
3188   {
3189     if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE)
3190     {
3191       status = HAL_TIMEOUT;
3192       break;
3193     }
3194   }
3195 
3196   /* To save power disable the PLL2 Source, FRACN and Clock outputs */
3197   CLEAR_BIT(RCC->PLL2CFGR, RCC_PLL2CFGR_PLL2PEN | RCC_PLL2CFGR_PLL2QEN | RCC_PLL2CFGR_PLL2REN | RCC_PLL2CFGR_PLL2SRC | \
3198             RCC_PLL2CFGR_PLL2FRACEN);
3199 
3200   return status;
3201 }
3202 
3203 /**
3204   * @brief  Enable PLL3.
3205   * @param  PLL3Init  pointer to an RCC_PLL3InitTypeDef structure that
3206   *         contains the configuration information for the PLL3
3207   * @retval HAL status
3208   */
HAL_RCCEx_EnablePLL3(const RCC_PLL3InitTypeDef * PLL3Init)3209 HAL_StatusTypeDef HAL_RCCEx_EnablePLL3(const RCC_PLL3InitTypeDef  *PLL3Init)
3210 {
3211   uint32_t tickstart;
3212   HAL_StatusTypeDef status = HAL_OK;
3213 
3214   /* check for PLL3 Parameters used to output PLL3CLK */
3215   assert_param(IS_RCC_PLLSOURCE(PLL3Init->PLL3Source));
3216   assert_param(IS_RCC_PLLM_VALUE(PLL3Init->PLL3M));
3217   assert_param(IS_RCC_PLLN_VALUE(PLL3Init->PLL3N));
3218   assert_param(IS_RCC_PLLP_VALUE(PLL3Init->PLL3P));
3219   assert_param(IS_RCC_PLL3CLOCKOUT_VALUE(PLL3Init->PLL3ClockOut));
3220 
3221   /* Disable the PLL3 */
3222   __HAL_RCC_PLL3_DISABLE();
3223 
3224   /* Get Start Tick*/
3225   tickstart = HAL_GetTick();
3226 
3227   /* Wait till PLL3 is ready to be updated */
3228   while (READ_BIT(RCC->CR, RCC_CR_PLL3RDY) != 0U)
3229   {
3230     if ((HAL_GetTick() - tickstart) > PLL3_TIMEOUT_VALUE)
3231     {
3232       status = HAL_TIMEOUT;
3233       break;
3234     }
3235   }
3236 
3237   if (status == HAL_OK)
3238   {
3239     /* Make sure PLL3Source is ready */
3240     status = RCCEx_PLLSource_Enable(PLL3Init->PLL3Source);
3241 
3242     if (status == HAL_OK)
3243     {
3244       /* Configure the PLL3 clock source, multiplication factor N, */
3245       /* and division factors M and P */
3246       __HAL_RCC_PLL3_CONFIG(PLL3Init->PLL3Source, PLL3Init->PLL3M, PLL3Init->PLL3N, PLL3Init->PLL3P, PLL3Init->PLL3Q, \
3247                             PLL3Init->PLL3R);
3248 
3249       /* Disable PLL3FRACN . */
3250       __HAL_RCC_PLL3FRACN_DISABLE();
3251 
3252       /* Configure PLL  PLL3FRACN */
3253       __HAL_RCC_PLL3FRACN_CONFIG(PLL3Init->PLL3FRACN);
3254 
3255       /* Enable PLL3FRACN . */
3256       __HAL_RCC_PLL3FRACN_ENABLE();
3257 
3258       /* Select PLL3 input reference frequency range: VCI */
3259       __HAL_RCC_PLL3_VCIRANGE(PLL3Init->PLL3RGE);
3260 
3261       /* Configure the PLL3 Clock output(s) */
3262       __HAL_RCC_PLL3CLKOUT_ENABLE(PLL3Init->PLL3ClockOut);
3263 
3264       /* Enable the PLL3 again by setting PLL3ON to 1*/
3265       __HAL_RCC_PLL3_ENABLE();
3266 
3267       /* Get Start Tick*/
3268       tickstart = HAL_GetTick();
3269 
3270       /* Wait till PLL3 is ready */
3271       while (READ_BIT(RCC->CR, RCC_CR_PLL3RDY) == 0U)
3272       {
3273         if ((HAL_GetTick() - tickstart) > PLL3_TIMEOUT_VALUE)
3274         {
3275           status = HAL_TIMEOUT;
3276           break;
3277         }
3278       }
3279     }
3280   }
3281 
3282   return status;
3283 }
3284 
3285 /**
3286   * @brief  Disable PLL3.
3287   * @retval HAL status
3288   */
HAL_RCCEx_DisablePLL3(void)3289 HAL_StatusTypeDef HAL_RCCEx_DisablePLL3(void)
3290 {
3291   uint32_t tickstart;
3292   HAL_StatusTypeDef status = HAL_OK;
3293 
3294   /* Disable the PLL3 */
3295   __HAL_RCC_PLL3_DISABLE();
3296 
3297   /* Get Start Tick*/
3298   tickstart = HAL_GetTick();
3299 
3300   /* Wait till PLL3 is ready */
3301   while (READ_BIT(RCC->CR, RCC_CR_PLL3RDY) != 0U)
3302   {
3303     if ((HAL_GetTick() - tickstart) > PLL3_TIMEOUT_VALUE)
3304     {
3305       status = HAL_TIMEOUT;
3306       break;
3307     }
3308   }
3309 
3310   /* To save power disable the PLL3 Source and Clock outputs */
3311   CLEAR_BIT(RCC->PLL3CFGR, RCC_PLL3CFGR_PLL3PEN | RCC_PLL3CFGR_PLL3QEN | RCC_PLL3CFGR_PLL3REN | RCC_PLL3CFGR_PLL3SRC | \
3312             RCC_PLL3CFGR_PLL3FRACEN);
3313 
3314   return status;
3315 }
3316 
3317 /**
3318   * @brief Select which MSI output clock uses the PLL mode.
3319   * @note  Prior to disable PLL-mode (MSIPLLEN = 0) before call HAL_RCCEx_EnableMSIPLLModeSelection.
3320   * @note  The MSI kernel clock output uses the same oscillator source than the MSI system
3321   *        clock output, then the PLL mode is applied to the both clocks outputs.
3322   * @param MSIPLLModeSelection specifies which MSI output clock uses the PLL mode.
3323   *          This parameter can be one of the following values:
3324   *            @arg @ref RCC_MSISPLL_MODE_SEL  PLL mode applied to MSIS (MSI system) clock output
3325   *            @arg @ref RCC_MSIKPLL_MODE_SEL  PLL mode applied to MSIK (MSI kernel) clock output
3326   * @retval HAL status
3327   */
HAL_RCCEx_EnableMSIPLLModeSelection(uint32_t MSIPLLModeSelection)3328 HAL_StatusTypeDef HAL_RCCEx_EnableMSIPLLModeSelection(uint32_t MSIPLLModeSelection)
3329 {
3330   HAL_StatusTypeDef status = HAL_ERROR;
3331 
3332   assert_param(IS_RCC_MSIPLLMODE_SELECT(MSIPLLModeSelection));
3333   if (READ_BIT(RCC->CR, RCC_CR_MSIPLLEN) == 0U)
3334   {
3335     /* This bit is used only if PLL mode is disabled (MSIPLLEN = 0) */
3336     if (MSIPLLModeSelection == RCC_MSISPLL_MODE_SEL)
3337     {
3338       SET_BIT(RCC->CR, RCC_CR_MSIPLLSEL);
3339     }
3340     else
3341     {
3342       CLEAR_BIT(RCC->CR, RCC_CR_MSIPLLSEL);
3343     }
3344     status = HAL_OK;
3345   }
3346 
3347   return status;
3348 }
3349 
3350 /**
3351   * @brief Enable the fast PLL mode start-up of the MSI clock
3352   * @note  Prior to enable PLL-mode (MSIPLLEN = 1) before call HAL_RCCEx_EnableMSIPLLFastStartup.
3353   * @note  The fast start-up feature is not active the first time the PLL mode is selected. The
3354   *        fast start-up is active when the MSI in PLL mode returns from switch off.
3355   * @retval HAL status
3356   */
HAL_RCCEx_EnableMSIPLLFastStartup(void)3357 HAL_StatusTypeDef HAL_RCCEx_EnableMSIPLLFastStartup(void)
3358 {
3359   HAL_StatusTypeDef status = HAL_ERROR;
3360 
3361   if (READ_BIT(RCC->CR, RCC_CR_MSIPLLEN) == RCC_CR_MSIPLLEN)
3362   {
3363     /* This bit is used only if PLL mode is selected (MSIPLLEN = 1) */
3364     SET_BIT(RCC->CR, RCC_CR_MSIPLLFAST);
3365     status = HAL_OK;
3366   }
3367 
3368   return status;
3369 }
3370 
3371 /**
3372   * @brief Disable the fast PLL mode start-up of the MSI clock
3373   * @note  the MSI fast startup mode disabled only when PLL-mode is enabled
3374   * @retval HAL status
3375   */
HAL_RCCEx_DisableMSIPLLFastStartup(void)3376 HAL_StatusTypeDef HAL_RCCEx_DisableMSIPLLFastStartup(void)
3377 {
3378   HAL_StatusTypeDef status = HAL_ERROR;
3379 
3380   if (READ_BIT(RCC->CR, RCC_CR_MSIPLLEN) == RCC_CR_MSIPLLEN)
3381   {
3382     /* This bit is used only if PLL mode is selected (MSIPLLEN = 1) */
3383     CLEAR_BIT(RCC->CR, RCC_CR_MSIPLLFAST);
3384     status = HAL_OK;
3385   }
3386   return status;
3387 }
3388 
3389 /**
3390   * @brief  Configure the oscillator clock source for wakeup from Stop and CSS backup clock.
3391   * @param  WakeUpClk  Wakeup clock
3392   *         This parameter can be one of the following values:
3393   *            @arg @ref RCC_STOP_WAKEUPCLOCK_MSI  MSI oscillator selection
3394   *            @arg @ref RCC_STOP_WAKEUPCLOCK_HSI  HSI oscillator selection
3395   * @note   This function shall not be called after the Clock Security System on HSE has been
3396   *         enabled.
3397   * @retval None
3398   */
HAL_RCCEx_WakeUpStopCLKConfig(uint32_t WakeUpClk)3399 void HAL_RCCEx_WakeUpStopCLKConfig(uint32_t WakeUpClk)
3400 {
3401   assert_param(IS_RCC_STOP_WAKEUPCLOCK(WakeUpClk));
3402 
3403   __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(WakeUpClk);
3404 }
3405 
3406 /**
3407   * @brief  Configure the oscillator Kernel clock source for wakeup from Stop
3408   * @param  WakeUpClk: Kernel Wakeup clock
3409   *         This parameter can be one of the following values:
3410   *            @arg RCC_STOP_KERWAKEUPCLOCK_MSI: MSI oscillator selection
3411   *            @arg RCC_STOP_KERWAKEUPCLOCK_HSI: HSI oscillator selection
3412   * @retval None
3413   */
HAL_RCCEx_KerWakeUpStopCLKConfig(uint32_t WakeUpClk)3414 void HAL_RCCEx_KerWakeUpStopCLKConfig(uint32_t WakeUpClk)
3415 {
3416   assert_param(IS_RCC_STOP_KERWAKEUPCLOCK(WakeUpClk));
3417 
3418   __HAL_RCC_KERWAKEUPSTOP_CLK_CONFIG(WakeUpClk);
3419 }
3420 
3421 /**
3422   * @brief  Configure the MSI range after standby mode.
3423   * @note   After Standby its frequency can be selected between 3 possible values (1, 3.072 or 4 MHz).
3424   * @param  MSIRange  MSI range
3425   *         This parameter can be one of the following values:
3426   *            @arg @ref RCC_MSIRANGE_4  Range 4 around 4 MHz (reset value)
3427   *            @arg @ref RCC_MSIRANGE_5  Range 5 around 2 MHz
3428   *            @arg @ref RCC_MSIRANGE_6  Range 6 around 1.33 MHz
3429   *            @arg @ref RCC_MSIRANGE_7  Range 7 around 1 MHz
3430   *            @arg @ref RCC_MSIRANGE_8  Range 8 around 3.072 MHz
3431   * @retval None
3432   */
HAL_RCCEx_StandbyMSIRangeConfig(uint32_t MSIRange)3433 void HAL_RCCEx_StandbyMSIRangeConfig(uint32_t MSIRange)
3434 {
3435   assert_param(IS_RCC_MSI_STANDBY_CLOCK_RANGE(MSIRange));
3436 
3437   __HAL_RCC_MSI_STANDBY_RANGE_CONFIG(MSIRange);
3438 }
3439 
3440 /**
3441   * @brief  Configure the MSIK range after standby mode.
3442   * @note   After Standby its frequency can be selected between 5 possible values (1, 1.33, 2, 3.072 or 4 MHz).
3443   * @param  MSIKRange  MSIK range
3444   *         This parameter can be one of the following values:
3445   *            @arg @ref RCC_MSIKRANGE_4  Range 4 around 4 MHz (reset value)
3446   *            @arg @ref RCC_MSIKRANGE_5  Range 5 around 2 MHz
3447   *            @arg @ref RCC_MSIKRANGE_6  Range 6 around 1.33 MHz
3448   *            @arg @ref RCC_MSIKRANGE_7  Range 7 around 1 MHz
3449   *            @arg @ref RCC_MSIKRANGE_8  Range 8 around 3.072 MHz
3450   * @retval None
3451   */
HAL_RCCEx_StandbyMSIKRangeConfig(uint32_t MSIKRange)3452 void HAL_RCCEx_StandbyMSIKRangeConfig(uint32_t MSIKRange)
3453 {
3454   assert_param(IS_RCC_MSIK_STANDBY_CLOCK_RANGE(MSIKRange));
3455 
3456   __HAL_RCC_MSIK_STANDBY_RANGE_CONFIG(MSIKRange);
3457 }
3458 
3459 /**
3460   * @brief  Enable the LSE Clock Security System.
3461   * @note   Prior to enable the LSE Clock Security System, LSE oscillator is to be enabled
3462   *         with HAL_RCC_OscConfig() and the LSE oscillator clock is to be selected as RTC
3463   *         clock with HAL_RCCEx_PeriphCLKConfig().
3464   * @retval None
3465   */
HAL_RCCEx_EnableLSECSS(void)3466 void HAL_RCCEx_EnableLSECSS(void)
3467 {
3468   SET_BIT(RCC->BDCR, RCC_BDCR_LSECSSON);
3469 }
3470 
3471 /**
3472   * @brief  Disable the LSE Clock Security System.
3473   * @note   LSE Clock Security System can only be disabled after a LSE failure detection.
3474   * @retval None
3475   */
HAL_RCCEx_DisableLSECSS(void)3476 void HAL_RCCEx_DisableLSECSS(void)
3477 {
3478   CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSECSSON);
3479 }
3480 
3481 /**
3482   * @brief  Enable the LSE Clock Security System Interrupt & corresponding EXTI line.
3483   * @note   LSE Clock Security System Interrupt is mapped on EXTI line
3484   *         Not available in STM32U575/585 rev. X and and STM32U59x/5Ax rev. B/Y devices.
3485   * @retval None
3486   */
HAL_RCCEx_EnableLSECSS_IT(void)3487 void HAL_RCCEx_EnableLSECSS_IT(void)
3488 {
3489   /* Enable LSE CSS */
3490   SET_BIT(RCC->BDCR, RCC_BDCR_LSECSSON) ;
3491 
3492   /* Enable IT on LSECSS EXTI Line */
3493   SET_BIT(EXTI->IMR1, RCC_EXTI_LINE_LSECSS);
3494   /* Enable the RCC LSECSS EXTI Interrupt Rising Edge */
3495   SET_BIT(EXTI->RTSR1, RCC_EXTI_LINE_LSECSS);
3496 }
3497 
3498 /**
3499   * @brief Handle the RCC LSE Clock Security System interrupt request.
3500   * @note  LSECSS EXTI is not available in STM32U575/585 rev. X and and STM32U59x/5Ax rev. B/Y devices.
3501   * @retval None
3502   */
HAL_RCCEx_LSECSS_IRQHandler(void)3503 void HAL_RCCEx_LSECSS_IRQHandler(void)
3504 {
3505   uint32_t falling_edge_flag;
3506   uint32_t rising_edge_flag;
3507 
3508   if (READ_BIT(RCC->BDCR, RCC_BDCR_LSECSSD) != 0U)
3509   {
3510     /* Read Falling Edge flag on LSECSS EXTI interrupt */
3511     falling_edge_flag = READ_BIT(EXTI->FPR1, RCC_EXTI_LINE_LSECSS);
3512 
3513     /* Read Rising Edge flag on LSECSS EXTI interrupt */
3514     rising_edge_flag = READ_BIT(EXTI->RPR1, RCC_EXTI_LINE_LSECSS);
3515 
3516     /* Check Rising/falling Edge flag on LSECSS EXTI interrupt */
3517     if ((falling_edge_flag == RCC_EXTI_LINE_LSECSS) || \
3518         (rising_edge_flag == RCC_EXTI_LINE_LSECSS))
3519     {
3520       if (rising_edge_flag == RCC_EXTI_LINE_LSECSS)
3521       {
3522         /* Clear the RCC LSECSS EXTI Rising Edge flag */
3523         WRITE_REG(EXTI->RPR1, RCC_EXTI_LINE_LSECSS);
3524       }
3525       if (falling_edge_flag  == RCC_EXTI_LINE_LSECSS)
3526       {
3527         /* Clear the RCC LSECSS EXTI Falling Edge flag */
3528         WRITE_REG(EXTI->FPR1, RCC_EXTI_LINE_LSECSS);
3529       }
3530     }
3531     /* RCC LSECSS interrupt user callback */
3532     HAL_RCCEx_LSECSS_Callback();
3533   }
3534 }
3535 
3536 /**
3537   * @brief  RCCEx LSE Clock Security System interrupt callback.
3538   * @retval none
3539   */
HAL_RCCEx_LSECSS_Callback(void)3540 __weak void HAL_RCCEx_LSECSS_Callback(void)
3541 {
3542   /* NOTE : This function should not be modified, when the callback is needed,
3543             the @ref HAL_RCCEx_LSECSS_Callback should be implemented in the user file
3544    */
3545 }
3546 
3547 /**
3548   * @brief  Enable the MSI PLL Unlock Interrupt & corresponding EXTI line.
3549   * @note   MSI PLL Unlock Interrupt is mapped on EXTI line
3550   *         Not available in STM32U575/585 rev. X and and STM32U59x/5Ax rev. B/Y devices.
3551   * @retval None
3552   */
HAL_RCCEx_EnableMSIPLLUNLCK_IT(void)3553 void HAL_RCCEx_EnableMSIPLLUNLCK_IT(void)
3554 {
3555   /* Enable IT on MSI PLL Unlock EXTI Line */
3556   SET_BIT(EXTI->IMR1, RCC_EXTI_LINE_MSIPLLUNLCK);
3557   /* Enable the RCC MSI PLL UNLOCK EXTI Interrupt Rising Edge */
3558   SET_BIT(EXTI->RTSR1, RCC_EXTI_LINE_MSIPLLUNLCK);
3559 }
3560 
3561 /**
3562   * @brief Handle the RCC MSI PLL Unlock interrupt request.
3563   * @note   Not available in STM32U575/585 rev. X and and STM32U59x/5Ax rev. B/Y devices.
3564   * @retval None
3565   */
HAL_RCCEx_MSIPLLUNLCK_IRQHandler(void)3566 void HAL_RCCEx_MSIPLLUNLCK_IRQHandler(void)
3567 {
3568   uint32_t rising_edge_flag = READ_BIT(EXTI->RPR1, RCC_EXTI_LINE_MSIPLLUNLCK);
3569   uint32_t falling_edge_flag = READ_BIT(EXTI->FPR1, RCC_EXTI_LINE_MSIPLLUNLCK);
3570 
3571   /* Check Rising/falling Edge flag on MSI PLL UNLOCK EXTI interrupt */
3572   if ((rising_edge_flag == RCC_EXTI_LINE_MSIPLLUNLCK) || \
3573       (falling_edge_flag == RCC_EXTI_LINE_MSIPLLUNLCK))
3574   {
3575     if (rising_edge_flag == RCC_EXTI_LINE_MSIPLLUNLCK)
3576     {
3577       /* Clear the RCC MSI PLL UNLOCK EXTI Rising Edge flag */
3578       WRITE_REG(EXTI->RPR1, RCC_EXTI_LINE_MSIPLLUNLCK);
3579     }
3580     if (falling_edge_flag == RCC_EXTI_LINE_MSIPLLUNLCK)
3581     {
3582       /* Clear the RCC MSI PLL UNLOCK EXTI Falling Edge flag */
3583       WRITE_REG(EXTI->FPR1, RCC_EXTI_LINE_MSIPLLUNLCK);
3584     }
3585     /* RCC MSI PLL Unlock interrupt user callback */
3586     HAL_RCCEx_MSIPLLUNLCK_Callback();
3587   }
3588 }
3589 
3590 /**
3591   * @brief  RCCEx RCC MSI PLL Unlock interrupt callback.
3592   * @note   Not available in STM32U575/585 rev. X and and STM32U59x/5Ax rev. B/Y devices.
3593   * @retval none
3594   */
HAL_RCCEx_MSIPLLUNLCK_Callback(void)3595 __weak void HAL_RCCEx_MSIPLLUNLCK_Callback(void)
3596 {
3597   /* NOTE : This function should not be modified, when the callback is needed,
3598             the @ref HAL_RCCEx_MSIPLLUNLCK_Callback should be implemented in the user file
3599    */
3600 }
3601 
3602 /**
3603   * @brief  Select the Low Speed clock source to output on LSCO pin (PA2).
3604   * @param  LSCOSource  specifies the Low Speed clock source to output.
3605   *          This parameter can be one of the following values:
3606   *            @arg @ref RCC_LSCOSOURCE_LSI  LSI clock selected as LSCO source
3607   *            @arg @ref RCC_LSCOSOURCE_LSE  LSE clock selected as LSCO source
3608   * @retval None
3609   */
HAL_RCCEx_EnableLSCO(uint32_t LSCOSource)3610 void HAL_RCCEx_EnableLSCO(uint32_t LSCOSource)
3611 {
3612   FlagStatus       pwrclkchanged = RESET;
3613   FlagStatus       backupchanged = RESET;
3614 
3615   /* Check the parameters */
3616   assert_param(IS_RCC_LSCOSOURCE(LSCOSource));
3617 
3618   /* Update LSCOSEL clock source in Backup Domain control register */
3619   if (__HAL_RCC_PWR_IS_CLK_DISABLED())
3620   {
3621     __HAL_RCC_PWR_CLK_ENABLE();
3622     pwrclkchanged = SET;
3623   }
3624   if (HAL_IS_BIT_CLR(PWR->DBPR, PWR_DBPR_DBP))
3625   {
3626     HAL_PWR_EnableBkUpAccess();
3627     backupchanged = SET;
3628   }
3629 
3630   MODIFY_REG(RCC->BDCR, RCC_BDCR_LSCOSEL | RCC_BDCR_LSCOEN, LSCOSource | RCC_BDCR_LSCOEN);
3631 
3632   if (backupchanged == SET)
3633   {
3634     HAL_PWR_DisableBkUpAccess();
3635   }
3636   if (pwrclkchanged == SET)
3637   {
3638     __HAL_RCC_PWR_CLK_DISABLE();
3639   }
3640 }
3641 
3642 /**
3643   * @brief  Disable the Low Speed clock output.
3644   * @retval None
3645   */
HAL_RCCEx_DisableLSCO(void)3646 void HAL_RCCEx_DisableLSCO(void)
3647 {
3648   FlagStatus       pwrclkchanged = RESET;
3649   FlagStatus       backupchanged = RESET;
3650 
3651   /* Update LSCOEN bit in Backup Domain control register */
3652   if (__HAL_RCC_PWR_IS_CLK_DISABLED())
3653   {
3654     __HAL_RCC_PWR_CLK_ENABLE();
3655     pwrclkchanged = SET;
3656   }
3657   if (HAL_IS_BIT_CLR(PWR->DBPR, PWR_DBPR_DBP))
3658   {
3659     /* Enable access to the backup domain */
3660     HAL_PWR_EnableBkUpAccess();
3661     backupchanged = SET;
3662   }
3663 
3664   CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSCOEN);
3665 
3666   /* Restore previous configuration */
3667   if (backupchanged == SET)
3668   {
3669     /* Disable access to the backup domain */
3670     HAL_PWR_DisableBkUpAccess();
3671   }
3672   if (pwrclkchanged == SET)
3673   {
3674     __HAL_RCC_PWR_CLK_DISABLE();
3675   }
3676 }
3677 
3678 /**
3679   * @brief  Enable the PLL-mode of the MSI.
3680   * @note   Prior to enable the PLL-mode of the MSI for automatic hardware
3681   *         calibration LSE oscillator is to be enabled with HAL_RCC_OscConfig().
3682   * @retval None
3683   */
HAL_RCCEx_EnableMSIPLLMode(void)3684 void HAL_RCCEx_EnableMSIPLLMode(void)
3685 {
3686   SET_BIT(RCC->CR, RCC_CR_MSIPLLEN);
3687 }
3688 
3689 /**
3690   * @brief  Disable the PLL-mode of the MSI.
3691   * @note   PLL-mode of the MSI is automatically reset when LSE oscillator is disabled.
3692   * @retval None
3693   */
HAL_RCCEx_DisableMSIPLLMode(void)3694 void HAL_RCCEx_DisableMSIPLLMode(void)
3695 {
3696   CLEAR_BIT(RCC->CR, RCC_CR_MSIPLLEN);
3697 }
3698 /**
3699   * @}
3700   */
3701 
3702 #if defined(CRS)
3703 
3704 /** @defgroup RCCEx_Exported_Functions_Group3 Extended Clock Recovery System Control functions
3705   * @brief  Extended Clock Recovery System Control functions
3706   *
3707 @verbatim
3708  ===============================================================================
3709                 ##### Extended Clock Recovery System Control functions  #####
3710  ===============================================================================
3711     [..]
3712       For devices with Clock Recovery System feature (CRS), RCC Extension HAL driver can be used as follows:
3713 
3714       (#) In System clock config, HSI48 needs to be enabled
3715 
3716       (#) Enable CRS clock in IP MSP init which will use CRS functions
3717 
3718       (#) Call CRS functions as follows:
3719           (##) Prepare synchronization configuration necessary for HSI48 calibration
3720               (+++) Default values can be set for frequency Error Measurement (reload and error limit)
3721                         and also HSI48 oscillator smooth trimming.
3722               (+++) Macro __HAL_RCC_CRS_RELOADVALUE_CALCULATE can be also used to calculate
3723                         directly reload value with target and synchronization frequencies values
3724           (##) Call function HAL_RCCEx_CRSConfig which
3725               (+++) Resets CRS registers to their default values.
3726               (+++) Configures CRS registers with synchronization configuration
3727               (+++) Enables automatic calibration and frequency error counter feature
3728            Note: When using USB LPM (Link Power Management) and the device is in Sleep mode, the
3729            periodic USB SOF will not be generated by the host. No SYNC signal will therefore be
3730            provided to the CRS to calibrate the HSI48 on the run. To guarantee the required clock
3731            precision after waking up from Sleep mode, the LSE or reference clock on the GPIOs
3732            should be used as SYNC signal.
3733 
3734           (##) A polling function is provided to wait for complete synchronization
3735               (+++) Call function HAL_RCCEx_CRSWaitSynchronization()
3736               (+++) According to CRS status, user can decide to adjust again the calibration or continue
3737                         application if synchronization is OK
3738 
3739       (#) User can retrieve information related to synchronization in calling function
3740             HAL_RCCEx_CRSGetSynchronizationInfo()
3741 
3742       (#) Regarding synchronization status and synchronization information, user can try a new calibration
3743            in changing synchronization configuration and call again HAL_RCCEx_CRSConfig.
3744            Note: When the SYNC event is detected during the downcounting phase (before reaching the zero value),
3745            it means that the actual frequency is lower than the target (and so, that the TRIM value should be
3746            incremented), while when it is detected during the upcounting phase it means that the actual frequency
3747            is higher (and that the TRIM value should be decremented).
3748 
3749       (#) In interrupt mode, user can resort to the available macros (__HAL_RCC_CRS_XXX_IT). Interrupts will go
3750           through CRS Handler (CRS_IRQn/CRS_IRQHandler)
3751               (++) Call function HAL_RCCEx_CRSConfig()
3752               (++) Enable CRS_IRQn (thanks to NVIC functions)
3753               (++) Enable CRS interrupt (__HAL_RCC_CRS_ENABLE_IT)
3754               (++) Implement CRS status management in the following user callbacks called from
3755                    HAL_RCCEx_CRS_IRQHandler():
3756                    (+++) HAL_RCCEx_CRS_SyncOkCallback()
3757                    (+++) HAL_RCCEx_CRS_SyncWarnCallback()
3758                    (+++) HAL_RCCEx_CRS_ExpectedSyncCallback()
3759                    (+++) HAL_RCCEx_CRS_ErrorCallback()
3760 
3761       (#) To force a SYNC EVENT, user can use the function HAL_RCCEx_CRSSoftwareSynchronizationGenerate().
3762           This function can be called before calling HAL_RCCEx_CRSConfig (for instance in Systick handler)
3763 
3764 @endverbatim
3765   * @{
3766   */
3767 
3768 /**
3769   * @brief  Start automatic synchronization for polling mode
3770   * @param  pInit Pointer on RCC_CRSInitTypeDef structure
3771   * @retval None
3772   */
HAL_RCCEx_CRSConfig(const RCC_CRSInitTypeDef * const pInit)3773 void HAL_RCCEx_CRSConfig(const RCC_CRSInitTypeDef *const pInit)
3774 {
3775   uint32_t value;
3776 
3777   /* Check the parameters */
3778   assert_param(IS_RCC_CRS_SYNC_DIV(pInit->Prescaler));
3779   assert_param(IS_RCC_CRS_SYNC_SOURCE(pInit->Source));
3780   assert_param(IS_RCC_CRS_SYNC_POLARITY(pInit->Polarity));
3781   assert_param(IS_RCC_CRS_RELOADVALUE(pInit->ReloadValue));
3782   assert_param(IS_RCC_CRS_ERRORLIMIT(pInit->ErrorLimitValue));
3783   assert_param(IS_RCC_CRS_HSI48CALIBRATION(pInit->HSI48CalibrationValue));
3784 
3785   /* CONFIGURATION */
3786 
3787   /* Before configuration, reset CRS registers to their default values*/
3788   __HAL_RCC_CRS_FORCE_RESET();
3789   __HAL_RCC_CRS_RELEASE_RESET();
3790 
3791   /* Set the SYNCDIV[2:0] bits according to Prescaler value */
3792   /* Set the SYNCSRC[1:0] bits according to Source value */
3793   /* Set the SYNCSPOL bit according to Polarity value */
3794   value = (pInit->Prescaler | pInit->Source | pInit->Polarity);
3795   /* Set the RELOAD[15:0] bits according to ReloadValue value */
3796   value |= pInit->ReloadValue;
3797   /* Set the FELIM[7:0] bits according to ErrorLimitValue value */
3798   value |= (pInit->ErrorLimitValue << CRS_CFGR_FELIM_Pos);
3799   WRITE_REG(CRS->CFGR, value);
3800 
3801   /* Adjust HSI48 oscillator smooth trimming */
3802   /* Set the TRIM[5:0] bits according to RCC_CRS_HSI48CalibrationValue value */
3803   MODIFY_REG(CRS->CR, CRS_CR_TRIM, (pInit->HSI48CalibrationValue << CRS_CR_TRIM_Pos));
3804 
3805   /* START AUTOMATIC SYNCHRONIZATION*/
3806 
3807   /* Enable Automatic trimming & Frequency error counter */
3808   SET_BIT(CRS->CR, CRS_CR_AUTOTRIMEN | CRS_CR_CEN);
3809 }
3810 
3811 /**
3812   * @brief  Generate the software synchronization event
3813   * @retval None
3814   */
HAL_RCCEx_CRSSoftwareSynchronizationGenerate(void)3815 void HAL_RCCEx_CRSSoftwareSynchronizationGenerate(void)
3816 {
3817   SET_BIT(CRS->CR, CRS_CR_SWSYNC);
3818 }
3819 
3820 /**
3821   * @brief  Return synchronization info
3822   * @param  pSynchroInfo Pointer on RCC_CRSSynchroInfoTypeDef structure
3823   * @retval None
3824   */
HAL_RCCEx_CRSGetSynchronizationInfo(RCC_CRSSynchroInfoTypeDef * pSynchroInfo)3825 void HAL_RCCEx_CRSGetSynchronizationInfo(RCC_CRSSynchroInfoTypeDef *pSynchroInfo)
3826 {
3827   /* Check the parameter */
3828   assert_param(pSynchroInfo != (void *) NULL);
3829 
3830   /* Get the reload value */
3831   pSynchroInfo->ReloadValue = (uint32_t)(READ_BIT(CRS->CFGR, CRS_CFGR_RELOAD));
3832 
3833   /* Get HSI48 oscillator smooth trimming */
3834   pSynchroInfo->HSI48CalibrationValue = (uint32_t)(READ_BIT(CRS->CR, CRS_CR_TRIM) >> CRS_CR_TRIM_Pos);
3835 
3836   /* Get Frequency error capture */
3837   pSynchroInfo->FreqErrorCapture = (uint32_t)(READ_BIT(CRS->ISR, CRS_ISR_FECAP) >> CRS_ISR_FECAP_Pos);
3838 
3839   /* Get Frequency error direction */
3840   pSynchroInfo->FreqErrorDirection = (uint32_t)(READ_BIT(CRS->ISR, CRS_ISR_FEDIR));
3841 }
3842 
3843 /**
3844   * @brief Wait for CRS Synchronization status.
3845   * @param Timeout  Duration of the timeout
3846   * @note  Timeout is based on the maximum time to receive a SYNC event based on synchronization
3847   *        frequency.
3848   * @note    If Timeout set to HAL_MAX_DELAY, HAL_TIMEOUT will be never returned.
3849   * @retval Combination of Synchronization status
3850   *          This parameter can be a combination of the following values:
3851   *            @arg @ref RCC_CRS_TIMEOUT
3852   *            @arg @ref RCC_CRS_SYNCOK
3853   *            @arg @ref RCC_CRS_SYNCWARN
3854   *            @arg @ref RCC_CRS_SYNCERR
3855   *            @arg @ref RCC_CRS_SYNCMISS
3856   *            @arg @ref RCC_CRS_TRIMOVF
3857   */
HAL_RCCEx_CRSWaitSynchronization(uint32_t Timeout)3858 uint32_t HAL_RCCEx_CRSWaitSynchronization(uint32_t Timeout)
3859 {
3860   uint32_t crsstatus = RCC_CRS_NONE;
3861   uint32_t tickstart;
3862 
3863   /* Get timeout */
3864   tickstart = HAL_GetTick();
3865 
3866   /* Wait for CRS flag or timeout detection */
3867   do
3868   {
3869     if (Timeout != HAL_MAX_DELAY)
3870     {
3871       if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
3872       {
3873         crsstatus = RCC_CRS_TIMEOUT;
3874       }
3875     }
3876     /* Check CRS SYNCOK flag  */
3877     if (__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCOK))
3878     {
3879       /* CRS SYNC event OK */
3880       crsstatus |= RCC_CRS_SYNCOK;
3881 
3882       /* Clear CRS SYNC event OK bit */
3883       __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCOK);
3884     }
3885 
3886     /* Check CRS SYNCWARN flag  */
3887     if (__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCWARN))
3888     {
3889       /* CRS SYNC warning */
3890       crsstatus |= RCC_CRS_SYNCWARN;
3891 
3892       /* Clear CRS SYNCWARN bit */
3893       __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCWARN);
3894     }
3895 
3896     /* Check CRS TRIM overflow flag  */
3897     if (__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_TRIMOVF))
3898     {
3899       /* CRS SYNC Error */
3900       crsstatus |= RCC_CRS_TRIMOVF;
3901 
3902       /* Clear CRS Error bit */
3903       __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_TRIMOVF);
3904     }
3905 
3906     /* Check CRS Error flag  */
3907     if (__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCERR))
3908     {
3909       /* CRS SYNC Error */
3910       crsstatus |= RCC_CRS_SYNCERR;
3911 
3912       /* Clear CRS Error bit */
3913       __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCERR);
3914     }
3915 
3916     /* Check CRS SYNC Missed flag  */
3917     if (__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCMISS))
3918     {
3919       /* CRS SYNC Missed */
3920       crsstatus |= RCC_CRS_SYNCMISS;
3921 
3922       /* Clear CRS SYNC Missed bit */
3923       __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCMISS);
3924     }
3925 
3926     /* Check CRS Expected SYNC flag  */
3927     if (__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_ESYNC))
3928     {
3929       /* frequency error counter reached a zero value */
3930       __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_ESYNC);
3931     }
3932   } while (RCC_CRS_NONE == crsstatus);
3933 
3934   return crsstatus;
3935 }
3936 
3937 /**
3938   * @brief Handle the Clock Recovery System interrupt request.
3939   * @retval None
3940   */
HAL_RCCEx_CRS_IRQHandler(void)3941 void HAL_RCCEx_CRS_IRQHandler(void)
3942 {
3943   uint32_t crserror = RCC_CRS_NONE;
3944   /* Get current IT flags and IT sources values */
3945   uint32_t itflags = READ_REG(CRS->ISR);
3946   uint32_t itsources = READ_REG(CRS->CR);
3947 
3948   /* Check CRS SYNCOK flag  */
3949   if (((itflags & RCC_CRS_FLAG_SYNCOK) != 0U) && ((itsources & RCC_CRS_IT_SYNCOK) != 0U))
3950   {
3951     /* Clear CRS SYNC event OK flag */
3952     WRITE_REG(CRS->ICR, CRS_ICR_SYNCOKC);
3953 
3954     /* user callback */
3955     HAL_RCCEx_CRS_SyncOkCallback();
3956   }
3957   /* Check CRS SYNCWARN flag  */
3958   else if (((itflags & RCC_CRS_FLAG_SYNCWARN) != 0U) && ((itsources & RCC_CRS_IT_SYNCWARN) != 0U))
3959   {
3960     /* Clear CRS SYNCWARN flag */
3961     WRITE_REG(CRS->ICR, CRS_ICR_SYNCWARNC);
3962 
3963     /* user callback */
3964     HAL_RCCEx_CRS_SyncWarnCallback();
3965   }
3966   /* Check CRS Expected SYNC flag  */
3967   else if (((itflags & RCC_CRS_FLAG_ESYNC) != 0U) && ((itsources & RCC_CRS_IT_ESYNC) != 0U))
3968   {
3969     /* frequency error counter reached a zero value */
3970     WRITE_REG(CRS->ICR, CRS_ICR_ESYNCC);
3971 
3972     /* user callback */
3973     HAL_RCCEx_CRS_ExpectedSyncCallback();
3974   }
3975   /* Check CRS Error flags  */
3976   else
3977   {
3978     if (((itflags & RCC_CRS_FLAG_ERR) != 0U) && ((itsources & RCC_CRS_IT_ERR) != 0U))
3979     {
3980       if ((itflags & RCC_CRS_FLAG_SYNCERR) != 0U)
3981       {
3982         crserror |= RCC_CRS_SYNCERR;
3983       }
3984       if ((itflags & RCC_CRS_FLAG_SYNCMISS) != 0U)
3985       {
3986         crserror |= RCC_CRS_SYNCMISS;
3987       }
3988       if ((itflags & RCC_CRS_FLAG_TRIMOVF) != 0U)
3989       {
3990         crserror |= RCC_CRS_TRIMOVF;
3991       }
3992 
3993       /* Clear CRS Error flags */
3994       WRITE_REG(CRS->ICR, CRS_ICR_ERRC);
3995 
3996       /* user error callback */
3997       HAL_RCCEx_CRS_ErrorCallback(crserror);
3998     }
3999   }
4000 }
4001 
4002 /**
4003   * @brief  RCCEx Clock Recovery System SYNCOK interrupt callback.
4004   * @retval none
4005   */
HAL_RCCEx_CRS_SyncOkCallback(void)4006 __weak void HAL_RCCEx_CRS_SyncOkCallback(void)
4007 {
4008   /* NOTE : This function should not be modified, when the callback is needed,
4009             the @ref HAL_RCCEx_CRS_SyncOkCallback should be implemented in the user file
4010    */
4011 }
4012 
4013 /**
4014   * @brief  RCCEx Clock Recovery System SYNCWARN interrupt callback.
4015   * @retval none
4016   */
HAL_RCCEx_CRS_SyncWarnCallback(void)4017 __weak void HAL_RCCEx_CRS_SyncWarnCallback(void)
4018 {
4019   /* NOTE : This function should not be modified, when the callback is needed,
4020             the @ref HAL_RCCEx_CRS_SyncWarnCallback should be implemented in the user file
4021    */
4022 }
4023 
4024 /**
4025   * @brief  RCCEx Clock Recovery System Expected SYNC interrupt callback.
4026   * @retval none
4027   */
HAL_RCCEx_CRS_ExpectedSyncCallback(void)4028 __weak void HAL_RCCEx_CRS_ExpectedSyncCallback(void)
4029 {
4030   /* NOTE : This function should not be modified, when the callback is needed,
4031             the @ref HAL_RCCEx_CRS_ExpectedSyncCallback should be implemented in the user file
4032    */
4033 }
4034 
4035 /**
4036   * @brief  RCCEx Clock Recovery System Error interrupt callback.
4037   * @param  Error Combination of Error status.
4038   *         This parameter can be a combination of the following values:
4039   *           @arg @ref RCC_CRS_SYNCERR
4040   *           @arg @ref RCC_CRS_SYNCMISS
4041   *           @arg @ref RCC_CRS_TRIMOVF
4042   * @retval none
4043   */
HAL_RCCEx_CRS_ErrorCallback(uint32_t Error)4044 __weak void HAL_RCCEx_CRS_ErrorCallback(uint32_t Error)
4045 {
4046   /* Prevent unused argument(s) compilation warning */
4047   UNUSED(Error);
4048 
4049   /* NOTE : This function should not be modified, when the callback is needed,
4050             the @ref HAL_RCCEx_CRS_ErrorCallback should be implemented in the user file
4051    */
4052 }
4053 
4054 /**
4055   * @}
4056   */
4057 
4058 #endif /* CRS */
4059 
4060 /**
4061   * @}
4062   */
4063 
4064 /** @addtogroup RCCEx_Private_Functions
4065   * @{
4066   */
4067 /**
4068   * @brief  Configure the PLL 1 source clock.
4069   * @param  PllSource  PLL1 source clock it can be :
4070   *                             RCC_PLLSOURCE_NONE
4071   *                             RCC_PLLSOURCE_MSI
4072   *                             RCC_PLLSOURCE_HSI
4073   *                             RCC_PLLSOURCE_HSE
4074   *
4075   * @retval HAL status
4076   */
RCCEx_PLLSource_Enable(uint32_t PllSource)4077 static HAL_StatusTypeDef RCCEx_PLLSource_Enable(uint32_t PllSource)
4078 {
4079   uint32_t tickstart;
4080   HAL_StatusTypeDef status = HAL_OK;
4081 
4082   switch (PllSource)
4083   {
4084     case RCC_PLLSOURCE_MSI:
4085       /* Check whether MSI in not ready and enable it */
4086       if (READ_BIT(RCC->CR, RCC_CR_MSISRDY) == 0U)
4087       {
4088         /* Enable the Internal Multi Speed oscillator (MSI). */
4089         __HAL_RCC_MSI_ENABLE();
4090 
4091         /* Get timeout */
4092         tickstart = HAL_GetTick();
4093 
4094         /* Wait till MSI is ready */
4095         while (READ_BIT(RCC->CR, RCC_CR_MSISRDY) == 0U)
4096         {
4097           if ((HAL_GetTick() - tickstart) > MSI_TIMEOUT_VALUE)
4098           {
4099             status = HAL_TIMEOUT;
4100             break;
4101           }
4102         }
4103       }
4104       break;
4105 
4106     case RCC_PLLSOURCE_HSI:
4107       /* Check whether HSI in not ready and enable it */
4108       if (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == 0U)
4109       {
4110         /* Enable the Internal High Speed oscillator (HSI) */
4111         __HAL_RCC_HSI_ENABLE();
4112 
4113         /* Get timeout */
4114         tickstart = HAL_GetTick();
4115 
4116         /* Wait till MSI is ready */
4117         while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == 0U)
4118         {
4119           if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)
4120           {
4121             status = HAL_TIMEOUT;
4122             break;
4123           }
4124         }
4125       }
4126       break;
4127 
4128     case RCC_PLLSOURCE_HSE:
4129       /* Check whether HSE in not ready and enable it */
4130       if (READ_BIT(RCC->CR, RCC_CR_HSERDY) == 0U)
4131       {
4132         /* Enable the External High Speed oscillator (HSE) */
4133         SET_BIT(RCC->CR, RCC_CR_HSEON);
4134 
4135         /* Get Start Tick*/
4136         tickstart = HAL_GetTick();
4137 
4138         /* Wait till HSE is ready */
4139         while (READ_BIT(RCC->CR, RCC_CR_HSERDY) == 0U)
4140         {
4141           if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
4142           {
4143             status = HAL_TIMEOUT;
4144             break;
4145           }
4146         }
4147       }
4148       break;
4149 
4150     default:
4151       status = HAL_ERROR;
4152       break;
4153   }
4154 
4155   return status;
4156 }
4157 
4158 /**
4159   * @brief  Configure the PLL2 VCI ranges, multiplication and division factors and enable it
4160   * @param  pll2: Pointer to an RCC_PLL2InitTypeDef structure that
4161   *         contains the configuration parameters as well as VCI clock ranges.
4162   * @note   PLL2 is temporary disabled to apply new parameters
4163   *
4164   * @retval HAL status
4165   */
RCCEx_PLL2_Config(const RCC_PLL2InitTypeDef * pll2)4166 static HAL_StatusTypeDef RCCEx_PLL2_Config(const RCC_PLL2InitTypeDef *pll2)
4167 {
4168 
4169   uint32_t tickstart;
4170   assert_param(IS_RCC_PLLSOURCE(pll2->PLL2Source));
4171   assert_param(IS_RCC_PLLM_VALUE(pll2->PLL2M));
4172   assert_param(IS_RCC_PLLN_VALUE(pll2->PLL2N));
4173   assert_param(IS_RCC_PLLP_VALUE(pll2->PLL2P));
4174   assert_param(IS_RCC_PLLQ_VALUE(pll2->PLL2Q));
4175   assert_param(IS_RCC_PLLR_VALUE(pll2->PLL2R));
4176 
4177   /* Disable  PLL2 */
4178   __HAL_RCC_PLL2_DISABLE();
4179 
4180   /* Get Start Tick*/
4181   tickstart = HAL_GetTick();
4182 
4183   /* Wait till PLL is ready */
4184   while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) != 0U)
4185   {
4186     if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE)
4187     {
4188       return HAL_TIMEOUT;
4189     }
4190   }
4191 
4192   /* Configure PLL2 multiplication and division factors */
4193   __HAL_RCC_PLL2_CONFIG(pll2->PLL2Source,
4194                         pll2->PLL2M,
4195                         pll2->PLL2N,
4196                         pll2->PLL2P,
4197                         pll2->PLL2Q,
4198                         pll2->PLL2R);
4199 
4200   /* Select PLL2 input reference frequency range: VCI */
4201   __HAL_RCC_PLL2_VCIRANGE(pll2->PLL2RGE);
4202 
4203   /* Configure the PLL2 Clock output(s) */
4204   __HAL_RCC_PLL2CLKOUT_ENABLE(pll2->PLL2ClockOut);
4205 
4206   /* Disable PLL2FRACN  */
4207   __HAL_RCC_PLL2FRACN_DISABLE();
4208 
4209   /* Configures PLL2 clock Fractional Part Of The Multiplication Factor */
4210   __HAL_RCC_PLL2FRACN_CONFIG(pll2->PLL2FRACN);
4211 
4212   /* Enable PLL2FRACN  */
4213   __HAL_RCC_PLL2FRACN_ENABLE();
4214 
4215   /* Enable  PLL2 */
4216   __HAL_RCC_PLL2_ENABLE();
4217 
4218   /* Get Start Tick*/
4219   tickstart = HAL_GetTick();
4220 
4221   /* Wait till PLL2 is ready */
4222   while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) == 0U)
4223   {
4224     if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE)
4225     {
4226       return HAL_TIMEOUT;
4227     }
4228   }
4229   return HAL_OK;
4230 
4231 }
4232 
4233 /**
4234   * @brief  Configure the PLL3 VCI ranges, multiplication and division factors and enable it
4235   * @param  pll3: Pointer to an RCC_PLL3InitTypeDef structure that
4236   *         contains the configuration parameters as well as VCI clock ranges.
4237   * @note   PLL3 is temporary disabled to apply new parameters
4238   * @retval HAL status
4239   */
RCCEx_PLL3_Config(const RCC_PLL3InitTypeDef * pll3)4240 static HAL_StatusTypeDef RCCEx_PLL3_Config(const RCC_PLL3InitTypeDef *pll3)
4241 {
4242   uint32_t tickstart;
4243   assert_param(IS_RCC_PLLSOURCE(pll3->PLL3Source));
4244   assert_param(IS_RCC_PLLM_VALUE(pll3->PLL3M));
4245   assert_param(IS_RCC_PLLN_VALUE(pll3->PLL3N));
4246   assert_param(IS_RCC_PLLP_VALUE(pll3->PLL3P));
4247   assert_param(IS_RCC_PLLQ_VALUE(pll3->PLL3Q));
4248   assert_param(IS_RCC_PLLR_VALUE(pll3->PLL3R));
4249 
4250   /* Disable  PLL3 */
4251   __HAL_RCC_PLL3_DISABLE();
4252 
4253   /* Get Start Tick*/
4254   tickstart = HAL_GetTick();
4255 
4256   /* Wait till PLL is ready */
4257   while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL3RDY) != 0U)
4258   {
4259     if ((HAL_GetTick() - tickstart) > PLL3_TIMEOUT_VALUE)
4260     {
4261       return HAL_TIMEOUT;
4262     }
4263   }
4264 
4265   /* Configure PLL3 multiplication and division factors */
4266   __HAL_RCC_PLL3_CONFIG(pll3->PLL3Source,
4267                         pll3->PLL3M,
4268                         pll3->PLL3N,
4269                         pll3->PLL3P,
4270                         pll3->PLL3Q,
4271                         pll3->PLL3R);
4272 
4273   /* Select PLL3 input reference frequency range: VCI */
4274   __HAL_RCC_PLL3_VCIRANGE(pll3->PLL3RGE);
4275 
4276   /* Configure the PLL3 Clock output(s) */
4277   __HAL_RCC_PLL3CLKOUT_ENABLE(pll3->PLL3ClockOut);
4278 
4279   /* Disable PLL3FRACN  */
4280   __HAL_RCC_PLL3FRACN_DISABLE();
4281 
4282   /* Configures PLL3 clock Fractional Part Of The Multiplication Factor */
4283   __HAL_RCC_PLL3FRACN_CONFIG(pll3->PLL3FRACN);
4284 
4285   /* Enable PLL3FRACN  */
4286   __HAL_RCC_PLL3FRACN_ENABLE();
4287 
4288   /* Enable  PLL3 */
4289   __HAL_RCC_PLL3_ENABLE();
4290 
4291   /* Get Start Tick*/
4292   tickstart = HAL_GetTick();
4293 
4294   /* Wait till PLL3 is ready */
4295   while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL3RDY) == 0U)
4296   {
4297     if ((HAL_GetTick() - tickstart) > PLL3_TIMEOUT_VALUE)
4298     {
4299       return HAL_TIMEOUT;
4300     }
4301   }
4302   return HAL_OK;
4303 }
4304 
4305 /**
4306   * @}
4307   */
4308 
4309 #endif /* HAL_RCC_MODULE_ENABLED */
4310 /**
4311   * @}
4312   */
4313 
4314 /**
4315   * @}
4316   */
4317 
4318 /**
4319   * @}
4320   */
4321 
4322