1 /**
2   ******************************************************************************
3   * @file    stm32n6xx_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 extension peripheral:
8   *           + Extended Peripheral Control functions
9   *
10   ******************************************************************************
11   * @attention
12   *
13   * Copyright (c) 2023 STMicroelectronics.
14   * All rights reserved.
15   *
16   * This software is licensed under terms that can be found in the LICENSE file in
17   * the root directory of this software component.
18   * If no LICENSE file comes with this software, it is provided AS-IS.
19   *
20   ******************************************************************************
21   */
22 
23 /* Includes ------------------------------------------------------------------*/
24 #include "stm32n6xx_hal.h"
25 
26 /** @addtogroup STM32N6xx_HAL_Driver
27   * @{
28   */
29 
30 /** @defgroup RCCEx  RCCEx
31   * @brief RCC HAL module driver
32   * @{
33   */
34 
35 #ifdef HAL_RCC_MODULE_ENABLED
36 
37 /* Private typedef -----------------------------------------------------------*/
38 /* Private defines -----------------------------------------------------------*/
39 /** @defgroup RCCEx_Private_Constants RCCEx Private Constants
40   * @{
41   */
42 #if defined(USE_FPGA)
43 /* ***** FPGA values ******/
44 #define RCC_PLL_SOURCE_FREQ   32000000UL  /* PLL source forced to 32MHz */
45 #endif /* USE_FPGA */
46 /**
47   * @}
48   */
49 
50 /* Private macros ------------------------------------------------------------*/
51 /* Private variables ---------------------------------------------------------*/
52 /* Private function prototypes -----------------------------------------------*/
53 /** @defgroup RCCEx_Private_Functions_Prototypes RCCEx Private Functions Prototypes
54   * @{
55   */
56 static uint32_t RCCEx_GetHCLKFreq(uint32_t SYSCLK_Frequency);
57 static uint32_t RCCEx_GetPCLK1Freq(uint32_t HCLK_Frequency);
58 static uint32_t RCCEx_GetPCLK2Freq(uint32_t PCLK_Frequency);
59 static uint32_t RCCEx_GetPCLK4Freq(uint32_t PCLK_Frequency);
60 static uint32_t RCCEx_GetPCLK5Freq(uint32_t PCLK_Frequency);
61 static uint32_t RCCEx_GetPLLSourceFreq(uint32_t PLLsource);
62 static uint32_t RCCEx_CalcPLLFreq(uint32_t PLLInputFreq, uint32_t M, uint32_t N,
63                                   uint32_t FRACN, uint32_t P1, uint32_t P2);
64 static uint32_t RCCEx_GetADCCLKFreq(uint32_t ADCxSource);
65 static uint32_t RCCEx_GetADFCLKFreq(uint32_t ADFxSource);
66 static uint32_t RCCEx_GetCLKPCLKFreq(uint32_t CLKPxSource);
67 static uint32_t RCCEx_GetCSICLKFreq(void);
68 static uint32_t RCCEx_GetDCMIPPCLKFreq(uint32_t DCMIPPxSource);
69 static uint32_t RCCEx_GetETH1CLKFreq(uint32_t ETH1xSource);
70 static uint32_t RCCEx_GetETH1PTPCLKFreq(uint32_t ETH1PTPxSource);
71 static uint32_t RCCEx_GetFDCANCLKFreq(uint32_t FDCANxSource);
72 static uint32_t RCCEx_GetFMCCLKFreq(uint32_t FMCxSource);
73 static uint32_t RCCEx_GetI2CCLKFreq(uint32_t I2CxSource);
74 static uint32_t RCCEx_GetI3CCLKFreq(uint32_t I3CxSource);
75 static uint32_t RCCEx_GetLPTIMCLKFreq(uint32_t LPTIMxSource);
76 static uint32_t RCCEx_GetLPUARTCLKFreq(uint32_t LPUARTxSource);
77 static uint32_t RCCEx_GetLTDCCLKFreq(uint32_t LPTIMxSource);
78 static uint32_t RCCEx_GetMDFCLKFreq(uint32_t MDFxSource);
79 static uint32_t RCCEx_GetPSSICLKFreq(uint32_t PSSIxSource);
80 static uint32_t RCCEx_GetRTCCLKFreq(void);
81 static uint32_t RCCEx_GetSAICLKFreq(uint32_t SAIxSource);
82 static uint32_t RCCEx_GetSDMMCCLKFreq(uint32_t SDMMCxSource);
83 static uint32_t RCCEx_GetSPDIFRXCLKFreq(uint32_t SPDIFRXxSource);
84 static uint32_t RCCEx_GetSPICLKFreq(uint32_t SPIxSource);
85 static uint32_t RCCEx_GetUARTCLKFreq(uint32_t UARTxSource);
86 static uint32_t RCCEx_GetUSARTCLKFreq(uint32_t USARTxSource);
87 static uint32_t RCCEx_GetOTGPHYCLKFreq(uint32_t OTGPHYxSource);
88 static uint32_t RCCEx_GetOTGPHYCKREFCLKFreq(uint32_t OTGPHYxCKREFSource);
89 static uint32_t RCCEx_GetXSPICLKFreq(uint32_t XSPIxSource);
90 /**
91   * @}
92   */
93 
94 /* Exported functions --------------------------------------------------------*/
95 /** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions
96   * @{
97   */
98 
99 /** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions
100   *  @brief  Extended Peripheral Control functions
101   *
102 @verbatim
103  ===============================================================================
104                 ##### Extended Peripheral Control functions  #####
105  ===============================================================================
106     [..]
107     This subsection provides a set of functions allowing to control the RCC Clocks
108     frequencies.
109     [..]
110     (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to
111         select the RTC clock source; in this case the Backup domain will be reset in
112         order to modify the RTC Clock source, as consequence RTC registers (including
113         the backup registers) and RCC_BDCR register are set to their reset values.
114 
115 @endverbatim
116   * @{
117   */
118 /**
119   * @brief  Initializes the RCC extended peripherals clocks according to the specified
120   *         parameters in the RCC_PeriphCLKInitTypeDef.
121   * @param  PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that
122   *         contains the configuration information for the Extended Peripherals clocks
123   *         (ADC, ADF1, CKPER, DCMI, DCMIPP, FDCAN, FMC, I2C1, I2C2, I2C3, I2C4, I3C1, I3C2,
124   *         LPTIM1, LPTIM2, LPTIM3, LPTIM4, LPTIM5, LTDC, LPUART1, MDF1, PSSI, RTC, SAI1, SAI2,
125   *         SDMMC1, SDMMC2, SPDIFRX1, SPI1, SPI2, SPI3, SPI4, SPI5, SPI6, TIM,
126   *         USART1, USART2, USART3, UART4, UART5, USART6, UART7, UART8, UART9, USART10,
127   *         USBPHY1, USBPHY2, USB OTGHS1, USB OTGHS2, XSPI1, XSPI2, XSPI3).
128   * @note   Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select
129   *         the RTC clock source; in this case the Backup domain will be reset in
130   *         order to modify the RTC Clock source, as consequence RTC registers (including
131   *         the backup registers) are set to their reset values.
132   * @note   Dynamic switches are used for peripheral input clock selection meaning the switch setting
133   *         can only be changed if both input clocks are present during transition time.
134   * @note   Care must be taken when RCC_PPPCLKSOURCE_ICx is selected. The ICx ClockSelection and ClockDivider fields
135   *         modification indeed impacts all peripherals using this ICx as clock source.
136   *
137   * @retval HAL status
138   */
HAL_RCCEx_PeriphCLKConfig(const RCC_PeriphCLKInitTypeDef * PeriphClkInit)139 HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(const RCC_PeriphCLKInitTypeDef  *PeriphClkInit)
140 {
141   uint32_t tmpreg;
142   uint32_t tickstart;
143   HAL_StatusTypeDef ret = HAL_OK;      /* Intermediate status */
144   HAL_StatusTypeDef status = HAL_OK;   /* Final status */
145 
146   /* Check the parameters */
147   assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection));
148 
149   /*---------------------------- RTC configuration -------------------------------*/
150   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_RTC) == RCC_PERIPHCLK_RTC)
151   {
152     /* check for RTC Parameters used to output RTCCLK */
153     assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection));
154 
155     /* As the RTC clock source selection can be changed only if the Backup Domain is reset */
156     /* reset the Backup domain only if the RTC Clock source selection is modified from default reset value */
157     tmpreg = LL_RCC_GetRTCClockSource();
158 
159     if ((tmpreg != RCC_RTCCLKSOURCE_DISABLE) && (tmpreg != (PeriphClkInit->RTCClockSelection & RCC_CCIPR7_RTCSEL)))
160     {
161       /* Enable write access to Backup domain */
162       SET_BIT(PWR->DBPCR, PWR_DBPCR_DBP);
163 
164       /* Read back to check Backup domain enabled */
165       if (READ_BIT(PWR->DBPCR, PWR_DBPCR_DBP) == 0U)
166       {
167         ret = HAL_ERROR;
168       }
169       else
170       {
171 #if 0 /* TO DO */
172         /* Store the content of BDCR register before the reset of Backup Domain */
173         /* excepted the RTC clock source selection that will be changed */
174         tmpreg = READ_BIT(RCC->BDCR, ~(RCC_BDCR_RTCSEL));
175         __HAL_RCC_BACKUPRESET_FORCE();
176         __HAL_RCC_BACKUPRESET_RELEASE();
177         /* Restore the content of BDCR register */
178         WRITE_REG(RCC->BDCR, tmpreg);
179 #endif /* #if 0  TO DO */
180       }
181     }
182 
183     if (ret == HAL_OK)
184     {
185       /* If LSE is selected as RTC clock source (and enabled prior to Backup Domain reset), wait for LSE reactivation */
186       if (PeriphClkInit->RTCClockSelection == RCC_RTCCLKSOURCE_LSE)
187       {
188         /* Get Start Tick*/
189         tickstart = HAL_GetTick();
190 
191         /* Wait till LSE is ready */
192         while (LL_RCC_LSE_IsReady() == 0U)
193         {
194           if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)
195           {
196             ret = HAL_TIMEOUT;
197             break;
198           }
199         }
200       }
201 
202       if (ret == HAL_OK)
203       {
204         __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection);
205       }
206       else
207       {
208         /* set overall return value */
209         status = ret;
210       }
211     }
212     else
213     {
214       /* set overall return value */
215       status = ret;
216     }
217   }
218 
219   /*------------------------------------ CKPER configuration --------------------------------------*/
220   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_CKPER) == RCC_PERIPHCLK_CKPER)
221   {
222     /* Check the parameters */
223     assert_param(IS_RCC_CKPERCLKSOURCE(PeriphClkInit->CkperClockSelection));
224 
225     if (PeriphClkInit->CkperClockSelection == RCC_CLKPCLKSOURCE_IC5)
226     {
227       /* Check the parameters */
228       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC5].ClockSelection));
229       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC5].ClockDivider));
230 
231       /* Set IC5 configuration */
232       MODIFY_REG(RCC->IC5CFGR, RCC_IC5CFGR_IC5SEL | RCC_IC5CFGR_IC5INT,
233                  PeriphClkInit->ICSelection[RCC_IC5].ClockSelection | \
234                  ((PeriphClkInit->ICSelection[RCC_IC5].ClockDivider - 1U) << RCC_IC5CFGR_IC5INT_Pos));
235 
236       LL_RCC_IC5_Enable();
237     }
238     else if (PeriphClkInit->CkperClockSelection == RCC_CLKPCLKSOURCE_IC10)
239     {
240       /* Check the parameters */
241       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC10].ClockSelection));
242       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC10].ClockDivider));
243 
244       /* Set IC10 configuration */
245       MODIFY_REG(RCC->IC10CFGR, RCC_IC10CFGR_IC10SEL | RCC_IC10CFGR_IC10INT,
246                  PeriphClkInit->ICSelection[RCC_IC10].ClockSelection | \
247                  ((PeriphClkInit->ICSelection[RCC_IC10].ClockDivider - 1U) << RCC_IC10CFGR_IC10INT_Pos));
248 
249       LL_RCC_IC10_Enable();
250     }
251     else if (PeriphClkInit->CkperClockSelection == RCC_CLKPCLKSOURCE_IC15)
252     {
253       /* Check the parameters */
254       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
255       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
256 
257       /* Set IC15 configuration */
258       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
259                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
260                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
261 
262       LL_RCC_IC15_Enable();
263     }
264     else if (PeriphClkInit->CkperClockSelection == RCC_CLKPCLKSOURCE_IC19)
265     {
266       /* Check the parameters */
267       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC19].ClockSelection));
268       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC19].ClockDivider));
269 
270       /* Set IC19 configuration */
271       MODIFY_REG(RCC->IC19CFGR, RCC_IC19CFGR_IC19SEL | RCC_IC19CFGR_IC19INT,
272                  PeriphClkInit->ICSelection[RCC_IC19].ClockSelection | \
273                  ((PeriphClkInit->ICSelection[RCC_IC19].ClockDivider - 1U) << RCC_IC19CFGR_IC19INT_Pos));
274 
275       LL_RCC_IC19_Enable();
276     }
277     else if (PeriphClkInit->CkperClockSelection == RCC_CLKPCLKSOURCE_IC20)
278     {
279       /* Check the parameters */
280       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC20].ClockSelection));
281       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC20].ClockDivider));
282 
283       /* Set IC20 configuration */
284       MODIFY_REG(RCC->IC20CFGR, RCC_IC20CFGR_IC20SEL | RCC_IC20CFGR_IC20INT,
285                  PeriphClkInit->ICSelection[RCC_IC20].ClockSelection | \
286                  ((PeriphClkInit->ICSelection[RCC_IC20].ClockDivider - 1U) << RCC_IC20CFGR_IC20INT_Pos));
287 
288       LL_RCC_IC20_Enable();
289     }
290     else
291     {
292       /* No ICx selected as source */
293     }
294 
295     /* Configure the CKPER clock source */
296     __HAL_RCC_CLKP_CONFIG(PeriphClkInit->CkperClockSelection);
297   }
298 
299   /*-------------------------- XSPI1 clock source configuration ----------------*/
300   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_XSPI1) == RCC_PERIPHCLK_XSPI1)
301   {
302     /* Check the parameters */
303     assert_param(IS_RCC_XSPI1CLKSOURCE(PeriphClkInit->Xspi1ClockSelection));
304 
305     if (PeriphClkInit->Xspi1ClockSelection == RCC_XSPI1CLKSOURCE_IC3)
306     {
307       /* Check the parameters */
308       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC3].ClockSelection));
309       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC3].ClockDivider));
310 
311       /* Set IC3 configuration */
312       MODIFY_REG(RCC->IC3CFGR, RCC_IC3CFGR_IC3SEL | RCC_IC3CFGR_IC3INT,
313                  PeriphClkInit->ICSelection[RCC_IC3].ClockSelection | \
314                  ((PeriphClkInit->ICSelection[RCC_IC3].ClockDivider - 1U) << RCC_IC3CFGR_IC3INT_Pos));
315 
316       LL_RCC_IC3_Enable();
317     }
318     else if (PeriphClkInit->Xspi1ClockSelection == RCC_XSPI1CLKSOURCE_IC4)
319     {
320       /* Check the parameters */
321       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC4].ClockSelection));
322       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC4].ClockDivider));
323 
324       /* Set IC4 configuration */
325       MODIFY_REG(RCC->IC4CFGR, RCC_IC4CFGR_IC4SEL | RCC_IC4CFGR_IC4INT,
326                  PeriphClkInit->ICSelection[RCC_IC4].ClockSelection | \
327                  ((PeriphClkInit->ICSelection[RCC_IC4].ClockDivider - 1U) << RCC_IC4CFGR_IC4INT_Pos));
328 
329       LL_RCC_IC4_Enable();
330     }
331     else if (PeriphClkInit->Xspi1ClockSelection == RCC_XSPI1CLKSOURCE_CLKP)
332     {
333       LL_RCC_CLKP_Enable();
334     }
335     else
336     {
337       /* No specific enable to do on other sources */
338     }
339 
340     /* Configure the XSPI1 clock source */
341     __HAL_RCC_XSPI1_CONFIG(PeriphClkInit->Xspi1ClockSelection);
342   }
343 
344   /*-------------------------- XSPI2 clock source configuration ----------------*/
345   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_XSPI2) == RCC_PERIPHCLK_XSPI2)
346   {
347     /* Check the parameters */
348     assert_param(IS_RCC_XSPI2CLKSOURCE(PeriphClkInit->Xspi2ClockSelection));
349 
350     if (PeriphClkInit->Xspi2ClockSelection == RCC_XSPI2CLKSOURCE_IC3)
351     {
352       /* Check the parameters */
353       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC3].ClockSelection));
354       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC3].ClockDivider));
355 
356       /* Set IC3 configuration */
357       MODIFY_REG(RCC->IC3CFGR, RCC_IC3CFGR_IC3SEL | RCC_IC3CFGR_IC3INT,
358                  PeriphClkInit->ICSelection[RCC_IC3].ClockSelection | \
359                  ((PeriphClkInit->ICSelection[RCC_IC3].ClockDivider - 1U) << RCC_IC3CFGR_IC3INT_Pos));
360 
361       LL_RCC_IC3_Enable();
362     }
363     else if (PeriphClkInit->Xspi2ClockSelection == RCC_XSPI2CLKSOURCE_IC4)
364     {
365       /* Check the parameters */
366       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC4].ClockSelection));
367       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC4].ClockDivider));
368 
369       /* Set IC4 configuration */
370       MODIFY_REG(RCC->IC4CFGR, RCC_IC4CFGR_IC4SEL | RCC_IC4CFGR_IC4INT,
371                  PeriphClkInit->ICSelection[RCC_IC4].ClockSelection | \
372                  ((PeriphClkInit->ICSelection[RCC_IC4].ClockDivider - 1U) << RCC_IC4CFGR_IC4INT_Pos));
373 
374       LL_RCC_IC4_Enable();
375     }
376     else if (PeriphClkInit->Xspi2ClockSelection == RCC_XSPI2CLKSOURCE_CLKP)
377     {
378       LL_RCC_CLKP_Enable();
379     }
380     else
381     {
382       /* No specific enable to do on other sources */
383     }
384 
385     /* Configure the XSPI2 clock source */
386     __HAL_RCC_XSPI2_CONFIG(PeriphClkInit->Xspi2ClockSelection);
387   }
388 
389   /*-------------------------- XSPI3 clock source configuration ----------------*/
390   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_XSPI3) == RCC_PERIPHCLK_XSPI3)
391   {
392     /* Check the parameters */
393     assert_param(IS_RCC_XSPI3CLKSOURCE(PeriphClkInit->Xspi3ClockSelection));
394 
395     if (PeriphClkInit->Xspi3ClockSelection == RCC_XSPI3CLKSOURCE_IC3)
396     {
397       /* Check the parameters */
398       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC3].ClockSelection));
399       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC3].ClockDivider));
400 
401       /* Set IC3 configuration */
402       MODIFY_REG(RCC->IC3CFGR, RCC_IC3CFGR_IC3SEL | RCC_IC3CFGR_IC3INT,
403                  PeriphClkInit->ICSelection[RCC_IC3].ClockSelection | \
404                  ((PeriphClkInit->ICSelection[RCC_IC3].ClockDivider - 1U) << RCC_IC3CFGR_IC3INT_Pos));
405 
406       LL_RCC_IC3_Enable();
407     }
408     else if (PeriphClkInit->Xspi3ClockSelection == RCC_XSPI3CLKSOURCE_IC4)
409     {
410       /* Check the parameters */
411       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC4].ClockSelection));
412       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC4].ClockDivider));
413 
414       /* Set IC4 configuration */
415       MODIFY_REG(RCC->IC4CFGR, RCC_IC4CFGR_IC4SEL | RCC_IC4CFGR_IC4INT,
416                  PeriphClkInit->ICSelection[RCC_IC4].ClockSelection | \
417                  ((PeriphClkInit->ICSelection[RCC_IC4].ClockDivider - 1U) << RCC_IC4CFGR_IC4INT_Pos));
418 
419       LL_RCC_IC4_Enable();
420     }
421     else if (PeriphClkInit->Xspi3ClockSelection == RCC_XSPI3CLKSOURCE_CLKP)
422     {
423       LL_RCC_CLKP_Enable();
424     }
425     else
426     {
427       /* No specific enable to do on other sources */
428     }
429 
430     /* Configure the XSPI3 clock source */
431     __HAL_RCC_XSPI3_CONFIG(PeriphClkInit->Xspi3ClockSelection);
432   }
433 
434   /*---------------------------- FMC configuration -------------------------------*/
435   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_FMC) == RCC_PERIPHCLK_FMC)
436   {
437     /* Check the parameters */
438     assert_param(IS_RCC_FMCCLKSOURCE(PeriphClkInit->FmcClockSelection));
439 
440     if (PeriphClkInit->FmcClockSelection == RCC_FMCCLKSOURCE_IC3)
441     {
442       /* Check the parameters */
443       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC3].ClockSelection));
444       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC3].ClockDivider));
445 
446       /* Set IC3 configuration */
447       MODIFY_REG(RCC->IC3CFGR, RCC_IC3CFGR_IC3SEL | RCC_IC3CFGR_IC3INT,
448                  PeriphClkInit->ICSelection[RCC_IC3].ClockSelection | \
449                  ((PeriphClkInit->ICSelection[RCC_IC3].ClockDivider - 1U) << RCC_IC3CFGR_IC3INT_Pos));
450 
451       LL_RCC_IC3_Enable();
452     }
453     else if (PeriphClkInit->FmcClockSelection == RCC_FMCCLKSOURCE_IC4)
454     {
455       /* Check the parameters */
456       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC4].ClockSelection));
457       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC4].ClockDivider));
458 
459       /* Set IC4 configuration */
460       MODIFY_REG(RCC->IC4CFGR, RCC_IC4CFGR_IC4SEL | RCC_IC4CFGR_IC4INT,
461                  PeriphClkInit->ICSelection[RCC_IC4].ClockSelection | \
462                  ((PeriphClkInit->ICSelection[RCC_IC4].ClockDivider - 1U) << RCC_IC4CFGR_IC4INT_Pos));
463 
464       LL_RCC_IC4_Enable();
465     }
466     else if (PeriphClkInit->FmcClockSelection == RCC_FMCCLKSOURCE_CLKP)
467     {
468       LL_RCC_CLKP_Enable();
469     }
470     else
471     {
472       /* No specific enable to do on other sources */
473     }
474 
475     /* Set the source of FMC kernel clock*/
476     __HAL_RCC_FMC_CONFIG(PeriphClkInit->FmcClockSelection);
477   }
478 
479   /*------------------------------------- SDMMC1 Configuration ------------------------------------*/
480   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_SDMMC1) == RCC_PERIPHCLK_SDMMC1)
481   {
482     /* Check the parameters */
483     assert_param(IS_RCC_SDMMC1CLKSOURCE(PeriphClkInit->Sdmmc1ClockSelection));
484 
485     if (PeriphClkInit->Sdmmc1ClockSelection == RCC_SDMMC1CLKSOURCE_IC4)
486     {
487       /* Check the parameters */
488       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC4].ClockSelection));
489       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC4].ClockDivider));
490 
491       /* Set IC4 configuration */
492       MODIFY_REG(RCC->IC4CFGR, RCC_IC4CFGR_IC4SEL | RCC_IC4CFGR_IC4INT,
493                  PeriphClkInit->ICSelection[RCC_IC4].ClockSelection | \
494                  ((PeriphClkInit->ICSelection[RCC_IC4].ClockDivider - 1U) << RCC_IC4CFGR_IC4INT_Pos));
495 
496       LL_RCC_IC4_Enable();
497     }
498     else if (PeriphClkInit->Sdmmc1ClockSelection == RCC_SDMMC1CLKSOURCE_IC5)
499     {
500       /* Check the parameters */
501       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC5].ClockSelection));
502       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC5].ClockDivider));
503 
504       /* Set IC5 configuration */
505       MODIFY_REG(RCC->IC5CFGR, RCC_IC5CFGR_IC5SEL | RCC_IC5CFGR_IC5INT,
506                  PeriphClkInit->ICSelection[RCC_IC5].ClockSelection | \
507                  ((PeriphClkInit->ICSelection[RCC_IC5].ClockDivider - 1U) << RCC_IC5CFGR_IC5INT_Pos));
508 
509       LL_RCC_IC5_Enable();
510     }
511     else if (PeriphClkInit->Sdmmc1ClockSelection == RCC_SDMMC1CLKSOURCE_CLKP)
512     {
513       LL_RCC_CLKP_Enable();
514     }
515     else
516     {
517       /* No specific enable to do on other sources */
518     }
519 
520     /* Set the source of SDMMC1 clock*/
521     __HAL_RCC_SDMMC1_CONFIG(PeriphClkInit->Sdmmc1ClockSelection);
522   }
523 
524   /*------------------------------------- SDMMC2 Configuration ------------------------------------*/
525   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_SDMMC2) == RCC_PERIPHCLK_SDMMC2)
526   {
527     /* Check the parameters */
528     assert_param(IS_RCC_SDMMC2CLKSOURCE(PeriphClkInit->Sdmmc2ClockSelection));
529 
530     if (PeriphClkInit->Sdmmc2ClockSelection == RCC_SDMMC2CLKSOURCE_IC4)
531     {
532       /* Check the parameters */
533       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC4].ClockSelection));
534       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC4].ClockDivider));
535 
536       /* Set IC4 configuration */
537       MODIFY_REG(RCC->IC4CFGR, RCC_IC4CFGR_IC4SEL | RCC_IC4CFGR_IC4INT,
538                  PeriphClkInit->ICSelection[RCC_IC4].ClockSelection | \
539                  ((PeriphClkInit->ICSelection[RCC_IC4].ClockDivider - 1U) << RCC_IC4CFGR_IC4INT_Pos));
540 
541       LL_RCC_IC4_Enable();
542     }
543     else if (PeriphClkInit->Sdmmc2ClockSelection == RCC_SDMMC2CLKSOURCE_IC5)
544     {
545       /* Check the parameters */
546       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC5].ClockSelection));
547       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC5].ClockDivider));
548 
549       /* Set IC5 configuration */
550       MODIFY_REG(RCC->IC5CFGR, RCC_IC5CFGR_IC5SEL | RCC_IC5CFGR_IC5INT,
551                  PeriphClkInit->ICSelection[RCC_IC5].ClockSelection | \
552                  ((PeriphClkInit->ICSelection[RCC_IC5].ClockDivider - 1U) << RCC_IC5CFGR_IC5INT_Pos));
553 
554       LL_RCC_IC5_Enable();
555     }
556     else if (PeriphClkInit->Sdmmc2ClockSelection == RCC_SDMMC2CLKSOURCE_CLKP)
557     {
558       LL_RCC_CLKP_Enable();
559     }
560     else
561     {
562       /* No specific enable to do on other sources */
563     }
564 
565     /* Set the source of SDMMC2 clock*/
566     __HAL_RCC_SDMMC2_CONFIG(PeriphClkInit->Sdmmc2ClockSelection);
567   }
568 
569   /*---------------------------- ADC configuration -------------------------------*/
570   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_ADC) == RCC_PERIPHCLK_ADC)
571   {
572     /* Check the parameters */
573     assert_param(IS_RCC_ADCCLKSOURCE(PeriphClkInit->AdcClockSelection));
574     assert_param(IS_RCC_ADCDIVIDER(PeriphClkInit->AdcDivider));
575 
576     if (PeriphClkInit->AdcClockSelection == RCC_ADCCLKSOURCE_IC7)
577     {
578       /* Check the parameters */
579       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC7].ClockSelection));
580       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC7].ClockDivider));
581 
582       /* Set IC7 configuration */
583       MODIFY_REG(RCC->IC7CFGR, RCC_IC7CFGR_IC7SEL | RCC_IC7CFGR_IC7INT,
584                  PeriphClkInit->ICSelection[RCC_IC7].ClockSelection | \
585                  ((PeriphClkInit->ICSelection[RCC_IC7].ClockDivider - 1U) << RCC_IC7CFGR_IC7INT_Pos));
586 
587       LL_RCC_IC7_Enable();
588     }
589     else if (PeriphClkInit->AdcClockSelection == RCC_ADCCLKSOURCE_IC8)
590     {
591       /* Check the parameters */
592       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC8].ClockSelection));
593       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC8].ClockDivider));
594 
595       /* Set IC8 configuration */
596       MODIFY_REG(RCC->IC8CFGR, RCC_IC8CFGR_IC8SEL | RCC_IC8CFGR_IC8INT,
597                  PeriphClkInit->ICSelection[RCC_IC8].ClockSelection | \
598                  ((PeriphClkInit->ICSelection[RCC_IC8].ClockDivider - 1U) << RCC_IC8CFGR_IC8INT_Pos));
599 
600       LL_RCC_IC8_Enable();
601     }
602     else if (PeriphClkInit->AdcClockSelection == RCC_ADCCLKSOURCE_CLKP)
603     {
604       LL_RCC_CLKP_Enable();
605     }
606     else
607     {
608       /* No specific enable to do on other sources */
609     }
610 
611     /* Configure the ADC clock source and divider */
612     MODIFY_REG(RCC->CCIPR1, (RCC_CCIPR1_ADCPRE | RCC_CCIPR1_ADC12SEL), \
613                (((PeriphClkInit->AdcDivider - 1U) << RCC_CCIPR1_ADCPRE_Pos) | (PeriphClkInit->AdcClockSelection)));
614   }
615 
616   /*---------------------------- ADF1 configuration --------------------------*/
617   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_ADF1) == RCC_PERIPHCLK_ADF1)
618   {
619     /* Check the parameters */
620     assert_param(IS_RCC_ADF1CLKSOURCE(PeriphClkInit->Adf1ClockSelection));
621 
622     if (PeriphClkInit->Adf1ClockSelection == RCC_ADF1CLKSOURCE_IC7)
623     {
624       /* Check the parameters */
625       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC7].ClockSelection));
626       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC7].ClockDivider));
627 
628       /* Set IC7 configuration */
629       MODIFY_REG(RCC->IC7CFGR, RCC_IC7CFGR_IC7SEL | RCC_IC7CFGR_IC7INT,
630                  PeriphClkInit->ICSelection[RCC_IC7].ClockSelection | \
631                  ((PeriphClkInit->ICSelection[RCC_IC7].ClockDivider - 1U) << RCC_IC7CFGR_IC7INT_Pos));
632 
633       LL_RCC_IC7_Enable();
634     }
635     else if (PeriphClkInit->Adf1ClockSelection == RCC_ADF1CLKSOURCE_IC8)
636     {
637       /* Check the parameters */
638       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC8].ClockSelection));
639       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC8].ClockDivider));
640 
641       /* Set IC8 configuration */
642       MODIFY_REG(RCC->IC8CFGR, RCC_IC8CFGR_IC8SEL | RCC_IC8CFGR_IC8INT,
643                  PeriphClkInit->ICSelection[RCC_IC8].ClockSelection | \
644                  ((PeriphClkInit->ICSelection[RCC_IC8].ClockDivider - 1U) << RCC_IC8CFGR_IC8INT_Pos));
645 
646       LL_RCC_IC8_Enable();
647     }
648     else if (PeriphClkInit->Adf1ClockSelection == RCC_ADF1CLKSOURCE_CLKP)
649     {
650       LL_RCC_CLKP_Enable();
651     }
652     else
653     {
654       /* No specific enable to do on other sources */
655     }
656 
657     /* Set the source of ADF1 clock*/
658     __HAL_RCC_ADF1_CONFIG(PeriphClkInit->Adf1ClockSelection);
659   }
660 
661   /*------------------------------------ CSI configuration --------------------------------------*/
662   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_CSI) == RCC_PERIPHCLK_CSI)
663   {
664     /* Check the parameters */
665     assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC18].ClockSelection));
666     assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC18].ClockDivider));
667 
668     /* Set IC18 configuration */
669     MODIFY_REG(RCC->IC18CFGR, RCC_IC18CFGR_IC18SEL | RCC_IC18CFGR_IC18INT,
670                PeriphClkInit->ICSelection[RCC_IC18].ClockSelection | \
671                ((PeriphClkInit->ICSelection[RCC_IC18].ClockDivider - 1U) << RCC_IC18CFGR_IC18INT_Pos));
672 
673     LL_RCC_IC18_Enable();
674   }
675 
676   /*---------------------- DCMIPP configuration ------------------------------*/
677   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_DCMIPP) == RCC_PERIPHCLK_DCMIPP)
678   {
679     /* Check the parameters */
680     assert_param(IS_RCC_DCMIPPCLKSOURCE(PeriphClkInit->DcmippClockSelection));
681 
682     if (PeriphClkInit->DcmippClockSelection == RCC_DCMIPPCLKSOURCE_IC17)
683     {
684       /* Check the parameters */
685       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC17].ClockSelection));
686       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC17].ClockDivider));
687 
688       /* Set IC17 configuration */
689       MODIFY_REG(RCC->IC17CFGR, RCC_IC17CFGR_IC17SEL | RCC_IC17CFGR_IC17INT,
690                  PeriphClkInit->ICSelection[RCC_IC17].ClockSelection | \
691                  ((PeriphClkInit->ICSelection[RCC_IC17].ClockDivider - 1U) << RCC_IC17CFGR_IC17INT_Pos));
692 
693       LL_RCC_IC17_Enable();
694     }
695     else if (PeriphClkInit->DcmippClockSelection == RCC_DCMIPPCLKSOURCE_CLKP)
696     {
697       LL_RCC_CLKP_Enable();
698     }
699     else
700     {
701       /* No specific enable to do on other sources */
702     }
703 
704     /* Configure the CEC clock source */
705     __HAL_RCC_DCMIPP_CONFIG(PeriphClkInit->DcmippClockSelection);
706   }
707 
708   /*---------------------- ETH1 configuration --------------------------------*/
709   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_ETH1) == RCC_PERIPHCLK_ETH1)
710   {
711     /* Check the parameters */
712     assert_param(IS_RCC_ETH1CLKSOURCE(PeriphClkInit->Eth1ClockSelection));
713 
714     if (PeriphClkInit->Eth1ClockSelection == RCC_ETH1CLKSOURCE_IC12)
715     {
716       /* Check the parameters */
717       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC12].ClockSelection));
718       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC12].ClockDivider));
719 
720       /* Set IC12 configuration */
721       MODIFY_REG(RCC->IC12CFGR, RCC_IC12CFGR_IC12SEL | RCC_IC12CFGR_IC12INT,
722                  PeriphClkInit->ICSelection[RCC_IC12].ClockSelection | \
723                  ((PeriphClkInit->ICSelection[RCC_IC12].ClockDivider - 1U) << RCC_IC12CFGR_IC12INT_Pos));
724 
725       LL_RCC_IC12_Enable();
726     }
727     else if (PeriphClkInit->Eth1ClockSelection == RCC_ETH1CLKSOURCE_CLKP)
728     {
729       LL_RCC_CLKP_Enable();
730     }
731     else
732     {
733       /* No specific enable to do on other sources */
734     }
735 
736     /* Configure the ETH1 clock source */
737     __HAL_RCC_ETH1_CONFIG(PeriphClkInit->Eth1ClockSelection);
738   }
739 
740   /*---------------------- ETH1PHY configuration -----------------------------*/
741   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_ETH1PHY) == RCC_PERIPHCLK_ETH1PHY)
742   {
743     /* Check the parameters */
744     assert_param(IS_RCC_ETH1PHYIF(PeriphClkInit->Eth1PhyInterfaceSelection));
745 
746     /* Configure the source of ETH1 PHY interface */
747     __HAL_RCC_ETH1PHY_CONFIG(PeriphClkInit->Eth1PhyInterfaceSelection);
748   }
749 
750   /*---------------------- ETH1 RX configuration -----------------------------*/
751   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_ETH1RX) == RCC_PERIPHCLK_ETH1RX)
752   {
753     /* Check the parameters */
754     assert_param(IS_RCC_ETH1RXCLKSOURCE(PeriphClkInit->Eth1RxClockSelection));
755 
756     /* Configure the ETH1 RX clock source */
757     __HAL_RCC_ETH1RX_CONFIG(PeriphClkInit->Eth1RxClockSelection);
758   }
759 
760   /*---------------------- ETH1 TX configuration -----------------------------*/
761   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_ETH1TX) == RCC_PERIPHCLK_ETH1TX)
762   {
763     /* Check the parameters */
764     assert_param(IS_RCC_ETH1TXCLKSOURCE(PeriphClkInit->Eth1TxClockSelection));
765 
766     /* Configure the ETH1 TX clock source */
767     __HAL_RCC_ETH1TX_CONFIG(PeriphClkInit->Eth1TxClockSelection);
768   }
769 
770   /*---------------------- ETH1 PTP configuration ----------------------------*/
771   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_ETH1PTP) == RCC_PERIPHCLK_ETH1PTP)
772   {
773     /* Check the parameters */
774     assert_param(IS_RCC_ETH1PTPCLKSOURCE(PeriphClkInit->Eth1PtpClockSelection));
775     assert_param(IS_RCC_ETH1PTPDIVIDER(PeriphClkInit->Eth1PtpDivider));
776 
777     if (PeriphClkInit->Eth1PtpClockSelection == RCC_ETH1PTPCLKSOURCE_IC13)
778     {
779       /* Check the parameters */
780       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC13].ClockSelection));
781       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC13].ClockDivider));
782 
783       /* Set IC13 configuration */
784       MODIFY_REG(RCC->IC13CFGR, RCC_IC13CFGR_IC13SEL | RCC_IC13CFGR_IC13INT,
785                  PeriphClkInit->ICSelection[RCC_IC13].ClockSelection | \
786                  ((PeriphClkInit->ICSelection[RCC_IC13].ClockDivider - 1U) << RCC_IC13CFGR_IC13INT_Pos));
787 
788       LL_RCC_IC13_Enable();
789     }
790     else if (PeriphClkInit->Eth1PtpClockSelection == RCC_ETH1PTPCLKSOURCE_CLKP)
791     {
792       LL_RCC_CLKP_Enable();
793     }
794     else
795     {
796       /* No specific enable to do on other sources */
797     }
798 
799     /* Configure the ETH1 PTP clock source and divider */
800     MODIFY_REG(RCC->CCIPR2, (RCC_CCIPR2_ETH1PTPDIV | RCC_CCIPR2_ETH1PTPSEL), \
801                (((PeriphClkInit->Eth1PtpDivider - 1U) << RCC_CCIPR2_ETH1PTPDIV_Pos) | PeriphClkInit->Eth1PtpClockSelection));
802   }
803 
804   /*---------------------- FDCAN configuration -------------------------------*/
805   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_FDCAN) == RCC_PERIPHCLK_FDCAN)
806   {
807     /* Check the parameters */
808     assert_param(IS_RCC_FDCANCLKSOURCE(PeriphClkInit->FdcanClockSelection));
809 
810     if (PeriphClkInit->FdcanClockSelection == RCC_FDCANCLKSOURCE_IC19)
811     {
812       /* Check the parameters */
813       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC19].ClockSelection));
814       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC19].ClockDivider));
815 
816       /* Set IC19 configuration */
817       MODIFY_REG(RCC->IC19CFGR, RCC_IC19CFGR_IC19SEL | RCC_IC19CFGR_IC19INT,
818                  PeriphClkInit->ICSelection[RCC_IC19].ClockSelection | \
819                  ((PeriphClkInit->ICSelection[RCC_IC19].ClockDivider - 1U) << RCC_IC19CFGR_IC19INT_Pos));
820 
821       LL_RCC_IC19_Enable();
822     }
823     else if (PeriphClkInit->FdcanClockSelection == RCC_FDCANCLKSOURCE_CLKP)
824     {
825       LL_RCC_CLKP_Enable();
826     }
827     else
828     {
829       /* No specific enable to do on other sources */
830     }
831 
832     /* Set the source of FDCAN clock*/
833     __HAL_RCC_FDCAN_CONFIG(PeriphClkInit->FdcanClockSelection);
834   }
835 
836   /*------------------------------ I2C1 Configuration ------------------------*/
837   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_I2C1) == RCC_PERIPHCLK_I2C1)
838   {
839     /* Check the parameters */
840     assert_param(IS_RCC_I2C1CLKSOURCE(PeriphClkInit->I2c1ClockSelection));
841 
842     if (PeriphClkInit->I2c1ClockSelection == RCC_I2C1CLKSOURCE_IC10)
843     {
844       /* Check the parameters */
845       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC10].ClockSelection));
846       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC10].ClockDivider));
847 
848       /* Set IC10 configuration */
849       MODIFY_REG(RCC->IC10CFGR, RCC_IC10CFGR_IC10SEL | RCC_IC10CFGR_IC10INT,
850                  PeriphClkInit->ICSelection[RCC_IC10].ClockSelection | \
851                  ((PeriphClkInit->ICSelection[RCC_IC10].ClockDivider - 1U) << RCC_IC10CFGR_IC10INT_Pos));
852 
853       LL_RCC_IC10_Enable();
854     }
855     else if (PeriphClkInit->I2c1ClockSelection == RCC_I2C1CLKSOURCE_IC15)
856     {
857       /* Check the parameters */
858       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
859       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
860 
861       /* Set IC15 configuration */
862       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
863                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
864                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
865 
866       LL_RCC_IC15_Enable();
867     }
868     else if (PeriphClkInit->I2c1ClockSelection == RCC_I2C1CLKSOURCE_CLKP)
869     {
870       LL_RCC_CLKP_Enable();
871     }
872     else
873     {
874       /* No specific enable to do on other sources */
875     }
876 
877     /* Set the source of I2C1 clock*/
878     __HAL_RCC_I2C1_CONFIG(PeriphClkInit->I2c1ClockSelection);
879   }
880 
881   /*------------------------------ I2C2 Configuration ------------------------*/
882   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_I2C2) == RCC_PERIPHCLK_I2C2)
883   {
884     /* Check the parameters */
885     assert_param(IS_RCC_I2C2CLKSOURCE(PeriphClkInit->I2c2ClockSelection));
886 
887     if (PeriphClkInit->I2c2ClockSelection == RCC_I2C2CLKSOURCE_IC10)
888     {
889       /* Check the parameters */
890       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC10].ClockSelection));
891       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC10].ClockDivider));
892 
893       /* Set IC10 configuration */
894       MODIFY_REG(RCC->IC10CFGR, RCC_IC10CFGR_IC10SEL | RCC_IC10CFGR_IC10INT,
895                  PeriphClkInit->ICSelection[RCC_IC10].ClockSelection | \
896                  ((PeriphClkInit->ICSelection[RCC_IC10].ClockDivider - 1U) << RCC_IC10CFGR_IC10INT_Pos));
897 
898       LL_RCC_IC10_Enable();
899     }
900     else if (PeriphClkInit->I2c2ClockSelection == RCC_I2C2CLKSOURCE_IC15)
901     {
902       /* Check the parameters */
903       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
904       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
905 
906       /* Set IC15 configuration */
907       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
908                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
909                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
910 
911       LL_RCC_IC15_Enable();
912     }
913     else if (PeriphClkInit->I2c2ClockSelection == RCC_I2C2CLKSOURCE_CLKP)
914     {
915       LL_RCC_CLKP_Enable();
916     }
917     else
918     {
919       /* No specific enable to do on other sources */
920     }
921 
922     /* Set the source of I2C2 clock*/
923     __HAL_RCC_I2C2_CONFIG(PeriphClkInit->I2c2ClockSelection);
924   }
925 
926   /*------------------------------ I2C3 Configuration ------------------------*/
927   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_I2C3) == RCC_PERIPHCLK_I2C3)
928   {
929     /* Check the parameters */
930     assert_param(IS_RCC_I2C3CLKSOURCE(PeriphClkInit->I2c3ClockSelection));
931 
932     if (PeriphClkInit->I2c3ClockSelection == RCC_I2C3CLKSOURCE_IC10)
933     {
934       /* Check the parameters */
935       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC10].ClockSelection));
936       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC10].ClockDivider));
937 
938       /* Set IC10 configuration */
939       MODIFY_REG(RCC->IC10CFGR, RCC_IC10CFGR_IC10SEL | RCC_IC10CFGR_IC10INT,
940                  PeriphClkInit->ICSelection[RCC_IC10].ClockSelection | \
941                  ((PeriphClkInit->ICSelection[RCC_IC10].ClockDivider - 1U) << RCC_IC10CFGR_IC10INT_Pos));
942 
943       LL_RCC_IC10_Enable();
944     }
945     else if (PeriphClkInit->I2c3ClockSelection == RCC_I2C3CLKSOURCE_IC15)
946     {
947       /* Check the parameters */
948       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
949       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
950 
951       /* Set IC15 configuration */
952       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
953                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
954                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
955 
956       LL_RCC_IC15_Enable();
957     }
958     else if (PeriphClkInit->I2c3ClockSelection == RCC_I2C3CLKSOURCE_CLKP)
959     {
960       LL_RCC_CLKP_Enable();
961     }
962     else
963     {
964       /* No specific enable to do on other sources */
965     }
966 
967     /* Set the source of I2C3 clock*/
968     __HAL_RCC_I2C3_CONFIG(PeriphClkInit->I2c3ClockSelection);
969   }
970 
971   /*------------------------------ I2C4 Configuration ------------------------*/
972   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_I2C4) == RCC_PERIPHCLK_I2C4)
973   {
974     /* Check the parameters */
975     assert_param(IS_RCC_I2C4CLKSOURCE(PeriphClkInit->I2c4ClockSelection));
976 
977     if (PeriphClkInit->I2c4ClockSelection == RCC_I2C4CLKSOURCE_IC10)
978     {
979       /* Check the parameters */
980       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC10].ClockSelection));
981       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC10].ClockDivider));
982 
983       /* Set IC10 configuration */
984       MODIFY_REG(RCC->IC10CFGR, RCC_IC10CFGR_IC10SEL | RCC_IC10CFGR_IC10INT,
985                  PeriphClkInit->ICSelection[RCC_IC10].ClockSelection | \
986                  ((PeriphClkInit->ICSelection[RCC_IC10].ClockDivider - 1U) << RCC_IC10CFGR_IC10INT_Pos));
987 
988       LL_RCC_IC10_Enable();
989     }
990     else if (PeriphClkInit->I2c4ClockSelection == RCC_I2C4CLKSOURCE_IC15)
991     {
992       /* Check the parameters */
993       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
994       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
995 
996       /* Set IC15 configuration */
997       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
998                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
999                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
1000 
1001       LL_RCC_IC15_Enable();
1002     }
1003     else if (PeriphClkInit->I2c4ClockSelection == RCC_I2C4CLKSOURCE_CLKP)
1004     {
1005       LL_RCC_CLKP_Enable();
1006     }
1007     else
1008     {
1009       /* No specific enable to do on other sources */
1010     }
1011 
1012     /* Set the source of I2C4 clock*/
1013     __HAL_RCC_I2C4_CONFIG(PeriphClkInit->I2c4ClockSelection);
1014   }
1015 
1016   /*------------------------------ I3C1 Configuration ------------------------*/
1017   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_I3C1) == RCC_PERIPHCLK_I3C1)
1018   {
1019     /* Check the parameters */
1020     assert_param(IS_RCC_I3C1CLKSOURCE(PeriphClkInit->I3c1ClockSelection));
1021 
1022     if (PeriphClkInit->I3c1ClockSelection == RCC_I3C1CLKSOURCE_IC10)
1023     {
1024       /* Check the parameters */
1025       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC10].ClockSelection));
1026       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC10].ClockDivider));
1027 
1028       /* Set IC10 configuration */
1029       MODIFY_REG(RCC->IC10CFGR, RCC_IC10CFGR_IC10SEL | RCC_IC10CFGR_IC10INT,
1030                  PeriphClkInit->ICSelection[RCC_IC10].ClockSelection | \
1031                  ((PeriphClkInit->ICSelection[RCC_IC10].ClockDivider - 1U) << RCC_IC10CFGR_IC10INT_Pos));
1032 
1033       LL_RCC_IC10_Enable();
1034     }
1035     else if (PeriphClkInit->I3c1ClockSelection == RCC_I3C1CLKSOURCE_IC15)
1036     {
1037       /* Check the parameters */
1038       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
1039       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
1040 
1041       /* Set IC15 configuration */
1042       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
1043                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
1044                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
1045 
1046       LL_RCC_IC15_Enable();
1047     }
1048     else if (PeriphClkInit->I3c1ClockSelection == RCC_I3C1CLKSOURCE_CLKP)
1049     {
1050       LL_RCC_CLKP_Enable();
1051     }
1052     else
1053     {
1054       /* No specific enable to do on other sources */
1055     }
1056 
1057     /* Set the source of I3C1 clock*/
1058     __HAL_RCC_I3C1_CONFIG(PeriphClkInit->I3c1ClockSelection);
1059   }
1060 
1061   /*------------------------------ I3C2 Configuration ------------------------*/
1062   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_I3C2) == RCC_PERIPHCLK_I3C2)
1063   {
1064     /* Check the parameters */
1065     assert_param(IS_RCC_I3C2CLKSOURCE(PeriphClkInit->I3c2ClockSelection));
1066 
1067     if (PeriphClkInit->I3c2ClockSelection == RCC_I3C2CLKSOURCE_IC10)
1068     {
1069       /* Check the parameters */
1070       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC10].ClockSelection));
1071       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC10].ClockDivider));
1072 
1073       /* Set IC10 configuration */
1074       MODIFY_REG(RCC->IC10CFGR, RCC_IC10CFGR_IC10SEL | RCC_IC10CFGR_IC10INT,
1075                  PeriphClkInit->ICSelection[RCC_IC10].ClockSelection | \
1076                  ((PeriphClkInit->ICSelection[RCC_IC10].ClockDivider - 1U) << RCC_IC10CFGR_IC10INT_Pos));
1077 
1078       LL_RCC_IC10_Enable();
1079     }
1080     else if (PeriphClkInit->I3c2ClockSelection == RCC_I3C2CLKSOURCE_IC15)
1081     {
1082       /* Check the parameters */
1083       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
1084       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
1085 
1086       /* Set IC15 configuration */
1087       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
1088                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
1089                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
1090 
1091       LL_RCC_IC15_Enable();
1092     }
1093     else if (PeriphClkInit->I3c2ClockSelection == RCC_I3C2CLKSOURCE_CLKP)
1094     {
1095       LL_RCC_CLKP_Enable();
1096     }
1097     else
1098     {
1099       /* No specific enable to do on other sources */
1100     }
1101 
1102     /* Set the source of I3C2 clock*/
1103     __HAL_RCC_I3C2_CONFIG(PeriphClkInit->I3c2ClockSelection);
1104   }
1105 
1106   /*---------------------------- LPTIM1 configuration ------------------------*/
1107   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1)
1108   {
1109     /* Check the parameters */
1110     assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection));
1111 
1112     if (PeriphClkInit->Lptim1ClockSelection == RCC_LPTIM1CLKSOURCE_IC15)
1113     {
1114       /* Check the parameters */
1115       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
1116       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
1117 
1118       /* Set IC15 configuration */
1119       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
1120                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
1121                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
1122 
1123       LL_RCC_IC15_Enable();
1124     }
1125     else if (PeriphClkInit->Lptim1ClockSelection == RCC_LPTIM1CLKSOURCE_CLKP)
1126     {
1127       LL_RCC_CLKP_Enable();
1128     }
1129     else
1130     {
1131       /* No specific enable to do on other sources */
1132     }
1133 
1134     /* Set the source of LPTIM1 clock*/
1135     __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection);
1136   }
1137 
1138   /*---------------------------- LPTIM2 configuration ------------------------*/
1139   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_LPTIM2) == RCC_PERIPHCLK_LPTIM2)
1140   {
1141     /* Check the parameters */
1142     assert_param(IS_RCC_LPTIM2CLKSOURCE(PeriphClkInit->Lptim2ClockSelection));
1143 
1144     if (PeriphClkInit->Lptim2ClockSelection == RCC_LPTIM2CLKSOURCE_IC15)
1145     {
1146       /* Check the parameters */
1147       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
1148       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
1149 
1150       /* Set IC15 configuration */
1151       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
1152                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
1153                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
1154 
1155       LL_RCC_IC15_Enable();
1156     }
1157     else if (PeriphClkInit->Lptim2ClockSelection == RCC_LPTIM2CLKSOURCE_CLKP)
1158     {
1159       LL_RCC_CLKP_Enable();
1160     }
1161     else
1162     {
1163       /* No specific enable to do on other sources */
1164     }
1165 
1166     /* Set the source of LPTIM2 clock*/
1167     __HAL_RCC_LPTIM2_CONFIG(PeriphClkInit->Lptim2ClockSelection);
1168   }
1169 
1170   /*---------------------------- LPTIM3 configuration -----------------*/
1171   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_LPTIM3) == RCC_PERIPHCLK_LPTIM3)
1172   {
1173     /* Check the parameters */
1174     assert_param(IS_RCC_LPTIM3CLKSOURCE(PeriphClkInit->Lptim3ClockSelection));
1175 
1176     if (PeriphClkInit->Lptim3ClockSelection == RCC_LPTIM3CLKSOURCE_IC15)
1177     {
1178       /* Check the parameters */
1179       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
1180       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
1181 
1182       /* Set IC15 configuration */
1183       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
1184                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
1185                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
1186 
1187       LL_RCC_IC15_Enable();
1188     }
1189     else if (PeriphClkInit->Lptim3ClockSelection == RCC_LPTIM3CLKSOURCE_CLKP)
1190     {
1191       LL_RCC_CLKP_Enable();
1192     }
1193     else
1194     {
1195       /* No specific enable to do on other sources */
1196     }
1197 
1198     /* Set the source of LPTIM3 clock */
1199     __HAL_RCC_LPTIM3_CONFIG(PeriphClkInit->Lptim3ClockSelection);
1200   }
1201 
1202   /*---------------------------- LPTIM4 configuration -----------------*/
1203   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_LPTIM4) == RCC_PERIPHCLK_LPTIM4)
1204   {
1205     /* Check the parameters */
1206     assert_param(IS_RCC_LPTIM4CLKSOURCE(PeriphClkInit->Lptim4ClockSelection));
1207 
1208     if (PeriphClkInit->Lptim4ClockSelection == RCC_LPTIM4CLKSOURCE_IC15)
1209     {
1210       /* Check the parameters */
1211       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
1212       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
1213 
1214       /* Set IC15 configuration */
1215       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
1216                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
1217                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
1218 
1219       LL_RCC_IC15_Enable();
1220     }
1221     else if (PeriphClkInit->Lptim4ClockSelection == RCC_LPTIM4CLKSOURCE_CLKP)
1222     {
1223       LL_RCC_CLKP_Enable();
1224     }
1225     else
1226     {
1227       /* No specific enable to do on other sources */
1228     }
1229 
1230     /* Set the source of LPTIM4 clock */
1231     __HAL_RCC_LPTIM4_CONFIG(PeriphClkInit->Lptim4ClockSelection);
1232   }
1233 
1234   /*---------------------------- LPTIM5 configuration -----------------*/
1235   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_LPTIM5) == RCC_PERIPHCLK_LPTIM5)
1236   {
1237     /* Check the parameters */
1238     assert_param(IS_RCC_LPTIM5CLKSOURCE(PeriphClkInit->Lptim5ClockSelection));
1239 
1240     if (PeriphClkInit->Lptim5ClockSelection == RCC_LPTIM5CLKSOURCE_IC15)
1241     {
1242       /* Check the parameters */
1243       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
1244       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
1245 
1246       /* Set IC15 configuration */
1247       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
1248                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
1249                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
1250 
1251       LL_RCC_IC15_Enable();
1252     }
1253     else if (PeriphClkInit->Lptim5ClockSelection == RCC_LPTIM5CLKSOURCE_CLKP)
1254     {
1255       LL_RCC_CLKP_Enable();
1256     }
1257     else
1258     {
1259       /* No specific enable to do on other sources */
1260     }
1261 
1262     /* Set the source of LPTIM5 clock */
1263     __HAL_RCC_LPTIM5_CONFIG(PeriphClkInit->Lptim5ClockSelection);
1264   }
1265 
1266   /*-------------------------- LPUART1 Configuration -------------------------*/
1267   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1)
1268   {
1269     /* Check the parameters */
1270     assert_param(IS_RCC_LPUART1CLKSOURCE(PeriphClkInit->Lpuart1ClockSelection));
1271 
1272     if (PeriphClkInit->Lpuart1ClockSelection == RCC_LPUART1CLKSOURCE_IC9)
1273     {
1274       /* Check the parameters */
1275       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
1276       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
1277 
1278       /* Set IC9 configuration */
1279       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
1280                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
1281                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
1282 
1283       LL_RCC_IC9_Enable();
1284     }
1285     else if (PeriphClkInit->Lpuart1ClockSelection == RCC_LPUART1CLKSOURCE_IC14)
1286     {
1287       /* Check the parameters */
1288       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
1289       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
1290 
1291       /* Set IC14 configuration */
1292       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
1293                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
1294                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
1295 
1296       LL_RCC_IC14_Enable();
1297     }
1298     else if (PeriphClkInit->Lpuart1ClockSelection == RCC_LPUART1CLKSOURCE_CLKP)
1299     {
1300       LL_RCC_CLKP_Enable();
1301     }
1302     else
1303     {
1304       /* No specific enable to do on other sources */
1305     }
1306 
1307     /* Set the source of LPUART1 clock */
1308     __HAL_RCC_LPUART1_CONFIG(PeriphClkInit->Lpuart1ClockSelection);
1309   }
1310 
1311   /*-------------------------- LTDC Configuration ----------------------------*/
1312   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)
1313   {
1314     /* Check the parameters */
1315     assert_param(IS_RCC_LTDCCLKSOURCE(PeriphClkInit->LtdcClockSelection));
1316 
1317     if (PeriphClkInit->LtdcClockSelection == RCC_LTDCCLKSOURCE_IC16)
1318     {
1319       /* Check the parameters */
1320       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC16].ClockSelection));
1321       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC16].ClockDivider));
1322 
1323       /* Set IC16 configuration */
1324       MODIFY_REG(RCC->IC16CFGR, RCC_IC16CFGR_IC16SEL | RCC_IC16CFGR_IC16INT,
1325                  PeriphClkInit->ICSelection[RCC_IC16].ClockSelection | \
1326                  ((PeriphClkInit->ICSelection[RCC_IC16].ClockDivider - 1U) << RCC_IC16CFGR_IC16INT_Pos));
1327 
1328       LL_RCC_IC16_Enable();
1329     }
1330     else if (PeriphClkInit->LtdcClockSelection == RCC_LTDCCLKSOURCE_CLKP)
1331     {
1332       LL_RCC_CLKP_Enable();
1333     }
1334     else
1335     {
1336       /* No specific enable to do on other sources */
1337     }
1338 
1339     /* Set the source of LTDC clock */
1340     __HAL_RCC_LTDC_CONFIG(PeriphClkInit->LtdcClockSelection);
1341   }
1342 
1343   /*---------------------------- MDF1 configuration --------------------------*/
1344   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_MDF1) == RCC_PERIPHCLK_MDF1)
1345   {
1346     /* Check the parameters */
1347     assert_param(IS_RCC_MDF1CLKSOURCE(PeriphClkInit->Mdf1ClockSelection));
1348 
1349     if (PeriphClkInit->Mdf1ClockSelection == RCC_MDF1CLKSOURCE_IC7)
1350     {
1351       /* Check the parameters */
1352       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC7].ClockSelection));
1353       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC7].ClockDivider));
1354 
1355       /* Set IC7 configuration */
1356       MODIFY_REG(RCC->IC7CFGR, RCC_IC7CFGR_IC7SEL | RCC_IC7CFGR_IC7INT,
1357                  PeriphClkInit->ICSelection[RCC_IC7].ClockSelection | \
1358                  ((PeriphClkInit->ICSelection[RCC_IC7].ClockDivider - 1U) << RCC_IC7CFGR_IC7INT_Pos));
1359 
1360       LL_RCC_IC7_Enable();
1361     }
1362     else if (PeriphClkInit->Mdf1ClockSelection == RCC_MDF1CLKSOURCE_IC8)
1363     {
1364       /* Check the parameters */
1365       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC8].ClockSelection));
1366       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC8].ClockDivider));
1367 
1368       /* Set IC8 configuration */
1369       MODIFY_REG(RCC->IC8CFGR, RCC_IC8CFGR_IC8SEL | RCC_IC8CFGR_IC8INT,
1370                  PeriphClkInit->ICSelection[RCC_IC8].ClockSelection | \
1371                  ((PeriphClkInit->ICSelection[RCC_IC8].ClockDivider - 1U) << RCC_IC8CFGR_IC8INT_Pos));
1372 
1373       LL_RCC_IC8_Enable();
1374     }
1375     else if (PeriphClkInit->Mdf1ClockSelection == RCC_MDF1CLKSOURCE_CLKP)
1376     {
1377       LL_RCC_CLKP_Enable();
1378     }
1379     else
1380     {
1381       /* No specific enable to do on other sources */
1382     }
1383 
1384     /* Set the source of MDF1 clock*/
1385     __HAL_RCC_MDF1_CONFIG(PeriphClkInit->Mdf1ClockSelection);
1386   }
1387 
1388   /*---------------------------- PSSI configuration --------------------------*/
1389   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PSSI) == RCC_PERIPHCLK_PSSI)
1390   {
1391     /* Check the parameters */
1392     assert_param(IS_RCC_PSSICLKSOURCE(PeriphClkInit->PssiClockSelection));
1393 
1394     if (PeriphClkInit->PssiClockSelection == RCC_PSSICLKSOURCE_IC20)
1395     {
1396       /* Check the parameters */
1397       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC20].ClockSelection));
1398       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC20].ClockDivider));
1399 
1400       /* Set IC20 configuration */
1401       MODIFY_REG(RCC->IC20CFGR, RCC_IC20CFGR_IC20SEL | RCC_IC20CFGR_IC20INT,
1402                  PeriphClkInit->ICSelection[RCC_IC20].ClockSelection | \
1403                  ((PeriphClkInit->ICSelection[RCC_IC20].ClockDivider - 1U) << RCC_IC20CFGR_IC20INT_Pos));
1404 
1405       LL_RCC_IC20_Enable();
1406     }
1407     else if (PeriphClkInit->PssiClockSelection == RCC_PSSICLKSOURCE_CLKP)
1408     {
1409       LL_RCC_CLKP_Enable();
1410     }
1411     else
1412     {
1413       /* No specific enable to do on other sources */
1414     }
1415 
1416     /* Set the source of PSSI clock*/
1417     __HAL_RCC_PSSI_CONFIG(PeriphClkInit->PssiClockSelection);
1418   }
1419 
1420   /*---------------------------- SAI1 configuration --------------------------*/
1421   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1)
1422   {
1423     /* Check the parameters */
1424     assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection));
1425 
1426     if (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_IC7)
1427     {
1428       /* Check the parameters */
1429       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC7].ClockSelection));
1430       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC7].ClockDivider));
1431 
1432       /* Set IC7 configuration */
1433       MODIFY_REG(RCC->IC7CFGR, RCC_IC7CFGR_IC7SEL | RCC_IC7CFGR_IC7INT,
1434                  PeriphClkInit->ICSelection[RCC_IC7].ClockSelection | \
1435                  ((PeriphClkInit->ICSelection[RCC_IC7].ClockDivider - 1U) << RCC_IC7CFGR_IC7INT_Pos));
1436 
1437       LL_RCC_IC7_Enable();
1438     }
1439     else if (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_IC8)
1440     {
1441       /* Check the parameters */
1442       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC8].ClockSelection));
1443       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC8].ClockDivider));
1444 
1445       /* Set IC8 configuration */
1446       MODIFY_REG(RCC->IC8CFGR, RCC_IC8CFGR_IC8SEL | RCC_IC8CFGR_IC8INT,
1447                  PeriphClkInit->ICSelection[RCC_IC8].ClockSelection | \
1448                  ((PeriphClkInit->ICSelection[RCC_IC8].ClockDivider - 1U) << RCC_IC8CFGR_IC8INT_Pos));
1449 
1450       LL_RCC_IC8_Enable();
1451     }
1452     else if (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_CLKP)
1453     {
1454       LL_RCC_CLKP_Enable();
1455     }
1456     else
1457     {
1458       /* No specific enable to do on other sources */
1459     }
1460 
1461     /* Set the source of SAI1 clock*/
1462     __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection);
1463   }
1464 
1465   /*---------------------------- SAI2 configuration --------------------------*/
1466   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2)
1467   {
1468     /* Check the parameters */
1469     assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection));
1470 
1471     if (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_IC7)
1472     {
1473       /* Check the parameters */
1474       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC7].ClockSelection));
1475       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC7].ClockDivider));
1476 
1477       /* Set IC7 configuration */
1478       MODIFY_REG(RCC->IC7CFGR, RCC_IC7CFGR_IC7SEL | RCC_IC7CFGR_IC7INT,
1479                  PeriphClkInit->ICSelection[RCC_IC7].ClockSelection | \
1480                  ((PeriphClkInit->ICSelection[RCC_IC7].ClockDivider - 1U) << RCC_IC7CFGR_IC7INT_Pos));
1481 
1482       LL_RCC_IC7_Enable();
1483     }
1484     else if (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_IC8)
1485     {
1486       /* Check the parameters */
1487       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC8].ClockSelection));
1488       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC8].ClockDivider));
1489 
1490       /* Set IC8 configuration */
1491       MODIFY_REG(RCC->IC8CFGR, RCC_IC8CFGR_IC8SEL | RCC_IC8CFGR_IC8INT,
1492                  PeriphClkInit->ICSelection[RCC_IC8].ClockSelection | \
1493                  ((PeriphClkInit->ICSelection[RCC_IC8].ClockDivider - 1U) << RCC_IC8CFGR_IC8INT_Pos));
1494 
1495       LL_RCC_IC8_Enable();
1496     }
1497     else if (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_CLKP)
1498     {
1499       LL_RCC_CLKP_Enable();
1500     }
1501     else
1502     {
1503       /* No specific enable to do on other sources */
1504     }
1505 
1506     /* Set the source of SAI2 clock*/
1507     __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection);
1508   }
1509 
1510   /*---------------------------- SPDIFRX1 configuration -------------------------------*/
1511   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_SPDIFRX1) == RCC_PERIPHCLK_SPDIFRX1)
1512   {
1513     /* Check the parameters */
1514     assert_param(IS_RCC_SPDIFRX1CLKSOURCE(PeriphClkInit->Spdifrx1ClockSelection));
1515 
1516     if (PeriphClkInit->Spdifrx1ClockSelection == RCC_SPDIFRX1CLKSOURCE_IC7)
1517     {
1518       /* Check the parameters */
1519       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC7].ClockSelection));
1520       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC7].ClockDivider));
1521 
1522       /* Set IC7 configuration */
1523       MODIFY_REG(RCC->IC7CFGR, RCC_IC7CFGR_IC7SEL | RCC_IC7CFGR_IC7INT,
1524                  PeriphClkInit->ICSelection[RCC_IC7].ClockSelection | \
1525                  ((PeriphClkInit->ICSelection[RCC_IC7].ClockDivider - 1U) << RCC_IC7CFGR_IC7INT_Pos));
1526 
1527       LL_RCC_IC7_Enable();
1528     }
1529     else if (PeriphClkInit->Spdifrx1ClockSelection == RCC_SPDIFRX1CLKSOURCE_IC8)
1530     {
1531       /* Check the parameters */
1532       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC8].ClockSelection));
1533       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC8].ClockDivider));
1534 
1535       /* Set IC8 configuration */
1536       MODIFY_REG(RCC->IC8CFGR, RCC_IC8CFGR_IC8SEL | RCC_IC8CFGR_IC8INT,
1537                  PeriphClkInit->ICSelection[RCC_IC8].ClockSelection | \
1538                  ((PeriphClkInit->ICSelection[RCC_IC8].ClockDivider - 1U) << RCC_IC8CFGR_IC8INT_Pos));
1539 
1540       LL_RCC_IC8_Enable();
1541     }
1542     else if (PeriphClkInit->Spdifrx1ClockSelection == RCC_SPDIFRX1CLKSOURCE_CLKP)
1543     {
1544       LL_RCC_CLKP_Enable();
1545     }
1546     else
1547     {
1548       /* No specific enable to do on other sources */
1549     }
1550 
1551     /* Set the source of SPDIFRX1 clock */
1552     __HAL_RCC_SPDIFRX1_CONFIG(PeriphClkInit->Spdifrx1ClockSelection);
1553   }
1554 
1555   /*---------------------------- SPI1 configuration --------------------------*/
1556   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_SPI1) == RCC_PERIPHCLK_SPI1)
1557   {
1558     /* Check the parameters */
1559     assert_param(IS_RCC_SPI1CLKSOURCE(PeriphClkInit->Spi1ClockSelection));
1560 
1561     if (PeriphClkInit->Spi1ClockSelection == RCC_SPI1CLKSOURCE_IC8)
1562     {
1563       /* Check the parameters */
1564       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC8].ClockSelection));
1565       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC8].ClockDivider));
1566 
1567       /* Set IC8 configuration */
1568       MODIFY_REG(RCC->IC8CFGR, RCC_IC8CFGR_IC8SEL | RCC_IC8CFGR_IC8INT,
1569                  PeriphClkInit->ICSelection[RCC_IC8].ClockSelection | \
1570                  ((PeriphClkInit->ICSelection[RCC_IC8].ClockDivider - 1U) << RCC_IC8CFGR_IC8INT_Pos));
1571 
1572       LL_RCC_IC8_Enable();
1573     }
1574     else if (PeriphClkInit->Spi1ClockSelection == RCC_SPI1CLKSOURCE_IC9)
1575     {
1576       /* Check the parameters */
1577       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
1578       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
1579 
1580       /* Set IC9 configuration */
1581       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
1582                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
1583                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
1584 
1585       LL_RCC_IC9_Enable();
1586     }
1587     else if (PeriphClkInit->Spi1ClockSelection == RCC_SPI1CLKSOURCE_CLKP)
1588     {
1589       LL_RCC_CLKP_Enable();
1590     }
1591     else
1592     {
1593       /* No specific enable to do on other sources */
1594     }
1595 
1596     /* Set the source of SPI1 clock*/
1597     __HAL_RCC_SPI1_CONFIG(PeriphClkInit->Spi1ClockSelection);
1598   }
1599 
1600   /*---------------------------- SPI2 configuration ---------------------*/
1601   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_SPI2) == RCC_PERIPHCLK_SPI2)
1602   {
1603     /* Check the parameters */
1604     assert_param(IS_RCC_SPI2CLKSOURCE(PeriphClkInit->Spi2ClockSelection));
1605 
1606     if (PeriphClkInit->Spi2ClockSelection == RCC_SPI2CLKSOURCE_IC8)
1607     {
1608       /* Check the parameters */
1609       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC8].ClockSelection));
1610       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC8].ClockDivider));
1611 
1612       /* Set IC8 configuration */
1613       MODIFY_REG(RCC->IC8CFGR, RCC_IC8CFGR_IC8SEL | RCC_IC8CFGR_IC8INT,
1614                  PeriphClkInit->ICSelection[RCC_IC8].ClockSelection | \
1615                  ((PeriphClkInit->ICSelection[RCC_IC8].ClockDivider - 1U) << RCC_IC8CFGR_IC8INT_Pos));
1616 
1617       LL_RCC_IC8_Enable();
1618     }
1619     else if (PeriphClkInit->Spi2ClockSelection == RCC_SPI2CLKSOURCE_IC9)
1620     {
1621       /* Check the parameters */
1622       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
1623       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
1624 
1625       /* Set IC9 configuration */
1626       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
1627                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
1628                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
1629 
1630       LL_RCC_IC9_Enable();
1631     }
1632     else if (PeriphClkInit->Spi2ClockSelection == RCC_SPI2CLKSOURCE_CLKP)
1633     {
1634       LL_RCC_CLKP_Enable();
1635     }
1636     else
1637     {
1638       /* No specific enable to do on other sources */
1639     }
1640 
1641     /* Set the source of SPI2 clock*/
1642     __HAL_RCC_SPI2_CONFIG(PeriphClkInit->Spi2ClockSelection);
1643   }
1644 
1645   /*---------------------------- SPI3 configuration ---------------------*/
1646   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_SPI3) == RCC_PERIPHCLK_SPI3)
1647   {
1648     /* Check the parameters */
1649     assert_param(IS_RCC_SPI3CLKSOURCE(PeriphClkInit->Spi3ClockSelection));
1650 
1651     if (PeriphClkInit->Spi3ClockSelection == RCC_SPI3CLKSOURCE_IC8)
1652     {
1653       /* Check the parameters */
1654       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC8].ClockSelection));
1655       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC8].ClockDivider));
1656 
1657       /* Set IC8 configuration */
1658       MODIFY_REG(RCC->IC8CFGR, RCC_IC8CFGR_IC8SEL | RCC_IC8CFGR_IC8INT,
1659                  PeriphClkInit->ICSelection[RCC_IC8].ClockSelection | \
1660                  ((PeriphClkInit->ICSelection[RCC_IC8].ClockDivider - 1U) << RCC_IC8CFGR_IC8INT_Pos));
1661 
1662       LL_RCC_IC8_Enable();
1663     }
1664     else if (PeriphClkInit->Spi3ClockSelection == RCC_SPI3CLKSOURCE_IC9)
1665     {
1666       /* Check the parameters */
1667       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
1668       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
1669 
1670       /* Set IC9 configuration */
1671       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
1672                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
1673                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
1674 
1675       LL_RCC_IC9_Enable();
1676     }
1677     else if (PeriphClkInit->Spi3ClockSelection == RCC_SPI3CLKSOURCE_CLKP)
1678     {
1679       LL_RCC_CLKP_Enable();
1680     }
1681     else
1682     {
1683       /* No specific enable to do on other sources */
1684     }
1685 
1686     /* Set the source of SPI3 clock*/
1687     __HAL_RCC_SPI3_CONFIG(PeriphClkInit->Spi3ClockSelection);
1688   }
1689 
1690   /*---------------------------- SPI4 configuration -------------------------------*/
1691   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_SPI4) == RCC_PERIPHCLK_SPI4)
1692   {
1693     /* Check the parameters */
1694     assert_param(IS_RCC_SPI4CLKSOURCE(PeriphClkInit->Spi4ClockSelection));
1695 
1696     if (PeriphClkInit->Spi4ClockSelection == RCC_SPI4CLKSOURCE_IC9)
1697     {
1698       /* Check the parameters */
1699       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
1700       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
1701 
1702       /* Set IC9 configuration */
1703       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
1704                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
1705                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
1706 
1707       LL_RCC_IC9_Enable();
1708     }
1709     else if (PeriphClkInit->Spi4ClockSelection == RCC_SPI4CLKSOURCE_IC14)
1710     {
1711       /* Check the parameters */
1712       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
1713       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
1714 
1715       /* Set IC14 configuration */
1716       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
1717                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
1718                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
1719 
1720       LL_RCC_IC14_Enable();
1721     }
1722     else if (PeriphClkInit->Spi4ClockSelection == RCC_SPI4CLKSOURCE_CLKP)
1723     {
1724       LL_RCC_CLKP_Enable();
1725     }
1726     else
1727     {
1728       /* No specific enable to do on other sources */
1729     }
1730 
1731     /* Set the source of SPI4 clock */
1732     __HAL_RCC_SPI4_CONFIG(PeriphClkInit->Spi4ClockSelection);
1733   }
1734 
1735   /*---------------------------- SPI5 configuration -------------------------------*/
1736   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_SPI5) == RCC_PERIPHCLK_SPI5)
1737   {
1738     /* Check the parameters */
1739     assert_param(IS_RCC_SPI5CLKSOURCE(PeriphClkInit->Spi5ClockSelection));
1740 
1741     if (PeriphClkInit->Spi5ClockSelection == RCC_SPI5CLKSOURCE_IC9)
1742     {
1743       /* Check the parameters */
1744       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
1745       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
1746 
1747       /* Set IC9 configuration */
1748       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
1749                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
1750                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
1751 
1752       LL_RCC_IC9_Enable();
1753     }
1754     else if (PeriphClkInit->Spi5ClockSelection == RCC_SPI5CLKSOURCE_IC14)
1755     {
1756       /* Check the parameters */
1757       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
1758       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
1759 
1760       /* Set IC14 configuration */
1761       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
1762                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
1763                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
1764 
1765       LL_RCC_IC14_Enable();
1766     }
1767     else if (PeriphClkInit->Spi5ClockSelection == RCC_SPI5CLKSOURCE_CLKP)
1768     {
1769       LL_RCC_CLKP_Enable();
1770     }
1771     else
1772     {
1773       /* No specific enable to do on other sources */
1774     }
1775 
1776     /* Set the source of SPI5 clock */
1777     __HAL_RCC_SPI5_CONFIG(PeriphClkInit->Spi5ClockSelection);
1778   }
1779 
1780   /*---------------------------- SPI6 configuration --------------------------*/
1781   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_SPI6) == RCC_PERIPHCLK_SPI6)
1782   {
1783     /* Check the parameters */
1784     assert_param(IS_RCC_SPI6CLKSOURCE(PeriphClkInit->Spi6ClockSelection));
1785 
1786     if (PeriphClkInit->Spi6ClockSelection == RCC_SPI6CLKSOURCE_IC8)
1787     {
1788       /* Check the parameters */
1789       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC8].ClockSelection));
1790       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC8].ClockDivider));
1791 
1792       /* Set IC8 configuration */
1793       MODIFY_REG(RCC->IC8CFGR, RCC_IC8CFGR_IC8SEL | RCC_IC8CFGR_IC8INT,
1794                  PeriphClkInit->ICSelection[RCC_IC8].ClockSelection | \
1795                  ((PeriphClkInit->ICSelection[RCC_IC8].ClockDivider - 1U) << RCC_IC8CFGR_IC8INT_Pos));
1796 
1797       LL_RCC_IC8_Enable();
1798     }
1799     else if (PeriphClkInit->Spi6ClockSelection == RCC_SPI6CLKSOURCE_IC9)
1800     {
1801       /* Check the parameters */
1802       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
1803       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
1804 
1805       /* Set IC9 configuration */
1806       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
1807                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
1808                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
1809 
1810       LL_RCC_IC9_Enable();
1811     }
1812     else if (PeriphClkInit->Spi6ClockSelection == RCC_SPI6CLKSOURCE_CLKP)
1813     {
1814       LL_RCC_CLKP_Enable();
1815     }
1816     else
1817     {
1818       /* No specific enable to do on other sources */
1819     }
1820 
1821     /* Set the source of SPI6 clock*/
1822     __HAL_RCC_SPI6_CONFIG(PeriphClkInit->Spi6ClockSelection);
1823   }
1824 
1825   /*-------------------------- USART1 configuration --------------------------*/
1826   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_USART1) == RCC_PERIPHCLK_USART1)
1827   {
1828     /* Check the parameters */
1829     assert_param(IS_RCC_USART1CLKSOURCE(PeriphClkInit->Usart1ClockSelection));
1830 
1831     if (PeriphClkInit->Usart1ClockSelection == RCC_USART1CLKSOURCE_IC9)
1832     {
1833       /* Check the parameters */
1834       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
1835       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
1836 
1837       /* Set IC9 configuration */
1838       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
1839                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
1840                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
1841 
1842       LL_RCC_IC9_Enable();
1843     }
1844     else if (PeriphClkInit->Usart1ClockSelection == RCC_USART1CLKSOURCE_IC14)
1845     {
1846       /* Check the parameters */
1847       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
1848       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
1849 
1850       /* Set IC14 configuration */
1851       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
1852                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
1853                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
1854 
1855       LL_RCC_IC14_Enable();
1856     }
1857     else if (PeriphClkInit->Usart1ClockSelection == RCC_USART1CLKSOURCE_CLKP)
1858     {
1859       LL_RCC_CLKP_Enable();
1860     }
1861     else
1862     {
1863       /* No specific enable to do on other sources */
1864     }
1865 
1866     /* Set the source of USART1 clock */
1867     __HAL_RCC_USART1_CONFIG(PeriphClkInit->Usart1ClockSelection);
1868   }
1869 
1870   /*-------------------------- USART2 configuration --------------------------*/
1871   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_USART2) == RCC_PERIPHCLK_USART2)
1872   {
1873     /* Check the parameters */
1874     assert_param(IS_RCC_USART2CLKSOURCE(PeriphClkInit->Usart2ClockSelection));
1875 
1876     if (PeriphClkInit->Usart2ClockSelection == RCC_USART2CLKSOURCE_IC9)
1877     {
1878       /* Check the parameters */
1879       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
1880       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
1881 
1882       /* Set IC9 configuration */
1883       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
1884                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
1885                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
1886 
1887       LL_RCC_IC9_Enable();
1888     }
1889     else if (PeriphClkInit->Usart2ClockSelection == RCC_USART2CLKSOURCE_IC14)
1890     {
1891       /* Check the parameters */
1892       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
1893       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
1894 
1895       /* Set IC14 configuration */
1896       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
1897                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
1898                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
1899 
1900       LL_RCC_IC14_Enable();
1901     }
1902     else if (PeriphClkInit->Usart2ClockSelection == RCC_USART2CLKSOURCE_CLKP)
1903     {
1904       LL_RCC_CLKP_Enable();
1905     }
1906     else
1907     {
1908       /* No specific enable to do on other sources */
1909     }
1910 
1911     /* Set the source of USART2 clock */
1912     __HAL_RCC_USART2_CONFIG(PeriphClkInit->Usart2ClockSelection);
1913   }
1914 
1915   /*-------------------------- USART3 configuration --------------------------*/
1916   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_USART3) == RCC_PERIPHCLK_USART3)
1917   {
1918     /* Check the parameters */
1919     assert_param(IS_RCC_USART3CLKSOURCE(PeriphClkInit->Usart3ClockSelection));
1920 
1921     if (PeriphClkInit->Usart3ClockSelection == RCC_USART3CLKSOURCE_IC9)
1922     {
1923       /* Check the parameters */
1924       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
1925       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
1926 
1927       /* Set IC9 configuration */
1928       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
1929                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
1930                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
1931 
1932       LL_RCC_IC9_Enable();
1933     }
1934     else if (PeriphClkInit->Usart3ClockSelection == RCC_USART3CLKSOURCE_IC14)
1935     {
1936       /* Check the parameters */
1937       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
1938       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
1939 
1940       /* Set IC14 configuration */
1941       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
1942                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
1943                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
1944 
1945       LL_RCC_IC14_Enable();
1946     }
1947     else if (PeriphClkInit->Usart3ClockSelection == RCC_USART3CLKSOURCE_CLKP)
1948     {
1949       LL_RCC_CLKP_Enable();
1950     }
1951     else
1952     {
1953       /* No specific enable to do on other sources */
1954     }
1955 
1956     /* Set the source of USART3 clock */
1957     __HAL_RCC_USART3_CONFIG(PeriphClkInit->Usart3ClockSelection);
1958   }
1959 
1960   /*-------------------------- UART4 configuration --------------------------*/
1961   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_UART4) == RCC_PERIPHCLK_UART4)
1962   {
1963     /* Check the parameters */
1964     assert_param(IS_RCC_UART4CLKSOURCE(PeriphClkInit->Uart4ClockSelection));
1965 
1966     if (PeriphClkInit->Uart4ClockSelection == RCC_UART4CLKSOURCE_IC9)
1967     {
1968       /* Check the parameters */
1969       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
1970       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
1971 
1972       /* Set IC9 configuration */
1973       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
1974                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
1975                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
1976 
1977       LL_RCC_IC9_Enable();
1978     }
1979     else if (PeriphClkInit->Uart4ClockSelection == RCC_UART4CLKSOURCE_IC14)
1980     {
1981       /* Check the parameters */
1982       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
1983       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
1984 
1985       /* Set IC14 configuration */
1986       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
1987                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
1988                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
1989 
1990       LL_RCC_IC14_Enable();
1991     }
1992     else if (PeriphClkInit->Uart4ClockSelection == RCC_UART4CLKSOURCE_CLKP)
1993     {
1994       LL_RCC_CLKP_Enable();
1995     }
1996     else
1997     {
1998       /* No specific enable to do on other sources */
1999     }
2000 
2001     /* Set the source of UART4 clock */
2002     __HAL_RCC_UART4_CONFIG(PeriphClkInit->Uart4ClockSelection);
2003   }
2004 
2005   /*-------------------------- UART5 configuration --------------------------*/
2006   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_UART5) == RCC_PERIPHCLK_UART5)
2007   {
2008     /* Check the parameters */
2009     assert_param(IS_RCC_UART5CLKSOURCE(PeriphClkInit->Uart5ClockSelection));
2010 
2011     if (PeriphClkInit->Uart5ClockSelection == RCC_UART5CLKSOURCE_IC9)
2012     {
2013       /* Check the parameters */
2014       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
2015       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
2016 
2017       /* Set IC9 configuration */
2018       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
2019                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
2020                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
2021 
2022       LL_RCC_IC9_Enable();
2023     }
2024     else if (PeriphClkInit->Uart5ClockSelection == RCC_UART5CLKSOURCE_IC14)
2025     {
2026       /* Check the parameters */
2027       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
2028       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
2029 
2030       /* Set IC14 configuration */
2031       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
2032                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
2033                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
2034 
2035       LL_RCC_IC14_Enable();
2036     }
2037     else if (PeriphClkInit->Uart5ClockSelection == RCC_UART5CLKSOURCE_CLKP)
2038     {
2039       LL_RCC_CLKP_Enable();
2040     }
2041     else
2042     {
2043       /* No specific enable to do on other sources */
2044     }
2045 
2046     /* Set the source of UART5 clock */
2047     __HAL_RCC_UART5_CONFIG(PeriphClkInit->Uart5ClockSelection);
2048   }
2049 
2050   /*-------------------------- USART6 configuration --------------------------*/
2051   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_USART6) == RCC_PERIPHCLK_USART6)
2052   {
2053     /* Check the parameters */
2054     assert_param(IS_RCC_USART6CLKSOURCE(PeriphClkInit->Usart6ClockSelection));
2055 
2056     if (PeriphClkInit->Usart6ClockSelection == RCC_USART6CLKSOURCE_IC9)
2057     {
2058       /* Check the parameters */
2059       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
2060       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
2061 
2062       /* Set IC9 configuration */
2063       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
2064                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
2065                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
2066 
2067       LL_RCC_IC9_Enable();
2068     }
2069     else if (PeriphClkInit->Usart6ClockSelection == RCC_USART6CLKSOURCE_IC14)
2070     {
2071       /* Check the parameters */
2072       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
2073       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
2074 
2075       /* Set IC14 configuration */
2076       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
2077                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
2078                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
2079 
2080       LL_RCC_IC14_Enable();
2081     }
2082     else if (PeriphClkInit->Usart6ClockSelection == RCC_USART6CLKSOURCE_CLKP)
2083     {
2084       LL_RCC_CLKP_Enable();
2085     }
2086     else
2087     {
2088       /* No specific enable to do on other sources */
2089     }
2090 
2091     /* Set the source of USART6 clock */
2092     __HAL_RCC_USART6_CONFIG(PeriphClkInit->Usart6ClockSelection);
2093   }
2094 
2095   /*-------------------------- UART7 configuration --------------------------*/
2096   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_UART7) == RCC_PERIPHCLK_UART7)
2097   {
2098     /* Check the parameters */
2099     assert_param(IS_RCC_UART7CLKSOURCE(PeriphClkInit->Uart7ClockSelection));
2100 
2101     if (PeriphClkInit->Uart7ClockSelection == RCC_UART7CLKSOURCE_IC9)
2102     {
2103       /* Check the parameters */
2104       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
2105       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
2106 
2107       /* Set IC9 configuration */
2108       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
2109                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
2110                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
2111 
2112       LL_RCC_IC9_Enable();
2113     }
2114     else if (PeriphClkInit->Uart7ClockSelection == RCC_UART7CLKSOURCE_IC14)
2115     {
2116       /* Check the parameters */
2117       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
2118       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
2119 
2120       /* Set IC14 configuration */
2121       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
2122                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
2123                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
2124 
2125       LL_RCC_IC14_Enable();
2126     }
2127     else if (PeriphClkInit->Uart7ClockSelection == RCC_UART7CLKSOURCE_CLKP)
2128     {
2129       LL_RCC_CLKP_Enable();
2130     }
2131     else
2132     {
2133       /* No specific enable to do on other sources */
2134     }
2135 
2136     /* Set the source of UART7 clock */
2137     __HAL_RCC_UART7_CONFIG(PeriphClkInit->Uart7ClockSelection);
2138   }
2139 
2140   /*-------------------------- UART8 configuration --------------------------*/
2141   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_UART8) == RCC_PERIPHCLK_UART8)
2142   {
2143     /* Check the parameters */
2144     assert_param(IS_RCC_UART8CLKSOURCE(PeriphClkInit->Uart8ClockSelection));
2145 
2146     if (PeriphClkInit->Uart8ClockSelection == RCC_UART8CLKSOURCE_IC9)
2147     {
2148       /* Check the parameters */
2149       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
2150       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
2151 
2152       /* Set IC9 configuration */
2153       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
2154                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
2155                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
2156 
2157       LL_RCC_IC9_Enable();
2158     }
2159     else if (PeriphClkInit->Uart8ClockSelection == RCC_UART8CLKSOURCE_IC14)
2160     {
2161       /* Check the parameters */
2162       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
2163       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
2164 
2165       /* Set IC14 configuration */
2166       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
2167                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
2168                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
2169 
2170       LL_RCC_IC14_Enable();
2171     }
2172     else if (PeriphClkInit->Uart8ClockSelection == RCC_UART8CLKSOURCE_CLKP)
2173     {
2174       LL_RCC_CLKP_Enable();
2175     }
2176     else
2177     {
2178       /* No specific enable to do on other sources */
2179     }
2180 
2181     /* Set the source of UART8 clock */
2182     __HAL_RCC_UART8_CONFIG(PeriphClkInit->Uart8ClockSelection);
2183   }
2184 
2185   /*-------------------------- UART9 configuration --------------------------*/
2186   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_UART9) == RCC_PERIPHCLK_UART9)
2187   {
2188     /* Check the parameters */
2189     assert_param(IS_RCC_UART9CLKSOURCE(PeriphClkInit->Uart9ClockSelection));
2190 
2191     if (PeriphClkInit->Uart9ClockSelection == RCC_UART9CLKSOURCE_IC9)
2192     {
2193       /* Check the parameters */
2194       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
2195       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
2196 
2197       /* Set IC9 configuration */
2198       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
2199                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
2200                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
2201 
2202       LL_RCC_IC9_Enable();
2203     }
2204     else if (PeriphClkInit->Uart9ClockSelection == RCC_UART9CLKSOURCE_IC14)
2205     {
2206       /* Check the parameters */
2207       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
2208       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
2209 
2210       /* Set IC14 configuration */
2211       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
2212                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
2213                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
2214 
2215       LL_RCC_IC14_Enable();
2216     }
2217     else if (PeriphClkInit->Uart9ClockSelection == RCC_UART9CLKSOURCE_CLKP)
2218     {
2219       LL_RCC_CLKP_Enable();
2220     }
2221     else
2222     {
2223       /* No specific enable to do on other sources */
2224     }
2225 
2226     /* Set the source of UART9 clock */
2227     __HAL_RCC_UART9_CONFIG(PeriphClkInit->Uart9ClockSelection);
2228   }
2229 
2230   /*-------------------------- USART10 configuration --------------------------*/
2231   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_USART10) == RCC_PERIPHCLK_USART10)
2232   {
2233     /* Check the parameters */
2234     assert_param(IS_RCC_USART10CLKSOURCE(PeriphClkInit->Usart10ClockSelection));
2235 
2236     if (PeriphClkInit->Usart10ClockSelection == RCC_USART10CLKSOURCE_IC9)
2237     {
2238       /* Check the parameters */
2239       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC9].ClockSelection));
2240       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC9].ClockDivider));
2241 
2242       /* Set IC9 configuration */
2243       MODIFY_REG(RCC->IC9CFGR, RCC_IC9CFGR_IC9SEL | RCC_IC9CFGR_IC9INT,
2244                  PeriphClkInit->ICSelection[RCC_IC9].ClockSelection | \
2245                  ((PeriphClkInit->ICSelection[RCC_IC9].ClockDivider - 1U) << RCC_IC9CFGR_IC9INT_Pos));
2246 
2247       LL_RCC_IC9_Enable();
2248     }
2249     else if (PeriphClkInit->Usart10ClockSelection == RCC_USART10CLKSOURCE_IC14)
2250     {
2251       /* Check the parameters */
2252       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC14].ClockSelection));
2253       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC14].ClockDivider));
2254 
2255       /* Set IC14 configuration */
2256       MODIFY_REG(RCC->IC14CFGR, RCC_IC14CFGR_IC14SEL | RCC_IC14CFGR_IC14INT,
2257                  PeriphClkInit->ICSelection[RCC_IC14].ClockSelection | \
2258                  ((PeriphClkInit->ICSelection[RCC_IC14].ClockDivider - 1U) << RCC_IC14CFGR_IC14INT_Pos));
2259 
2260       LL_RCC_IC14_Enable();
2261     }
2262     else if (PeriphClkInit->Usart10ClockSelection == RCC_USART10CLKSOURCE_CLKP)
2263     {
2264       LL_RCC_CLKP_Enable();
2265     }
2266     else
2267     {
2268       /* No specific enable to do on other sources */
2269     }
2270 
2271     /* Set the source of USART10 clock */
2272     __HAL_RCC_USART10_CONFIG(PeriphClkInit->Usart10ClockSelection);
2273   }
2274 
2275   /*------------------------------ USBPHY1 Configuration ---------------------*/
2276   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_USBPHY1) == RCC_PERIPHCLK_USBPHY1)
2277   {
2278     /* Check the parameters */
2279     assert_param(IS_RCC_USBPHY1CLKSOURCE(PeriphClkInit->UsbPhy1ClockSelection));
2280 
2281     /* Set the source of USBPHY1 clock*/
2282     __HAL_RCC_USBPHY1_CONFIG(PeriphClkInit->UsbPhy1ClockSelection);
2283   }
2284 
2285   /*------------------------------ USBPHY2 Configuration ---------------------*/
2286   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_USBPHY2) == RCC_PERIPHCLK_USBPHY2)
2287   {
2288     /* Check the parameters */
2289     assert_param(IS_RCC_USBPHY2CLKSOURCE(PeriphClkInit->UsbPhy2ClockSelection));
2290 
2291     /* Set the source of USBPHY2 clock*/
2292     __HAL_RCC_USBPHY2_CONFIG(PeriphClkInit->UsbPhy2ClockSelection);
2293   }
2294 
2295   /*------------------------------ USBOTGHS1 Configuration -------------------*/
2296   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_USBOTGHS1) == RCC_PERIPHCLK_USBOTGHS1)
2297   {
2298     /* Check the parameters */
2299     assert_param(IS_RCC_USBOTGHS1CLKSOURCE(PeriphClkInit->UsbOtgHs1ClockSelection));
2300 
2301     if (PeriphClkInit->UsbOtgHs1ClockSelection == RCC_USBOTGHS1CLKSOURCE_IC15)
2302     {
2303       /* Check the parameters */
2304       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
2305       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
2306 
2307       /* Set IC15 configuration */
2308       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
2309                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
2310                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
2311 
2312       LL_RCC_IC15_Enable();
2313     }
2314     else if (PeriphClkInit->UsbOtgHs1ClockSelection == RCC_USBOTGHS1CLKSOURCE_CLKP)
2315     {
2316       LL_RCC_CLKP_Enable();
2317     }
2318     else
2319     {
2320       /* No specific enable to do on other sources */
2321     }
2322 
2323     /* Set the source of USBOTGHS1 clock */
2324     __HAL_RCC_USBOTGHS1_CONFIG(PeriphClkInit->UsbOtgHs1ClockSelection);
2325   }
2326 
2327   /*------------------------------ USBOTGHS2 Configuration -------------------*/
2328   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_USBOTGHS2) == RCC_PERIPHCLK_USBOTGHS2)
2329   {
2330     /* Check the parameters */
2331     assert_param(IS_RCC_USBOTGHS2CLKSOURCE(PeriphClkInit->UsbOtgHs2ClockSelection));
2332 
2333     if (PeriphClkInit->UsbOtgHs2ClockSelection == RCC_USBOTGHS2CLKSOURCE_IC15)
2334     {
2335       /* Check the parameters */
2336       assert_param(IS_RCC_ICCLKSOURCE(PeriphClkInit->ICSelection[RCC_IC15].ClockSelection));
2337       assert_param(IS_RCC_ICCLKDIVIDER(PeriphClkInit->ICSelection[RCC_IC15].ClockDivider));
2338 
2339       /* Set IC15 configuration */
2340       MODIFY_REG(RCC->IC15CFGR, RCC_IC15CFGR_IC15SEL | RCC_IC15CFGR_IC15INT,
2341                  PeriphClkInit->ICSelection[RCC_IC15].ClockSelection | \
2342                  ((PeriphClkInit->ICSelection[RCC_IC15].ClockDivider - 1U) << RCC_IC15CFGR_IC15INT_Pos));
2343 
2344       LL_RCC_IC15_Enable();
2345     }
2346     else if (PeriphClkInit->UsbOtgHs2ClockSelection == RCC_USBOTGHS2CLKSOURCE_CLKP)
2347     {
2348       LL_RCC_CLKP_Enable();
2349     }
2350     else
2351     {
2352       /* No specific enable to do on other sources */
2353     }
2354 
2355     /* Set the source of USBOTGHS2 clock */
2356     __HAL_RCC_USBOTGHS2_CONFIG(PeriphClkInit->UsbOtgHs2ClockSelection);
2357   }
2358 
2359   /*------------------------------------ TIM configuration --------------------------------------*/
2360   if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_TIM) == RCC_PERIPHCLK_TIM)
2361   {
2362     /* Check the parameters */
2363     assert_param(IS_RCC_TIMPRES(PeriphClkInit->TIMPresSelection));
2364 
2365     /* Configure Timer Prescaler */
2366     __HAL_RCC_TIMCLKPRESCALER_CONFIG(PeriphClkInit->TIMPresSelection);
2367   }
2368 
2369   if (status == HAL_OK)
2370   {
2371     return HAL_OK;
2372   }
2373   return HAL_ERROR;
2374 }
2375 
2376 /**
2377   * @brief  Get the RCC_ClkInitStruct according to the internal RCC configuration registers.
2378   * @param  PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that
2379   *         returns the configuration information for the Extended Peripherals clocks :
2380   *         (ADC, ADF1, CKPER, DCMI, DCMIPP, FDCAN, FMC, I2C1, I2C2, I2C3, I2C4, I3C1, I3C2,
2381   *         LPTIM1, LPTIM2, LPTIM3, LPTIM4, LPTIM5, LTDC, LPUART1, MDF1, PSSI, RTC, SAI1, SAI2,
2382   *         SDMMC1, SDMMC2, SPDIFRX1, SPI1, SPI2, SPI3, SPI4, SPI5, SPI6, TIM,
2383   *         USART1, USART2, USART3, UART4, UART5, USART6, UART7, UART8, UART9, USART10,
2384   *         USBPHYC, USB OTGFS, XSPI1, XSPI2, XSPI3).
2385   * @retval None
2386   */
HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef * PeriphClkInit)2387 void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit)
2388 {
2389   const __IO uint32_t *p_icxcfgr;
2390   uint32_t icx_val;
2391   /* Set all possible values for the extended clock type parameter------------*/
2392   PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_ADC      | RCC_PERIPHCLK_ADF1      | RCC_PERIPHCLK_CKPER    | \
2393                                         RCC_PERIPHCLK_CSI      | RCC_PERIPHCLK_DCMIPP    | RCC_PERIPHCLK_ETH1     | \
2394                                         RCC_PERIPHCLK_ETH1PHY  | RCC_PERIPHCLK_ETH1RX    | RCC_PERIPHCLK_ETH1TX   | \
2395                                         RCC_PERIPHCLK_ETH1PTP  | RCC_PERIPHCLK_FDCAN     | RCC_PERIPHCLK_FMC      | \
2396                                         RCC_PERIPHCLK_I2C1     | RCC_PERIPHCLK_I2C2      | RCC_PERIPHCLK_I2C3     | \
2397                                         RCC_PERIPHCLK_I2C4     | RCC_PERIPHCLK_I3C1      | RCC_PERIPHCLK_I3C2     | \
2398                                         RCC_PERIPHCLK_LPTIM1   | RCC_PERIPHCLK_LPTIM2    | RCC_PERIPHCLK_LPTIM3   | \
2399                                         RCC_PERIPHCLK_LPTIM4   | RCC_PERIPHCLK_LPTIM5    | RCC_PERIPHCLK_LTDC     | \
2400                                         RCC_PERIPHCLK_LPUART1  | RCC_PERIPHCLK_MDF1      | RCC_PERIPHCLK_PSSI     | \
2401                                         RCC_PERIPHCLK_RTC      | RCC_PERIPHCLK_SAI1      | RCC_PERIPHCLK_SAI2     | \
2402                                         RCC_PERIPHCLK_SDMMC1   | RCC_PERIPHCLK_SDMMC2    | RCC_PERIPHCLK_SPDIFRX1 | \
2403                                         RCC_PERIPHCLK_SPI1     | RCC_PERIPHCLK_SPI2      | RCC_PERIPHCLK_SPI3     | \
2404                                         RCC_PERIPHCLK_SPI4     | RCC_PERIPHCLK_SPI5      | RCC_PERIPHCLK_SPI6     | \
2405                                         RCC_PERIPHCLK_TIM      | RCC_PERIPHCLK_USART1    | RCC_PERIPHCLK_USART2   | \
2406                                         RCC_PERIPHCLK_USART3   | RCC_PERIPHCLK_UART4     | RCC_PERIPHCLK_UART5    | \
2407                                         RCC_PERIPHCLK_USART6   | RCC_PERIPHCLK_UART7     | RCC_PERIPHCLK_UART8    | \
2408                                         RCC_PERIPHCLK_UART9    | RCC_PERIPHCLK_USART10   | \
2409                                         RCC_PERIPHCLK_XSPI1    | RCC_PERIPHCLK_XSPI2     | RCC_PERIPHCLK_XSPI3    | \
2410                                         RCC_PERIPHCLK_USBPHY1  | RCC_PERIPHCLK_USBOTGHS1 | \
2411                                         RCC_PERIPHCLK_USBPHY2  | RCC_PERIPHCLK_USBOTGHS2;
2412 
2413   /* Get IC x dividers */
2414   p_icxcfgr = &(RCC->IC1CFGR);
2415   for (uint32_t i = 0; i < 20U; i++)
2416   {
2417     icx_val = *p_icxcfgr;
2418     PeriphClkInit->ICSelection[i].ClockSelection = (icx_val & RCC_IC1CFGR_IC1SEL) >> RCC_IC1CFGR_IC1SEL_Pos;
2419     PeriphClkInit->ICSelection[i].ClockDivider = ((icx_val & RCC_IC1CFGR_IC1INT) >> RCC_IC1CFGR_IC1INT_Pos) + 1U;
2420     p_icxcfgr++;
2421   }
2422 
2423   /* Get the ADC clock source ------------------------------------------------*/
2424   PeriphClkInit->AdcClockSelection          = __HAL_RCC_GET_ADC_SOURCE();
2425   /* Get the ADC divider ------------------------------------------------*/
2426   PeriphClkInit->AdcDivider                 = __HAL_RCC_GET_ADC_DIVIDER();
2427   /* Get the ADF1 clock source -----------------------------------------------*/
2428   PeriphClkInit->Adf1ClockSelection         = __HAL_RCC_GET_ADF1_SOURCE();
2429   /* Get the CKPER clock source ----------------------------------------------*/
2430   PeriphClkInit->CkperClockSelection        = __HAL_RCC_GET_CLKP_SOURCE();
2431   /* Get the DCMIPP clock source ---------------------------------------------*/
2432   PeriphClkInit->DcmippClockSelection       = __HAL_RCC_GET_DCMIPP_SOURCE();
2433   /* Get the ETH1 clock source -----------------------------------------------*/
2434   PeriphClkInit->Eth1ClockSelection         = __HAL_RCC_GET_ETH1_SOURCE();
2435   /* Get the ETH1 PHY interface ----------------------------------------------*/
2436   PeriphClkInit->Eth1PhyInterfaceSelection  = __HAL_RCC_GET_ETH1PHY_INTERFACE();
2437   /* Get the ETH1 RX clock source --------------------------------------------*/
2438   PeriphClkInit->Eth1RxClockSelection       = __HAL_RCC_GET_ETH1RX_SOURCE();
2439   /* Get the ETH1 TX clock source --------------------------------------------*/
2440   PeriphClkInit->Eth1TxClockSelection       = __HAL_RCC_GET_ETH1TX_SOURCE();
2441   /* Get the ETH1 PTP clock source -------------------------------------------*/
2442   PeriphClkInit->Eth1PtpClockSelection      = __HAL_RCC_GET_ETH1PTP_SOURCE();
2443   /* Get the ETH1 PTP divider ------------------------------------------------*/
2444   PeriphClkInit->Eth1PtpDivider             = __HAL_RCC_GET_ETH1PTP_DIVIDER();
2445   /* Get the FDCAN kernel clock source ---------------------------------------*/
2446   PeriphClkInit->FdcanClockSelection        = __HAL_RCC_GET_FDCAN_SOURCE();
2447   /* Get the FMC kernel clock source -----------------------------------------*/
2448   PeriphClkInit->FmcClockSelection          = __HAL_RCC_GET_FMC_SOURCE();
2449   /* Get the I2C1 clock source -----------------------------------------------*/
2450   PeriphClkInit->I2c1ClockSelection         = __HAL_RCC_GET_I2C1_SOURCE();
2451   /* Get the I2C2 clock source -----------------------------------------------*/
2452   PeriphClkInit->I2c2ClockSelection         = __HAL_RCC_GET_I2C2_SOURCE();
2453   /* Get the I2C3 clock source -----------------------------------------------*/
2454   PeriphClkInit->I2c3ClockSelection         = __HAL_RCC_GET_I2C3_SOURCE();
2455   /* Get the I2C4 clock source -----------------------------------------------*/
2456   PeriphClkInit->I2c4ClockSelection         = __HAL_RCC_GET_I2C4_SOURCE();
2457   /* Get the I3C1 clock source -----------------------------------------------*/
2458   PeriphClkInit->I3c1ClockSelection         = __HAL_RCC_GET_I3C1_SOURCE();
2459   /* Get the I3C2 clock source -----------------------------------------------*/
2460   PeriphClkInit->I3c2ClockSelection         = __HAL_RCC_GET_I3C2_SOURCE();
2461   /* Get the LPTIM1 clock source ---------------------------------------------*/
2462   PeriphClkInit->Lptim1ClockSelection       = __HAL_RCC_GET_LPTIM1_SOURCE();
2463   /* Get the LPTIM2 clock source ---------------------------------------------*/
2464   PeriphClkInit->Lptim2ClockSelection       = __HAL_RCC_GET_LPTIM2_SOURCE();
2465   /* Get the LPTIM3 clock source ---------------------------------------------*/
2466   PeriphClkInit->Lptim3ClockSelection       = __HAL_RCC_GET_LPTIM3_SOURCE();
2467   /* Get the LPTIM4 clock source ---------------------------------------------*/
2468   PeriphClkInit->Lptim4ClockSelection       = __HAL_RCC_GET_LPTIM4_SOURCE();
2469   /* Get the LPTIM5 clock source ---------------------------------------------*/
2470   PeriphClkInit->Lptim5ClockSelection       = __HAL_RCC_GET_LPTIM5_SOURCE();
2471   /* Get the LPUART1 clock source --------------------------------------------*/
2472   PeriphClkInit->Lpuart1ClockSelection      = __HAL_RCC_GET_LPUART1_SOURCE();
2473   /* Get the LTDC clock source -----------------------------------------------*/
2474   PeriphClkInit->LtdcClockSelection         = __HAL_RCC_GET_LTDC_SOURCE();
2475   /* Get the MDF1 clock source -----------------------------------------------*/
2476   PeriphClkInit->Mdf1ClockSelection         = __HAL_RCC_GET_MDF1_SOURCE();
2477   /* Get the PSSI clock source -----------------------------------------------*/
2478   PeriphClkInit->PssiClockSelection         = __HAL_RCC_GET_PSSI_SOURCE();
2479   /* Get the RTC clock source ------------------------------------------------*/
2480   PeriphClkInit->RTCClockSelection          = __HAL_RCC_GET_RTC_SOURCE();
2481   /* Get the SAI1 clock source -----------------------------------------------*/
2482   PeriphClkInit->Sai1ClockSelection         = __HAL_RCC_GET_SAI1_SOURCE();
2483   /* Get the SAI2 clock source -----------------------------------------------*/
2484   PeriphClkInit->Sai2ClockSelection         = __HAL_RCC_GET_SAI2_SOURCE();
2485   /* Get the SDMMC1 clock source ---------------------------------------------*/
2486   PeriphClkInit->Sdmmc1ClockSelection       = __HAL_RCC_GET_SDMMC1_SOURCE();
2487   /* Get the SDMMC2 clock source ---------------------------------------------*/
2488   PeriphClkInit->Sdmmc2ClockSelection       = __HAL_RCC_GET_SDMMC2_SOURCE();
2489   /* Get the SPDIFRX1 clock source -------------------------------------------*/
2490   PeriphClkInit->Spdifrx1ClockSelection     = __HAL_RCC_GET_SPDIFRX1_SOURCE();
2491   /* Get the SPI1 clock source -----------------------------------------------*/
2492   PeriphClkInit->Spi1ClockSelection         = __HAL_RCC_GET_SPI1_SOURCE();
2493   /* Get the SPI2 clock source -----------------------------------------------*/
2494   PeriphClkInit->Spi2ClockSelection         = __HAL_RCC_GET_SPI2_SOURCE();
2495   /* Get the SPI3 clock source -----------------------------------------------*/
2496   PeriphClkInit->Spi3ClockSelection         = __HAL_RCC_GET_SPI3_SOURCE();
2497   /* Get the SPI4 clock source -----------------------------------------------*/
2498   PeriphClkInit->Spi4ClockSelection         = __HAL_RCC_GET_SPI4_SOURCE();
2499   /* Get the SPI5 clock source -----------------------------------------------*/
2500   PeriphClkInit->Spi5ClockSelection         = __HAL_RCC_GET_SPI5_SOURCE();
2501   /* Get the SPI6 clock source -----------------------------------------------*/
2502   PeriphClkInit->Spi6ClockSelection         = __HAL_RCC_GET_SPI6_SOURCE();
2503   /* Get the TIM Prescaler configuration -------------------------------------*/
2504   PeriphClkInit->TIMPresSelection           = __HAL_RCC_GET_TIMCLKPRESCALER();
2505   /* Get the USART1 clock source ---------------------------------------------*/
2506   PeriphClkInit->Usart1ClockSelection       = __HAL_RCC_GET_USART1_SOURCE();
2507   /* Get the USART2 clock source ---------------------------------------------*/
2508   PeriphClkInit->Usart2ClockSelection       = __HAL_RCC_GET_USART2_SOURCE();
2509   /* Get the USART3 clock source ---------------------------------------------*/
2510   PeriphClkInit->Usart3ClockSelection       = __HAL_RCC_GET_USART3_SOURCE();
2511   /* Get the UART4 clock source ----------------------------------------------*/
2512   PeriphClkInit->Uart4ClockSelection        = __HAL_RCC_GET_UART4_SOURCE();
2513   /* Get the UART5 clock source ----------------------------------------------*/
2514   PeriphClkInit->Uart5ClockSelection        = __HAL_RCC_GET_UART5_SOURCE();
2515   /* Get the USART6 clock source ---------------------------------------------*/
2516   PeriphClkInit->Usart6ClockSelection       = __HAL_RCC_GET_USART6_SOURCE();
2517   /* Get the UART7 clock source ----------------------------------------------*/
2518   PeriphClkInit->Uart7ClockSelection        = __HAL_RCC_GET_UART7_SOURCE();
2519   /* Get the UART8 clock source ----------------------------------------------*/
2520   PeriphClkInit->Uart8ClockSelection        = __HAL_RCC_GET_UART8_SOURCE();
2521   /* Get the UART9 clock source ----------------------------------------------*/
2522   PeriphClkInit->Uart9ClockSelection        = __HAL_RCC_GET_UART9_SOURCE();
2523   /* Get the USART10 clock source --------------------------------------------*/
2524   PeriphClkInit->Usart10ClockSelection      = __HAL_RCC_GET_USART10_SOURCE();
2525   /* Get the USBPHY1 clock source --------------------------------------------*/
2526   PeriphClkInit->UsbPhy1ClockSelection      = __HAL_RCC_GET_USBPHY1_SOURCE();
2527   /* Get the USB OTGHS1 clock source -----------------------------------------*/
2528   PeriphClkInit->UsbOtgHs1ClockSelection    = __HAL_RCC_GET_USBOTGHS1_SOURCE();
2529   /* Get the USBPHY2 clock source --------------------------------------------*/
2530   PeriphClkInit->UsbPhy2ClockSelection      = __HAL_RCC_GET_USBPHY2_SOURCE();
2531   /* Get the USB OTGHS2 clock source -----------------------------------------*/
2532   PeriphClkInit->UsbOtgHs2ClockSelection    = __HAL_RCC_GET_USBOTGHS2_SOURCE();
2533   /* Get the XSPI1 clock source ----------------------------------------------*/
2534   PeriphClkInit->Xspi1ClockSelection        = __HAL_RCC_GET_XSPI1_SOURCE();
2535   /* Get the XSPI2 clock source ----------------------------------------------*/
2536   PeriphClkInit->Xspi2ClockSelection        = __HAL_RCC_GET_XSPI2_SOURCE();
2537   /* Get the XSPI3 clock source ----------------------------------------------*/
2538   PeriphClkInit->Xspi3ClockSelection        = __HAL_RCC_GET_XSPI3_SOURCE();
2539 }
2540 
2541 /**
2542   * @brief  Return the peripheral clock frequency for a given peripheral (SAI..)
2543   * @note   Return 0 if peripheral clock identifier not managed by this API or
2544   *         if the selected clock source is not enabled (HSI, PLLs clock output..)
2545   * @param  PeriphClk: Peripheral clock identifier
2546   *         This parameter can be one of the following values:
2547   *            @arg RCC_PERIPHCLK_ADC      : ADC peripheral clock
2548   *            @arg RCC_PERIPHCLK_ADF1     : ADF1 peripheral clock
2549   *            @arg RCC_PERIPHCLK_CSI      : CSI peripheral clock
2550   *            @arg RCC_PERIPHCLK_DCMIPP   : DCMIPP peripheral clock
2551   *            @arg RCC_PERIPHCLK_I2C1     : I2C1 peripheral clock
2552   *            @arg RCC_PERIPHCLK_I2C2     : I2C2 peripheral clock
2553   *            @arg RCC_PERIPHCLK_I2C3     : I2C3 peripheral clock
2554   *            @arg RCC_PERIPHCLK_I2C4     : I2C4 peripheral clock
2555   *            @arg RCC_PERIPHCLK_I3C1     : I3C1 peripheral clock
2556   *            @arg RCC_PERIPHCLK_I3C2     : I3C2 peripheral clock
2557   *            @arg RCC_PERIPHCLK_FDCAN    : FDCAN peripheral clock
2558   *            @arg RCC_PERIPHCLK_FMC      : FMC peripheral clock
2559   *            @arg RCC_PERIPHCLK_LPTIM1   : LPTIM1 peripheral clock
2560   *            @arg RCC_PERIPHCLK_LPTIM2   : LPTIM2 peripheral clock
2561   *            @arg RCC_PERIPHCLK_LPTIM3   : LPTIM3 peripheral clock
2562   *            @arg RCC_PERIPHCLK_LPTIM4   : LPTIM4 peripheral clock
2563   *            @arg RCC_PERIPHCLK_LPTIM5   : LPTIM5 peripheral clock
2564   *            @arg RCC_PERIPHCLK_LPUART1  : LPUART1 peripheral clock
2565   *            @arg RCC_PERIPHCLK_LTDC     : LTDC peripheral clock
2566   *            @arg RCC_PERIPHCLK_MDF1     : MDF1 peripheral clock
2567   *            @arg RCC_PERIPHCLK_PSSI     : PSSI peripheral clock
2568   *            @arg RCC_PERIPHCLK_SAI1     : SAI1 peripheral clock
2569   *            @arg RCC_PERIPHCLK_SAI2     : SAI2 peripheral clock
2570   *            @arg RCC_PERIPHCLK_SDMMC1   : SDMMC1 peripheral clock
2571   *            @arg RCC_PERIPHCLK_SDMMC2   : SDMMC2 peripheral clock
2572   *            @arg RCC_PERIPHCLK_SPDIFRX1 : SPDIFRX1 peripheral clock
2573   *            @arg RCC_PERIPHCLK_SPI1     : SPI1 peripheral clock
2574   *            @arg RCC_PERIPHCLK_SPI2     : SPI2 peripheral clock
2575   *            @arg RCC_PERIPHCLK_SPI3     : SPI3 peripheral clock
2576   *            @arg RCC_PERIPHCLK_SPI4     : SPI4 peripheral clock
2577   *            @arg RCC_PERIPHCLK_SPI5     : SPI5 peripheral clock
2578   *            @arg RCC_PERIPHCLK_SPI6     : SPI6 peripheral clock
2579   *            @arg RCC_PERIPHCLK_USART1   : USART1 peripheral clock
2580   *            @arg RCC_PERIPHCLK_USART2   : USART2 peripheral clock
2581   *            @arg RCC_PERIPHCLK_USART3   : USART3 peripheral clock
2582   *            @arg RCC_PERIPHCLK_UART4    : UART4 peripheral clock
2583   *            @arg RCC_PERIPHCLK_UART5    : UART5 peripheral clock
2584   *            @arg RCC_PERIPHCLK_USART6   : USART6 peripheral clock
2585   *            @arg RCC_PERIPHCLK_UART7    : UART7 peripheral clock
2586   *            @arg RCC_PERIPHCLK_UART8    : UART8 peripheral clock
2587   *            @arg RCC_PERIPHCLK_UART9    : UART9 peripheral clock
2588   *            @arg RCC_PERIPHCLK_USART10  : USART10 peripheral clock
2589   *            @arg RCC_PERIPHCLK_XSPI1    : XSPI1 peripheral clock
2590   *            @arg RCC_PERIPHCLK_XSPI2    : XSPI2 peripheral clock
2591   *            @arg RCC_PERIPHCLK_XSPI3    : XSPI3 peripheral clock
2592   * @retval Frequency in KHz
2593   */
HAL_RCCEx_GetPeriphCLKFreq(uint64_t PeriphClk)2594 uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint64_t PeriphClk)
2595 {
2596   uint32_t frequency = 0;   /* Set to 0 for returned value if no source clock */
2597 
2598   switch (PeriphClk)
2599   {
2600     case RCC_PERIPHCLK_ADC:
2601       frequency = RCCEx_GetADCCLKFreq(LL_RCC_ADC_CLKSOURCE);
2602       break;
2603 
2604     case RCC_PERIPHCLK_ADF1:
2605       frequency = RCCEx_GetADFCLKFreq(LL_RCC_ADF1_CLKSOURCE);
2606       break;
2607 
2608     case RCC_PERIPHCLK_CSI:
2609       frequency = RCCEx_GetCSICLKFreq();
2610       break;
2611 
2612     case RCC_PERIPHCLK_CKPER:
2613       frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
2614       break;
2615 
2616     case RCC_PERIPHCLK_DCMIPP:
2617       frequency = RCCEx_GetDCMIPPCLKFreq(LL_RCC_DCMIPP_CLKSOURCE);
2618       break;
2619 
2620     case RCC_PERIPHCLK_ETH1:
2621       frequency = RCCEx_GetETH1CLKFreq(LL_RCC_ETH1_CLKSOURCE);
2622       break;
2623 
2624     case RCC_PERIPHCLK_ETH1PTP:
2625       frequency = RCCEx_GetETH1PTPCLKFreq(LL_RCC_ETH1PTP_CLKSOURCE);
2626       break;
2627 
2628     case RCC_PERIPHCLK_FDCAN:
2629       frequency = RCCEx_GetFDCANCLKFreq(LL_RCC_FDCAN_CLKSOURCE);
2630       break;
2631 
2632     case RCC_PERIPHCLK_FMC:
2633       frequency = RCCEx_GetFMCCLKFreq(LL_RCC_FMC_CLKSOURCE);
2634       break;
2635 
2636     case RCC_PERIPHCLK_I2C1:
2637       frequency = RCCEx_GetI2CCLKFreq(LL_RCC_I2C1_CLKSOURCE);
2638       break;
2639 
2640     case RCC_PERIPHCLK_I2C2:
2641       frequency = RCCEx_GetI2CCLKFreq(LL_RCC_I2C2_CLKSOURCE);
2642       break;
2643 
2644     case RCC_PERIPHCLK_I2C3:
2645       frequency = RCCEx_GetI2CCLKFreq(LL_RCC_I2C3_CLKSOURCE);
2646       break;
2647 
2648     case RCC_PERIPHCLK_I2C4:
2649       frequency = RCCEx_GetI2CCLKFreq(LL_RCC_I2C4_CLKSOURCE);
2650       break;
2651 
2652     case RCC_PERIPHCLK_I3C1:
2653       frequency = RCCEx_GetI3CCLKFreq(LL_RCC_I3C1_CLKSOURCE);
2654       break;
2655 
2656     case RCC_PERIPHCLK_I3C2:
2657       frequency = RCCEx_GetI3CCLKFreq(LL_RCC_I3C2_CLKSOURCE);
2658       break;
2659 
2660     case RCC_PERIPHCLK_LPTIM1:
2661       frequency = RCCEx_GetLPTIMCLKFreq(LL_RCC_LPTIM1_CLKSOURCE);
2662       break;
2663 
2664     case RCC_PERIPHCLK_LPTIM2:
2665       frequency = RCCEx_GetLPTIMCLKFreq(LL_RCC_LPTIM2_CLKSOURCE);
2666       break;
2667 
2668     case RCC_PERIPHCLK_LPTIM3:
2669       frequency = RCCEx_GetLPTIMCLKFreq(LL_RCC_LPTIM3_CLKSOURCE);
2670       break;
2671 
2672     case RCC_PERIPHCLK_LPTIM4:
2673       frequency = RCCEx_GetLPTIMCLKFreq(LL_RCC_LPTIM4_CLKSOURCE);
2674       break;
2675 
2676     case RCC_PERIPHCLK_LPTIM5:
2677       frequency = RCCEx_GetLPTIMCLKFreq(LL_RCC_LPTIM5_CLKSOURCE);
2678       break;
2679 
2680     case RCC_PERIPHCLK_LPUART1:
2681       frequency = RCCEx_GetLPUARTCLKFreq(LL_RCC_LPUART1_CLKSOURCE);
2682       break;
2683 
2684     case RCC_PERIPHCLK_LTDC:
2685       frequency = RCCEx_GetLTDCCLKFreq(LL_RCC_LTDC_CLKSOURCE);
2686       break;
2687 
2688     case RCC_PERIPHCLK_MDF1:
2689       frequency = RCCEx_GetMDFCLKFreq(LL_RCC_MDF1_CLKSOURCE);
2690       break;
2691 
2692     case RCC_PERIPHCLK_PSSI:
2693       frequency = RCCEx_GetPSSICLKFreq(LL_RCC_PSSI_CLKSOURCE);
2694       break;
2695 
2696     case  RCC_PERIPHCLK_RTC:
2697       frequency = RCCEx_GetRTCCLKFreq();
2698       break;
2699 
2700     case RCC_PERIPHCLK_SAI1:
2701       frequency = RCCEx_GetSAICLKFreq(LL_RCC_SAI1_CLKSOURCE);
2702       break;
2703 
2704     case RCC_PERIPHCLK_SAI2:
2705       frequency = RCCEx_GetSAICLKFreq(LL_RCC_SAI2_CLKSOURCE);
2706       break;
2707 
2708     case RCC_PERIPHCLK_SDMMC1:
2709       frequency = RCCEx_GetSDMMCCLKFreq(LL_RCC_SDMMC1_CLKSOURCE);
2710       break;
2711 
2712     case RCC_PERIPHCLK_SDMMC2:
2713       frequency = RCCEx_GetSDMMCCLKFreq(LL_RCC_SDMMC2_CLKSOURCE);
2714       break;
2715 
2716     case RCC_PERIPHCLK_SPDIFRX1:
2717       frequency = RCCEx_GetSPDIFRXCLKFreq(LL_RCC_SPDIFRX1_CLKSOURCE);
2718       break;
2719 
2720     case RCC_PERIPHCLK_SPI1:
2721       frequency = RCCEx_GetSPICLKFreq(LL_RCC_SPI1_CLKSOURCE);
2722       break;
2723 
2724     case RCC_PERIPHCLK_SPI2:
2725       frequency = RCCEx_GetSPICLKFreq(LL_RCC_SPI2_CLKSOURCE);
2726       break;
2727 
2728     case RCC_PERIPHCLK_SPI3:
2729       frequency = RCCEx_GetSPICLKFreq(LL_RCC_SPI3_CLKSOURCE);
2730       break;
2731 
2732     case RCC_PERIPHCLK_SPI4:
2733       frequency = RCCEx_GetSPICLKFreq(LL_RCC_SPI4_CLKSOURCE);
2734       break;
2735 
2736     case RCC_PERIPHCLK_SPI5:
2737       frequency = RCCEx_GetSPICLKFreq(LL_RCC_SPI5_CLKSOURCE);
2738       break;
2739 
2740     case RCC_PERIPHCLK_SPI6:
2741       frequency = RCCEx_GetSPICLKFreq(LL_RCC_SPI6_CLKSOURCE);
2742       break;
2743 
2744     case RCC_PERIPHCLK_USART1:
2745       frequency = RCCEx_GetUSARTCLKFreq(LL_RCC_USART1_CLKSOURCE);
2746       break;
2747 
2748     case RCC_PERIPHCLK_USART2:
2749       frequency = RCCEx_GetUSARTCLKFreq(LL_RCC_USART2_CLKSOURCE);
2750       break;
2751 
2752     case RCC_PERIPHCLK_USART3:
2753       frequency = RCCEx_GetUSARTCLKFreq(LL_RCC_USART3_CLKSOURCE);
2754       break;
2755 
2756     case RCC_PERIPHCLK_UART4:
2757       frequency = RCCEx_GetUARTCLKFreq(LL_RCC_UART4_CLKSOURCE);
2758       break;
2759 
2760     case RCC_PERIPHCLK_UART5:
2761       frequency = RCCEx_GetUARTCLKFreq(LL_RCC_UART5_CLKSOURCE);
2762       break;
2763 
2764     case RCC_PERIPHCLK_USART6:
2765       frequency = RCCEx_GetUSARTCLKFreq(LL_RCC_USART6_CLKSOURCE);
2766       break;
2767 
2768     case RCC_PERIPHCLK_UART7:
2769       frequency = RCCEx_GetUARTCLKFreq(LL_RCC_UART7_CLKSOURCE);
2770       break;
2771 
2772     case RCC_PERIPHCLK_UART8:
2773       frequency = RCCEx_GetUARTCLKFreq(LL_RCC_UART8_CLKSOURCE);
2774       break;
2775 
2776     case RCC_PERIPHCLK_UART9:
2777       frequency = RCCEx_GetUARTCLKFreq(LL_RCC_UART9_CLKSOURCE);
2778       break;
2779 
2780     case RCC_PERIPHCLK_USART10:
2781       frequency = RCCEx_GetUSARTCLKFreq(LL_RCC_USART10_CLKSOURCE);
2782       break;
2783 
2784     case RCC_PERIPHCLK_USBPHY1:
2785       frequency = RCCEx_GetOTGPHYCKREFCLKFreq(LL_RCC_OTGPHY1CKREF_CLKSOURCE);
2786       break;
2787 
2788     case RCC_PERIPHCLK_USBOTGHS1:
2789       frequency = RCCEx_GetOTGPHYCLKFreq(LL_RCC_OTGPHY1_CLKSOURCE);
2790       break;
2791 
2792     case RCC_PERIPHCLK_USBPHY2:
2793       frequency = RCCEx_GetOTGPHYCKREFCLKFreq(LL_RCC_OTGPHY2CKREF_CLKSOURCE);
2794       break;
2795 
2796     case RCC_PERIPHCLK_USBOTGHS2:
2797       frequency = RCCEx_GetOTGPHYCLKFreq(LL_RCC_OTGPHY2_CLKSOURCE);
2798       break;
2799 
2800     case RCC_PERIPHCLK_XSPI1:
2801       frequency = RCCEx_GetXSPICLKFreq(LL_RCC_XSPI1_CLKSOURCE);
2802       break;
2803 
2804     case RCC_PERIPHCLK_XSPI2:
2805       frequency = RCCEx_GetXSPICLKFreq(LL_RCC_XSPI2_CLKSOURCE);
2806       break;
2807 
2808     case RCC_PERIPHCLK_XSPI3:
2809       frequency = RCCEx_GetXSPICLKFreq(LL_RCC_XSPI3_CLKSOURCE);
2810       break;
2811 
2812     default:
2813       /* Unexpected case, frequency is by default set to 0 */
2814       break;
2815   }
2816 
2817   return frequency;
2818 }
2819 
2820 /**
2821   * @brief  Return PLL1 clock frequency
2822   * @note   RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
2823   * @retval PLL1 output clock frequency
2824   */
HAL_RCCEx_GetPLL1CLKFreq(void)2825 uint32_t HAL_RCCEx_GetPLL1CLKFreq(void)
2826 {
2827   uint32_t plloutputfreq = RCC_PERIPH_FREQUENCY_NO;
2828   uint32_t divm;
2829 
2830   /* PLL_VCO = (HSE_VALUE, MSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
2831      SYSCLK = PLL_VCO / PLLP1 / PLLP2
2832   */
2833   if (LL_RCC_PLL1_IsReady() != 0U)
2834   {
2835     if (LL_RCC_PLL1P_IsEnabled() != 0U)
2836     {
2837       uint32_t pllinputfreq = RCCEx_GetPLLSourceFreq(LL_RCC_PLL1_GetSource());
2838 
2839       if (pllinputfreq != RCC_PERIPH_FREQUENCY_NO)
2840       {
2841 #if defined(USE_FPGA)
2842         /**** FPGA PLL input forced to 32MHz *****/
2843         pllinputfreq = RCC_PLL_SOURCE_FREQ;
2844         /*****************************************/
2845 #endif /* USE_FPGA */
2846         divm = LL_RCC_PLL1_GetM();
2847 
2848         if (divm != 0U)
2849         {
2850           plloutputfreq = RCCEx_CalcPLLFreq(pllinputfreq, divm, LL_RCC_PLL1_GetN(), LL_RCC_PLL1_GetFRACN(), \
2851                                             LL_RCC_PLL1_GetP1(), LL_RCC_PLL1_GetP2());
2852         }
2853       }
2854     }
2855   }
2856   else if (LL_RCC_PLL1_IsEnabledBypass() != 0U)
2857   {
2858     plloutputfreq = RCCEx_GetPLLSourceFreq(LL_RCC_PLL1_GetSource());
2859   }
2860   else
2861   {
2862     /* Nothing to do */
2863   }
2864 
2865   return plloutputfreq;
2866 }
2867 
2868 /**
2869   * @brief  Return PLL2 clock frequency
2870   * @note   RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
2871   * @retval PLL2 output clock frequency
2872   */
HAL_RCCEx_GetPLL2CLKFreq(void)2873 uint32_t HAL_RCCEx_GetPLL2CLKFreq(void)
2874 {
2875   uint32_t plloutputfreq = RCC_PERIPH_FREQUENCY_NO;
2876   uint32_t divm;
2877 
2878   /* PLL_VCO = (HSE_VALUE, MSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
2879      SYSCLK = PLL_VCO / PLLP1 / PLLP2
2880   */
2881   if (LL_RCC_PLL2_IsReady() != 0U)
2882   {
2883     if (LL_RCC_PLL2P_IsEnabled() != 0U)
2884     {
2885       uint32_t pllinputfreq = RCCEx_GetPLLSourceFreq(LL_RCC_PLL2_GetSource());
2886 
2887       if (pllinputfreq != RCC_PERIPH_FREQUENCY_NO)
2888       {
2889 #if defined(USE_FPGA)
2890         /**** FPGA PLL input forced to 32MHz *****/
2891         pllinputfreq = RCC_PLL_SOURCE_FREQ;
2892         /*****************************************/
2893 #endif /* USE_FPGA */
2894         divm = LL_RCC_PLL2_GetM();
2895 
2896         if (divm != 0U)
2897         {
2898           plloutputfreq = RCCEx_CalcPLLFreq(pllinputfreq, divm, LL_RCC_PLL2_GetN(), LL_RCC_PLL2_GetFRACN(), \
2899                                             LL_RCC_PLL2_GetP1(), LL_RCC_PLL2_GetP2());
2900         }
2901       }
2902     }
2903   }
2904   else if (LL_RCC_PLL2_IsEnabledBypass() != 0U)
2905   {
2906     plloutputfreq = RCCEx_GetPLLSourceFreq(LL_RCC_PLL2_GetSource());
2907   }
2908   else
2909   {
2910     /* Nothing to do */
2911   }
2912 
2913   return plloutputfreq;
2914 }
2915 
2916 /**
2917   * @brief  Return PLL3 clock frequency
2918   * @note   RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
2919   * @retval PLL3 output clock frequency
2920   */
HAL_RCCEx_GetPLL3CLKFreq(void)2921 uint32_t HAL_RCCEx_GetPLL3CLKFreq(void)
2922 {
2923   uint32_t plloutputfreq = RCC_PERIPH_FREQUENCY_NO;
2924   uint32_t divm;
2925 
2926   /* PLL_VCO = (HSE_VALUE, MSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
2927      SYSCLK = PLL_VCO / PLLP1 / PLLP2
2928   */
2929   if (LL_RCC_PLL3_IsReady() != 0U)
2930   {
2931     if (LL_RCC_PLL3P_IsEnabled() != 0U)
2932     {
2933       uint32_t pllinputfreq = RCCEx_GetPLLSourceFreq(LL_RCC_PLL3_GetSource());
2934 
2935       if (pllinputfreq != RCC_PERIPH_FREQUENCY_NO)
2936       {
2937 #if defined(USE_FPGA)
2938         /**** FPGA PLL input forced to 32MHz *****/
2939         pllinputfreq = RCC_PLL_SOURCE_FREQ;
2940         /*****************************************/
2941 #endif /* USE_FPGA */
2942         divm = LL_RCC_PLL3_GetM();
2943 
2944         if (divm != 0U)
2945         {
2946           plloutputfreq = RCCEx_CalcPLLFreq(pllinputfreq, divm, LL_RCC_PLL3_GetN(), LL_RCC_PLL3_GetFRACN(), \
2947                                             LL_RCC_PLL3_GetP1(), LL_RCC_PLL3_GetP2());
2948         }
2949       }
2950     }
2951   }
2952   else if (LL_RCC_PLL3_IsEnabledBypass() != 0U)
2953   {
2954     plloutputfreq = RCCEx_GetPLLSourceFreq(LL_RCC_PLL3_GetSource());
2955   }
2956   else
2957   {
2958     /* Nothing to do */
2959   }
2960 
2961   return plloutputfreq;
2962 }
2963 
2964 /**
2965   * @brief  Return PLL4 clock frequency
2966   * @note   RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
2967   * @retval PLL4 output clock frequency
2968   */
HAL_RCCEx_GetPLL4CLKFreq(void)2969 uint32_t HAL_RCCEx_GetPLL4CLKFreq(void)
2970 {
2971   uint32_t plloutputfreq = RCC_PERIPH_FREQUENCY_NO;
2972   uint32_t divm;
2973 
2974   /* PLL_VCO = (HSE_VALUE, MSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
2975      SYSCLK = PLL_VCO / PLLP1 / PLLP2
2976   */
2977   if (LL_RCC_PLL4_IsReady() != 0U)
2978   {
2979     if (LL_RCC_PLL4P_IsEnabled() != 0U)
2980     {
2981       uint32_t pllinputfreq = RCCEx_GetPLLSourceFreq(LL_RCC_PLL4_GetSource());
2982 
2983       if (pllinputfreq != RCC_PERIPH_FREQUENCY_NO)
2984       {
2985 #if defined(USE_FPGA)
2986         /**** FPGA PLL input forced to 32MHz *****/
2987         pllinputfreq = RCC_PLL_SOURCE_FREQ;
2988         /*****************************************/
2989 #endif /* USE_FPGA */
2990         divm = LL_RCC_PLL4_GetM();
2991 
2992         if (divm != 0U)
2993         {
2994           plloutputfreq = RCCEx_CalcPLLFreq(pllinputfreq, divm, LL_RCC_PLL4_GetN(), LL_RCC_PLL4_GetFRACN(), \
2995                                             LL_RCC_PLL4_GetP1(), LL_RCC_PLL4_GetP2());
2996         }
2997       }
2998     }
2999   }
3000   else if (LL_RCC_PLL4_IsEnabledBypass() != 0U)
3001   {
3002     plloutputfreq = RCCEx_GetPLLSourceFreq(LL_RCC_PLL4_GetSource());
3003   }
3004   else
3005   {
3006     /* Nothing to do */
3007   }
3008 
3009   return plloutputfreq;
3010 }
3011 
3012 /**
3013   * @}
3014   */
3015 
3016 /** @defgroup RCCEx_Exported_Functions_Group2 Extended System Control functions
3017   *  @brief  Extended Peripheral Control functions
3018   * @{
3019   */
3020 /**
3021   * @brief  Configure the oscillator clock source for wakeup from Stop and CSS backup clock
3022   * @param  WakeUpClk Wakeup clock
3023   *         This parameter can be one of the following values:
3024   *            @arg RCC_STOP_WAKEUPCLOCK_MSI: MSI oscillator selection
3025   *            @arg RCC_STOP_WAKEUPCLOCK_HSI: HSI oscillator selection
3026   * @note   This function shall not be called after the Clock Security System on HSE has been
3027   *         enabled and the system clock is HSE or a switch on HSE is requested.
3028   * @retval None
3029   */
HAL_RCCEx_WakeUpStopCLKConfig(uint32_t WakeUpClk)3030 void HAL_RCCEx_WakeUpStopCLKConfig(uint32_t WakeUpClk)
3031 {
3032   assert_param(IS_RCC_STOP_WAKEUPCLOCK(WakeUpClk));
3033 
3034   __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(WakeUpClk);
3035 }
3036 
3037 /**
3038   * @brief  Enable the LSE Clock Security System.
3039   * @note   Prior to enable the LSE Clock Security System, LSE oscillator is to be enabled
3040   *         with HAL_RCC_OscConfig() and the LSE oscillator clock is to be selected as RTC
3041   *         clock with HAL_RCCEx_PeriphCLKConfig().
3042   * @note   Backup domain access should be enabled
3043   * @retval None
3044   */
HAL_RCCEx_EnableLSECSS(void)3045 void HAL_RCCEx_EnableLSECSS(void)
3046 {
3047   LL_RCC_LSE_EnableCSS();
3048 }
3049 
3050 /**
3051   * @brief  Disable the LSE Clock Security System.
3052   * @note   LSE Clock Security System can only be disabled after a LSE failure detection.
3053   * @note   Backup domain access should be enabled
3054   * @retval None
3055   */
HAL_RCCEx_DisableLSECSS(void)3056 void HAL_RCCEx_DisableLSECSS(void)
3057 {
3058   /* Disable LSE CSS IT if any */
3059   __HAL_RCC_DISABLE_IT(RCC_IT_LSECSS);
3060 
3061   LL_RCC_LSE_DisableCSS();
3062 }
3063 
3064 /**
3065   * @brief  Enable the LSE Clock Security System Interrupt.
3066   * @note   LSE Clock Security System Interrupt is mapped on EXTI line 65 which must be
3067   *         enabled at application level to wake up from low power modes
3068   * @retval None
3069   */
HAL_RCCEx_EnableLSECSS_IT(void)3070 void HAL_RCCEx_EnableLSECSS_IT(void)
3071 {
3072   /* Enable LSE CSS IT */
3073   __HAL_RCC_ENABLE_IT(RCC_IT_LSECSS);
3074 
3075   LL_RCC_LSE_EnableCSS();
3076 }
3077 
3078 /**
3079   * @brief  Disable the LSE Clock Security System Interrupt.
3080   * @retval None
3081   */
HAL_RCCEx_DisableLSECSS_IT(void)3082 void HAL_RCCEx_DisableLSECSS_IT(void)
3083 {
3084   /* Disable LSE CSS IT */
3085   __HAL_RCC_DISABLE_IT(RCC_IT_LSECSS);
3086 
3087   LL_RCC_LSE_DisableCSS();
3088 }
3089 
3090 /**
3091   * @brief  Rearm the LSE Clock Security System
3092   * @note   Allow to re-arm the LSE Clock Security System after a LSE failure detection
3093   * @retval None
3094   */
HAL_RCCEx_ReArmLSECSS(void)3095 void HAL_RCCEx_ReArmLSECSS(void)
3096 {
3097   LL_RCC_LSE_ReArmCSS();
3098 }
3099 
3100 /**
3101   * @brief Handle the RCC LSE Clock Security System interrupt request.
3102   * @retval None
3103   */
HAL_RCCEx_LSECSS_IRQHandler(void)3104 void HAL_RCCEx_LSECSS_IRQHandler(void)
3105 {
3106   /* Check RCC LSE CSSF flag  */
3107   if (__HAL_RCC_GET_IT(RCC_IT_LSECSS))
3108   {
3109     /* Clear RCC LSE CSS pending bit */
3110     __HAL_RCC_CLEAR_IT(RCC_IT_LSECSS);
3111 
3112     /* RCC LSE Clock Security System interrupt user callback */
3113     HAL_RCCEx_LSECSS_Callback();
3114   }
3115 }
3116 
3117 /**
3118   * @brief  RCCEx LSE Clock Security System interrupt callback.
3119   * @retval none
3120   */
HAL_RCCEx_LSECSS_Callback(void)3121 __weak void HAL_RCCEx_LSECSS_Callback(void)
3122 {
3123   /* NOTE : This function should not be modified, when the callback is needed,
3124             the @ref HAL_RCCEx_LSECSS_Callback should be implemented in the user file
3125   */
3126 }
3127 
3128 /**
3129   * @brief  Configure the requested PLL to SSCG Mode
3130   * @param  PLLnumber PLL number to configure.
3131   *         This parameter can be one of the following values:
3132   *            @ref RCC_PLL_Selection
3133   * @param  pPLLInit Pointer to an RCC_PLLInitTypeDef structure that
3134   *                  contains the configuration parameters.
3135   * @param  pPLLSSCGInit Pointer to an RCC_PLLSSCGInitTypeDef structure that
3136   *                  contains the configuration parameters specific to SSCG.
3137   * @note   PLL is temporary disabled to apply new parameters
3138   *
3139   * @retval HAL status
3140   */
HAL_RCCEx_PLLSSCGConfig(uint32_t PLLnumber,const RCC_PLLInitTypeDef * pPLLInit,const RCC_PLLSSCGInitTypeDef * pPLLSSCGInit)3141 HAL_StatusTypeDef HAL_RCCEx_PLLSSCGConfig(uint32_t PLLnumber, const RCC_PLLInitTypeDef *pPLLInit,
3142                                           const RCC_PLLSSCGInitTypeDef *pPLLSSCGInit)
3143 {
3144   __IO uint32_t *p_rcc_pll_cfgr1_reg;
3145   __IO uint32_t *p_rcc_pll_cfgr2_reg;
3146   __IO uint32_t *p_rcc_pll_cfgr3_reg;
3147   HAL_StatusTypeDef ret = HAL_OK;
3148   uint32_t tickstart;
3149 
3150   p_rcc_pll_cfgr1_reg = &(RCC->PLL1CFGR1) + (((uint32_t)0x4) * PLLnumber);
3151   p_rcc_pll_cfgr2_reg = &(RCC->PLL1CFGR2) + (((uint32_t)0x4) * PLLnumber);
3152   p_rcc_pll_cfgr3_reg = &(RCC->PLL1CFGR3) + (((uint32_t)0x4) * PLLnumber);
3153 
3154   if (pPLLInit->PLLState == RCC_PLL_ON)
3155   {
3156     /* Check the parameters */
3157     assert_param(IS_RCC_PLLSOURCE(pPLLInit->PLLSource));
3158     assert_param(IS_RCC_PLLFRACN_VALUE(pPLLInit->PLLFractional));
3159     assert_param(IS_RCC_PLLM_VALUE(pPLLInit->PLLM));
3160     assert_param(IS_RCC_PLLN_VALUE(pPLLInit->PLLN));
3161     assert_param(IS_RCC_PLLP_VALUE(pPLLInit->PLLP1));
3162     assert_param(IS_RCC_PLLP_VALUE(pPLLInit->PLLP2));
3163     assert_param(IS_RCC_PLLP_VALUE(pPLLInit->PLLP2));
3164 
3165     /* Ensure PLLx is disabled */
3166     WRITE_REG(RCC->CCR, RCC_CCR_PLL1ONC << PLLnumber);
3167 
3168     /* Get Start Tick*/
3169     tickstart = HAL_GetTick();
3170 
3171     /* Wait till PLLx is disabled */
3172     while (READ_BIT(RCC->SR, (RCC_SR_PLL1RDY << PLLnumber)) == (RCC_SR_PLL1RDY << PLLnumber))
3173     {
3174       if ((HAL_GetTick() - tickstart) > RCC_PLL_TIMEOUT_VALUE)
3175       {
3176         return HAL_TIMEOUT;
3177       }
3178     }
3179 
3180     /* Ensure PLLxMODSSDIS='1' */
3181     SET_BIT(*p_rcc_pll_cfgr3_reg, RCC_PLL1CFGR3_PLL1MODSSDIS);
3182 
3183     /* Clear bypass mode */
3184     CLEAR_BIT(*p_rcc_pll_cfgr1_reg, RCC_PLL1CFGR1_PLL1BYP);
3185 
3186     /* Configure the PLLx clock source, multiplication and division factors. */
3187     MODIFY_REG(*p_rcc_pll_cfgr1_reg, (RCC_PLL1CFGR1_PLL1SEL | RCC_PLL1CFGR1_PLL1DIVM | RCC_PLL1CFGR1_PLL1DIVN), \
3188                (pPLLInit->PLLSource | (pPLLInit->PLLM << RCC_PLL1CFGR1_PLL1DIVM_Pos) \
3189                 | (pPLLInit->PLLN << RCC_PLL1CFGR1_PLL1DIVN_Pos)));
3190     MODIFY_REG(*p_rcc_pll_cfgr3_reg, (RCC_PLL1CFGR3_PLL1PDIV1 | RCC_PLL1CFGR3_PLL1PDIV2), \
3191                ((pPLLInit->PLLP1 << RCC_PLL1CFGR3_PLL1PDIV1_Pos) | (pPLLInit->PLLP2 << RCC_PLL1CFGR3_PLL1PDIV2_Pos)));
3192 
3193     /* Configure PLLx DIVNFRAC */
3194     MODIFY_REG(*p_rcc_pll_cfgr2_reg, RCC_PLL1CFGR2_PLL1DIVNFRAC, \
3195                pPLLInit->PLLFractional << RCC_PLL1CFGR2_PLL1DIVNFRAC_Pos);
3196 
3197     /* Configure PLLx SSCG Parameters */
3198     MODIFY_REG(*p_rcc_pll_cfgr3_reg, (RCC_PLL1CFGR3_PLL1MODDIV | RCC_PLL1CFGR3_PLL1MODSPR | RCC_PLL1CFGR3_PLL1MODSPR), \
3199                ((pPLLSSCGInit->PLLModDiv << RCC_PLL1CFGR3_PLL1MODDIV_Pos) \
3200                 | (pPLLSSCGInit->PLLModSpreadDepth << RCC_PLL1CFGR3_PLL1MODSPR_Pos)
3201                 | (pPLLSSCGInit->PLLModSpreadMode << RCC_PLL1CFGR3_PLL1MODSPRDW_Pos)));
3202 
3203     /* Clear PLLxMODSSDIS, PLLxMODDSEN and DACEN to 0 */
3204     CLEAR_BIT(*p_rcc_pll_cfgr3_reg, RCC_PLL1CFGR3_PLL1MODSSDIS | RCC_PLL1CFGR3_PLL1MODDSEN | RCC_PLL1CFGR3_PLL1DACEN);
3205 
3206     /* Ensure PLLxMODSSRST='1' and Enable PLLx post divider output */
3207     SET_BIT(*p_rcc_pll_cfgr3_reg, (RCC_PLL1CFGR3_PLL1MODSSRST | RCC_PLL1CFGR3_PLL1PDIVEN));
3208 
3209     /* Set PLLxMODDSEN and DACEN */
3210     SET_BIT(*p_rcc_pll_cfgr3_reg, (RCC_PLL1CFGR3_PLL1MODDSEN | RCC_PLL1CFGR3_PLL1DACEN));
3211 
3212     /* Enable the PLLx */
3213     WRITE_REG(RCC->CSR, RCC_CSR_PLL1ONS << PLLnumber);
3214 
3215     /* Get Start Tick*/
3216     tickstart = HAL_GetTick();
3217 
3218     /* Wait till PLLx is ready */
3219     while (READ_BIT(RCC->SR, (RCC_SR_PLL1RDY << PLLnumber)) == 0U)
3220     {
3221       if ((HAL_GetTick() - tickstart) > RCC_PLL_TIMEOUT_VALUE)
3222       {
3223         return HAL_TIMEOUT;
3224       }
3225     }
3226 
3227     /* When PLL is Ready, deassert the PLLxMODSSRST */
3228     CLEAR_BIT(*p_rcc_pll_cfgr3_reg, RCC_PLL1CFGR3_PLL1MODSSRST);
3229   }
3230   else if (pPLLInit->PLLState == RCC_PLL_BYPASS)
3231   {
3232     ret = HAL_ERROR;
3233   }
3234   else
3235   {
3236     /* other states are not managed this function */
3237   }
3238 
3239   return ret;
3240 }
3241 /**
3242   * @}
3243   */
3244 
3245 /**
3246   * @}
3247   */
3248 
3249 /** @defgroup RCCEx_Private_Functions RCCEx Private Functions
3250   * @{
3251   */
3252 
3253 /**
3254   * @brief  Return HCLK clock frequency
3255   * @param  SYSCLK_Frequency SYSCLK clock frequency
3256   * @retval HCLK clock frequency (in Hz)
3257   */
RCCEx_GetHCLKFreq(uint32_t SYSCLK_Frequency)3258 static uint32_t RCCEx_GetHCLKFreq(uint32_t SYSCLK_Frequency)
3259 {
3260   /* HCLK clock frequency */
3261   return LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
3262 }
3263 
3264 /**
3265   * @brief  Return PCLK1 clock frequency
3266   * @param  HCLK_Frequency HCLK clock frequency
3267   * @retval PCLK1 clock frequency (in Hz)
3268   */
RCCEx_GetPCLK1Freq(uint32_t HCLK_Frequency)3269 static uint32_t RCCEx_GetPCLK1Freq(uint32_t HCLK_Frequency)
3270 {
3271   /* PCLK1 clock frequency */
3272   return LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
3273 }
3274 
3275 /**
3276   * @brief  Return PCLK2 clock frequency
3277   * @param  HCLK_Frequency HCLK clock frequency
3278   * @retval PCLK2 clock frequency (in Hz)
3279   */
RCCEx_GetPCLK2Freq(uint32_t HCLK_Frequency)3280 static uint32_t RCCEx_GetPCLK2Freq(uint32_t HCLK_Frequency)
3281 {
3282   /* PCLK2 clock frequency */
3283   return LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
3284 }
3285 
3286 /**
3287   * @brief  Return PCLK4 clock frequency
3288   * @param  HCLK_Frequency HCLK clock frequency
3289   * @retval PCLK4 clock frequency (in Hz)
3290   */
RCCEx_GetPCLK4Freq(uint32_t HCLK_Frequency)3291 static uint32_t RCCEx_GetPCLK4Freq(uint32_t HCLK_Frequency)
3292 {
3293   /* PCLK4 clock frequency */
3294   return LL_RCC_CALC_PCLK4_FREQ(HCLK_Frequency, LL_RCC_GetAPB4Prescaler());
3295 }
3296 
3297 /**
3298   * @brief  Return PCLK5 clock frequency
3299   * @param  HCLK_Frequency HCLK clock frequency
3300   * @retval PCLK5 clock frequency (in Hz)
3301   */
RCCEx_GetPCLK5Freq(uint32_t HCLK_Frequency)3302 static uint32_t RCCEx_GetPCLK5Freq(uint32_t HCLK_Frequency)
3303 {
3304   /* PCLK5 clock frequency */
3305   return LL_RCC_CALC_PCLK5_FREQ(HCLK_Frequency, LL_RCC_GetAPB5Prescaler());
3306 }
3307 
3308 /**
3309   * @brief  Return PLL source clock frequency
3310   * @param  PLLsource PLL source clock
3311   * @retval PLL source clock frequency (in Hz)
3312   */
RCCEx_GetPLLSourceFreq(uint32_t PLLsource)3313 static uint32_t RCCEx_GetPLLSourceFreq(uint32_t PLLsource)
3314 {
3315   uint32_t pllinputfreq = RCC_PERIPH_FREQUENCY_NO;
3316 
3317   switch (PLLsource)
3318   {
3319     case LL_RCC_PLLSOURCE_HSI:
3320       if (LL_RCC_HSI_IsReady() != 0U)
3321       {
3322         pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
3323       }
3324       break;
3325 
3326     case LL_RCC_PLLSOURCE_MSI:
3327       if (LL_RCC_MSI_IsReady() != 0U)
3328       {
3329         if (LL_RCC_MSI_GetFrequency() == LL_RCC_MSI_FREQ_4MHZ)
3330         {
3331           pllinputfreq = MSI_VALUE;
3332         }
3333         else
3334         {
3335           pllinputfreq = 16000000UL;
3336         }
3337       }
3338       break;
3339 
3340     case LL_RCC_PLLSOURCE_HSE:
3341       if (LL_RCC_HSE_IsReady() != 0U)
3342       {
3343         pllinputfreq = HSE_VALUE;
3344       }
3345       break;
3346 
3347     case LL_RCC_PLLSOURCE_I2S_CKIN:
3348       pllinputfreq = EXTERNAL_CLOCK_VALUE;
3349       break;
3350 
3351     default:
3352       /* unexpected case */
3353       break;
3354   }
3355 
3356   return pllinputfreq;
3357 }
3358 
3359 /**
3360   * @brief  Calculate the PLL frequency output when used in integer or fractional mode
3361   * @param  PLLInputFreq PLL Input frequency (based on HSE/(HSI/HSIDIV)/MSI)
3362   * @param  M      Between 1 and 63
3363   * @param  N      Between 16 and 640 in integer mode, 20 to 320 in fractional mode
3364   * @param  FRACN  0 in integer mode, between 0 and 0xFFFFFF in fractional mode
3365   * @param  P1     VCO output divider P1 between 1 and 7
3366   * @param  P2     VCO output divider P2 between 1 and 7
3367   * @retval PLL clock frequency (in Hz)
3368   */
RCCEx_CalcPLLFreq(uint32_t PLLInputFreq,uint32_t M,uint32_t N,uint32_t FRACN,uint32_t P1,uint32_t P2)3369 static uint32_t RCCEx_CalcPLLFreq(uint32_t PLLInputFreq, uint32_t M, uint32_t N, uint32_t FRACN, uint32_t P1,
3370                                   uint32_t P2)
3371 {
3372   float_t freq;
3373 
3374   freq = ((float_t)PLLInputFreq * ((float_t)N + ((float_t)FRACN / (float_t)0x1000000))) / (float_t)M;
3375 
3376   freq = freq / (float_t)P1;
3377   freq = freq / (float_t)P2;
3378 
3379   return (uint32_t)freq;
3380 }
3381 
3382 /**
3383   * @brief  Return ADC clock frequency
3384   * @param  ADCxSource This parameter can be one of the following values:
3385   *         @arg @ref RCCEx_ADC_Clock_Source
3386   * @retval ADC clock frequency (in Hz)
3387   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
3388   */
RCCEx_GetADCCLKFreq(uint32_t ADCxSource)3389 static uint32_t RCCEx_GetADCCLKFreq(uint32_t ADCxSource)
3390 {
3391   uint32_t adc_frequency = RCC_PERIPH_FREQUENCY_NO;
3392   uint32_t ic_divider;
3393 
3394   switch (LL_RCC_GetADCClockSource(ADCxSource))
3395   {
3396     case LL_RCC_ADC_CLKSOURCE_HCLK:
3397       adc_frequency = RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq());
3398       break;
3399 
3400     case LL_RCC_ADC_CLKSOURCE_CLKP:
3401       adc_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
3402       break;
3403 
3404     case LL_RCC_ADC_CLKSOURCE_IC7:
3405       if (LL_RCC_IC7_IsEnabled() != 0U)
3406       {
3407         ic_divider = LL_RCC_IC7_GetDivider();
3408         switch (LL_RCC_IC7_GetSource())
3409         {
3410           case LL_RCC_ICCLKSOURCE_PLL1:
3411             adc_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3412             adc_frequency = adc_frequency / ic_divider;
3413             break;
3414           case LL_RCC_ICCLKSOURCE_PLL2:
3415             adc_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3416             adc_frequency = adc_frequency / ic_divider;
3417             break;
3418           case LL_RCC_ICCLKSOURCE_PLL3:
3419             adc_frequency = HAL_RCCEx_GetPLL3CLKFreq();
3420             adc_frequency = adc_frequency / ic_divider;
3421             break;
3422           case LL_RCC_ICCLKSOURCE_PLL4:
3423             adc_frequency = HAL_RCCEx_GetPLL4CLKFreq();
3424             adc_frequency = adc_frequency / ic_divider;
3425             break;
3426           default:
3427             /* Unexpected case */
3428             break;
3429         }
3430       }
3431       break;
3432 
3433     case LL_RCC_ADC_CLKSOURCE_IC8:
3434       if (LL_RCC_IC8_IsEnabled() != 0U)
3435       {
3436         ic_divider = LL_RCC_IC8_GetDivider();
3437         switch (LL_RCC_IC8_GetSource())
3438         {
3439           case LL_RCC_ICCLKSOURCE_PLL1:
3440             adc_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3441             adc_frequency = adc_frequency / ic_divider;
3442             break;
3443           case LL_RCC_ICCLKSOURCE_PLL2:
3444             adc_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3445             adc_frequency = adc_frequency / ic_divider;
3446             break;
3447           case LL_RCC_ICCLKSOURCE_PLL3:
3448             adc_frequency = HAL_RCCEx_GetPLL3CLKFreq();
3449             adc_frequency = adc_frequency / ic_divider;
3450             break;
3451           case LL_RCC_ICCLKSOURCE_PLL4:
3452             adc_frequency = HAL_RCCEx_GetPLL4CLKFreq();
3453             adc_frequency = adc_frequency / ic_divider;
3454             break;
3455           default:
3456             /* Unexpected case */
3457             break;
3458         }
3459       }
3460       break;
3461 
3462     case LL_RCC_ADC_CLKSOURCE_HSI:
3463       if (LL_RCC_HSI_IsReady() != 0U)
3464       {
3465         adc_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
3466       }
3467       break;
3468 
3469     case LL_RCC_ADC_CLKSOURCE_MSI:
3470       if (LL_RCC_MSI_IsReady() != 0U)
3471       {
3472         adc_frequency = MSI_VALUE;
3473       }
3474       break;
3475 
3476     case LL_RCC_ADC_CLKSOURCE_I2S_CKIN:
3477       adc_frequency = EXTERNAL_CLOCK_VALUE;
3478       break;
3479 
3480     case LL_RCC_ADC_CLKSOURCE_TIMG:
3481       adc_frequency = HAL_RCC_GetSysClockFreq() / (1UL << LL_RCC_GetTIMPrescaler());
3482       break;
3483 
3484     default:
3485       /* Unexpected case */
3486       break;
3487   }
3488 
3489   return (adc_frequency / __HAL_RCC_GET_ADC_DIVIDER());
3490 }
3491 
3492 /**
3493   * @brief  Return ADFx clock frequency
3494   * @param  ADFxSource This parameter can be one of the following values:
3495   *         @arg @ref RCCEx_ADF1_Clock_Source
3496   * @retval ADF clock frequency (in Hz)
3497   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
3498   */
RCCEx_GetADFCLKFreq(uint32_t ADFxSource)3499 static uint32_t RCCEx_GetADFCLKFreq(uint32_t ADFxSource)
3500 {
3501   uint32_t adf_frequency = RCC_PERIPH_FREQUENCY_NO;
3502   uint32_t ic_divider;
3503 
3504   switch (LL_RCC_GetADFClockSource(ADFxSource))
3505   {
3506     case LL_RCC_ADF1_CLKSOURCE_HCLK:
3507       adf_frequency = RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq());
3508       break;
3509 
3510     case LL_RCC_ADF1_CLKSOURCE_CLKP:
3511       adf_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
3512       break;
3513 
3514     case LL_RCC_ADF1_CLKSOURCE_IC7:
3515       if (LL_RCC_IC7_IsEnabled() != 0U)
3516       {
3517         ic_divider = LL_RCC_IC7_GetDivider();
3518         switch (LL_RCC_IC7_GetSource())
3519         {
3520           case LL_RCC_ICCLKSOURCE_PLL1:
3521             adf_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3522             adf_frequency = adf_frequency / ic_divider;
3523             break;
3524           case LL_RCC_ICCLKSOURCE_PLL2:
3525             adf_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3526             adf_frequency = adf_frequency / ic_divider;
3527             break;
3528           case LL_RCC_ICCLKSOURCE_PLL3:
3529             adf_frequency = HAL_RCCEx_GetPLL3CLKFreq();
3530             adf_frequency = adf_frequency / ic_divider;
3531             break;
3532           case LL_RCC_ICCLKSOURCE_PLL4:
3533             adf_frequency = HAL_RCCEx_GetPLL4CLKFreq();
3534             adf_frequency = adf_frequency / ic_divider;
3535             break;
3536           default:
3537             /* Unexpected case */
3538             break;
3539         }
3540       }
3541       break;
3542 
3543     case LL_RCC_ADF1_CLKSOURCE_IC8:
3544       if (LL_RCC_IC8_IsEnabled() != 0U)
3545       {
3546         ic_divider = LL_RCC_IC8_GetDivider();
3547         switch (LL_RCC_IC8_GetSource())
3548         {
3549           case LL_RCC_ICCLKSOURCE_PLL1:
3550             adf_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3551             adf_frequency = adf_frequency / ic_divider;
3552             break;
3553           case LL_RCC_ICCLKSOURCE_PLL2:
3554             adf_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3555             adf_frequency = adf_frequency / ic_divider;
3556             break;
3557           case LL_RCC_ICCLKSOURCE_PLL3:
3558             adf_frequency = HAL_RCCEx_GetPLL3CLKFreq();
3559             adf_frequency = adf_frequency / ic_divider;
3560             break;
3561           case LL_RCC_ICCLKSOURCE_PLL4:
3562             adf_frequency = HAL_RCCEx_GetPLL4CLKFreq();
3563             adf_frequency = adf_frequency / ic_divider;
3564             break;
3565           default:
3566             /* Unexpected case */
3567             break;
3568         }
3569       }
3570       break;
3571 
3572     case LL_RCC_ADF1_CLKSOURCE_HSI:
3573       if (LL_RCC_HSI_IsReady() != 0U)
3574       {
3575         adf_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
3576       }
3577       break;
3578 
3579     case LL_RCC_ADF1_CLKSOURCE_MSI:
3580       if (LL_RCC_MSI_IsReady() != 0U)
3581       {
3582         adf_frequency = MSI_VALUE;
3583       }
3584       break;
3585 
3586     case LL_RCC_ADF1_CLKSOURCE_I2S_CKIN:
3587       adf_frequency = EXTERNAL_CLOCK_VALUE;
3588       break;
3589 
3590     case LL_RCC_ADF1_CLKSOURCE_TIMG:
3591       adf_frequency = HAL_RCC_GetSysClockFreq() / (1UL << LL_RCC_GetTIMPrescaler());
3592       break;
3593 
3594     default:
3595       /* Unexpected case */
3596       break;
3597   }
3598 
3599   return adf_frequency;
3600 }
3601 
3602 /**
3603   * @brief  Return CLKP clock frequency
3604   * @param  CLKPxSource This parameter can be one of the following values:
3605   *         @arg @ref RCCEx_CLKP_Clock_Source
3606   * @retval CLKP clock frequency (in Hz)
3607   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
3608   */
RCCEx_GetCLKPCLKFreq(uint32_t CLKPxSource)3609 static uint32_t RCCEx_GetCLKPCLKFreq(uint32_t CLKPxSource)
3610 {
3611   uint32_t clkp_frequency = RCC_PERIPH_FREQUENCY_NO;
3612   uint32_t ic_divider;
3613 
3614   if (LL_RCC_CLKP_IsEnabled() == 1U)
3615   {
3616     switch (LL_RCC_GetCLKPClockSource(CLKPxSource))
3617     {
3618       case LL_RCC_CLKP_CLKSOURCE_HSI:
3619         if (LL_RCC_HSI_IsReady() != 0U)
3620         {
3621           clkp_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
3622         }
3623         break;
3624 
3625       case LL_RCC_CLKP_CLKSOURCE_MSI:
3626         if (LL_RCC_MSI_IsReady() != 0U)
3627         {
3628           clkp_frequency = MSI_VALUE;
3629         }
3630         break;
3631 
3632       case LL_RCC_CLKP_CLKSOURCE_HSE:
3633         if (LL_RCC_HSE_IsReady() != 0U)
3634         {
3635           clkp_frequency = HSE_VALUE;
3636         }
3637         break;
3638 
3639       case LL_RCC_CLKP_CLKSOURCE_IC5:
3640         if (LL_RCC_IC5_IsEnabled() != 0U)
3641         {
3642           ic_divider = LL_RCC_IC5_GetDivider();
3643           switch (LL_RCC_IC5_GetSource())
3644           {
3645             case LL_RCC_ICCLKSOURCE_PLL1:
3646               clkp_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3647               clkp_frequency = clkp_frequency / ic_divider;
3648               break;
3649             case LL_RCC_ICCLKSOURCE_PLL2:
3650               clkp_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3651               clkp_frequency = clkp_frequency / ic_divider;
3652               break;
3653             case LL_RCC_ICCLKSOURCE_PLL3:
3654               clkp_frequency = HAL_RCCEx_GetPLL3CLKFreq();
3655               clkp_frequency = clkp_frequency / ic_divider;
3656               break;
3657             case LL_RCC_ICCLKSOURCE_PLL4:
3658               clkp_frequency = HAL_RCCEx_GetPLL4CLKFreq();
3659               clkp_frequency = clkp_frequency / ic_divider;
3660               break;
3661             default:
3662               /* Unexpected case */
3663               break;
3664           }
3665         }
3666         break;
3667 
3668       case LL_RCC_CLKP_CLKSOURCE_IC10:
3669         if (LL_RCC_IC10_IsEnabled() != 0U)
3670         {
3671           ic_divider = LL_RCC_IC10_GetDivider();
3672           switch (LL_RCC_IC10_GetSource())
3673           {
3674             case LL_RCC_ICCLKSOURCE_PLL1:
3675               clkp_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3676               clkp_frequency = clkp_frequency / ic_divider;
3677               break;
3678             case LL_RCC_ICCLKSOURCE_PLL2:
3679               clkp_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3680               clkp_frequency = clkp_frequency / ic_divider;
3681               break;
3682             case LL_RCC_ICCLKSOURCE_PLL3:
3683               clkp_frequency = HAL_RCCEx_GetPLL3CLKFreq();
3684               clkp_frequency = clkp_frequency / ic_divider;
3685               break;
3686             case LL_RCC_ICCLKSOURCE_PLL4:
3687               clkp_frequency = HAL_RCCEx_GetPLL4CLKFreq();
3688               clkp_frequency = clkp_frequency / ic_divider;
3689               break;
3690             default:
3691               /* Unexpected case */
3692               break;
3693           }
3694         }
3695         break;
3696 
3697       case LL_RCC_CLKP_CLKSOURCE_IC15:
3698         if (LL_RCC_IC15_IsEnabled() != 0U)
3699         {
3700           ic_divider = LL_RCC_IC15_GetDivider();
3701           switch (LL_RCC_IC15_GetSource())
3702           {
3703             case LL_RCC_ICCLKSOURCE_PLL1:
3704               clkp_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3705               clkp_frequency = clkp_frequency / ic_divider;
3706               break;
3707             case LL_RCC_ICCLKSOURCE_PLL2:
3708               clkp_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3709               clkp_frequency = clkp_frequency / ic_divider;
3710               break;
3711             case LL_RCC_ICCLKSOURCE_PLL3:
3712               clkp_frequency = HAL_RCCEx_GetPLL3CLKFreq();
3713               clkp_frequency = clkp_frequency / ic_divider;
3714               break;
3715             case LL_RCC_ICCLKSOURCE_PLL4:
3716               clkp_frequency = HAL_RCCEx_GetPLL4CLKFreq();
3717               clkp_frequency = clkp_frequency / ic_divider;
3718               break;
3719             default:
3720               /* Unexpected case */
3721               break;
3722           }
3723         }
3724         break;
3725 
3726       case LL_RCC_CLKP_CLKSOURCE_IC19:
3727         if (LL_RCC_IC19_IsEnabled() != 0U)
3728         {
3729           ic_divider = LL_RCC_IC19_GetDivider();
3730           switch (LL_RCC_IC19_GetSource())
3731           {
3732             case LL_RCC_ICCLKSOURCE_PLL1:
3733               clkp_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3734               clkp_frequency = clkp_frequency / ic_divider;
3735               break;
3736             case LL_RCC_ICCLKSOURCE_PLL2:
3737               clkp_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3738               clkp_frequency = clkp_frequency / ic_divider;
3739               break;
3740             case LL_RCC_ICCLKSOURCE_PLL3:
3741               clkp_frequency = HAL_RCCEx_GetPLL3CLKFreq();
3742               clkp_frequency = clkp_frequency / ic_divider;
3743               break;
3744             case LL_RCC_ICCLKSOURCE_PLL4:
3745               clkp_frequency = HAL_RCCEx_GetPLL4CLKFreq();
3746               clkp_frequency = clkp_frequency / ic_divider;
3747               break;
3748             default:
3749               /* Unexpected case */
3750               break;
3751           }
3752         }
3753         break;
3754 
3755       case LL_RCC_CLKP_CLKSOURCE_IC20:
3756         if (LL_RCC_IC20_IsEnabled() != 0U)
3757         {
3758           ic_divider = LL_RCC_IC20_GetDivider();
3759           switch (LL_RCC_IC20_GetSource())
3760           {
3761             case LL_RCC_ICCLKSOURCE_PLL1:
3762               clkp_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3763               clkp_frequency = clkp_frequency / ic_divider;
3764               break;
3765             case LL_RCC_ICCLKSOURCE_PLL2:
3766               clkp_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3767               clkp_frequency = clkp_frequency / ic_divider;
3768               break;
3769             case LL_RCC_ICCLKSOURCE_PLL3:
3770               clkp_frequency = HAL_RCCEx_GetPLL3CLKFreq();
3771               clkp_frequency = clkp_frequency / ic_divider;
3772               break;
3773             case LL_RCC_ICCLKSOURCE_PLL4:
3774               clkp_frequency = HAL_RCCEx_GetPLL4CLKFreq();
3775               clkp_frequency = clkp_frequency / ic_divider;
3776               break;
3777             default:
3778               /* Unexpected case */
3779               break;
3780           }
3781         }
3782         break;
3783 
3784       default:
3785         /* Unexpected case */
3786         break;
3787     }
3788   }
3789 
3790   return clkp_frequency;
3791 }
3792 
3793 /**
3794   * @brief  Return CSI clock frequency
3795   * @retval CLKP clock frequency (in Hz)
3796   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
3797   */
RCCEx_GetCSICLKFreq(void)3798 static uint32_t RCCEx_GetCSICLKFreq(void)
3799 {
3800   uint32_t clkp_frequency = RCC_PERIPH_FREQUENCY_NO;
3801 
3802   if (LL_RCC_IC18_IsEnabled() != 0U)
3803   {
3804     uint32_t ic_divider = LL_RCC_IC18_GetDivider();
3805     switch (LL_RCC_IC18_GetSource())
3806     {
3807       case LL_RCC_ICCLKSOURCE_PLL1:
3808         clkp_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3809         clkp_frequency = clkp_frequency / ic_divider;
3810         break;
3811       case LL_RCC_ICCLKSOURCE_PLL2:
3812         clkp_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3813         clkp_frequency = clkp_frequency / ic_divider;
3814         break;
3815       case LL_RCC_ICCLKSOURCE_PLL3:
3816         clkp_frequency = HAL_RCCEx_GetPLL3CLKFreq();
3817         clkp_frequency = clkp_frequency / ic_divider;
3818         break;
3819       case LL_RCC_ICCLKSOURCE_PLL4:
3820         clkp_frequency = HAL_RCCEx_GetPLL4CLKFreq();
3821         clkp_frequency = clkp_frequency / ic_divider;
3822         break;
3823       default:
3824         /* Unexpected case */
3825         break;
3826     }
3827   }
3828 
3829   return clkp_frequency;
3830 }
3831 
3832 /**
3833   * @brief  Return DCMIPP clock frequency
3834   * @param  DCMIPPxSource This parameter can be one of the following values:
3835   *         @arg @ref RCCEx_DCMIPP_Clock_Source
3836   * @retval DCMIPP clock frequency (in Hz)
3837   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
3838   */
RCCEx_GetDCMIPPCLKFreq(uint32_t DCMIPPxSource)3839 static uint32_t RCCEx_GetDCMIPPCLKFreq(uint32_t DCMIPPxSource)
3840 {
3841   uint32_t dcmipp_frequency = RCC_PERIPH_FREQUENCY_NO;
3842   uint32_t ic_divider;
3843 
3844   switch (LL_RCC_GetDCMIPPClockSource(DCMIPPxSource))
3845   {
3846     case LL_RCC_DCMIPP_CLKSOURCE_PCLK5:
3847       dcmipp_frequency = RCCEx_GetPCLK5Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
3848       break;
3849 
3850     case LL_RCC_DCMIPP_CLKSOURCE_CLKP:
3851       dcmipp_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
3852       break;
3853 
3854     case LL_RCC_DCMIPP_CLKSOURCE_IC17:
3855       if (LL_RCC_IC17_IsEnabled() != 0U)
3856       {
3857         ic_divider = LL_RCC_IC17_GetDivider();
3858         switch (LL_RCC_IC17_GetSource())
3859         {
3860           case LL_RCC_ICCLKSOURCE_PLL1:
3861             dcmipp_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3862             dcmipp_frequency = dcmipp_frequency / ic_divider;
3863             break;
3864           case LL_RCC_ICCLKSOURCE_PLL2:
3865             dcmipp_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3866             dcmipp_frequency = dcmipp_frequency / ic_divider;
3867             break;
3868           case LL_RCC_ICCLKSOURCE_PLL3:
3869             dcmipp_frequency = HAL_RCCEx_GetPLL3CLKFreq();
3870             dcmipp_frequency = dcmipp_frequency / ic_divider;
3871             break;
3872           case LL_RCC_ICCLKSOURCE_PLL4:
3873             dcmipp_frequency = HAL_RCCEx_GetPLL4CLKFreq();
3874             dcmipp_frequency = dcmipp_frequency / ic_divider;
3875             break;
3876           default:
3877             /* Unexpected case */
3878             break;
3879         }
3880       }
3881       break;
3882 
3883     case LL_RCC_DCMIPP_CLKSOURCE_HSI:
3884       if (LL_RCC_HSI_IsReady() != 0U)
3885       {
3886         dcmipp_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
3887       }
3888       break;
3889 
3890     default:
3891       /* Unexpected case */
3892       break;
3893   }
3894 
3895   return dcmipp_frequency;
3896 }
3897 
3898 /**
3899   * @brief  Return ETH1 clock frequency
3900   * @param  ETH1xSource This parameter can be one of the following values:
3901   *         @arg @ref RCCEx_ETH1_Clock_Source
3902   * @retval ETH1 clock frequency (in Hz)
3903   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
3904   */
RCCEx_GetETH1CLKFreq(uint32_t ETH1xSource)3905 static uint32_t RCCEx_GetETH1CLKFreq(uint32_t ETH1xSource)
3906 {
3907   uint32_t eth1_frequency = RCC_PERIPH_FREQUENCY_NO;
3908   uint32_t ic_divider;
3909 
3910   switch (LL_RCC_GetETHClockSource(ETH1xSource))
3911   {
3912     case LL_RCC_ETH1_CLKSOURCE_HCLK:
3913       eth1_frequency = RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq());
3914       break;
3915 
3916     case LL_RCC_ETH1_CLKSOURCE_CLKP:
3917       eth1_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
3918       break;
3919 
3920     case LL_RCC_ETH1_CLKSOURCE_IC12:
3921       if (LL_RCC_IC12_IsEnabled() != 0U)
3922       {
3923         ic_divider = LL_RCC_IC12_GetDivider();
3924         switch (LL_RCC_IC12_GetSource())
3925         {
3926           case LL_RCC_ICCLKSOURCE_PLL1:
3927             eth1_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3928             eth1_frequency = eth1_frequency / ic_divider;
3929             break;
3930           case LL_RCC_ICCLKSOURCE_PLL2:
3931             eth1_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3932             eth1_frequency = eth1_frequency / ic_divider;
3933             break;
3934           case LL_RCC_ICCLKSOURCE_PLL3:
3935             eth1_frequency = HAL_RCCEx_GetPLL3CLKFreq();
3936             eth1_frequency = eth1_frequency / ic_divider;
3937             break;
3938           case LL_RCC_ICCLKSOURCE_PLL4:
3939             eth1_frequency = HAL_RCCEx_GetPLL4CLKFreq();
3940             eth1_frequency = eth1_frequency / ic_divider;
3941             break;
3942           default:
3943             /* Unexpected case */
3944             break;
3945         }
3946       }
3947       break;
3948 
3949     case LL_RCC_ETH1_CLKSOURCE_HSE:
3950       if (LL_RCC_HSE_IsReady() != 0U)
3951       {
3952         eth1_frequency = HSE_VALUE;
3953       }
3954       break;
3955 
3956     default:
3957       /* Unexpected case */
3958       break;
3959   }
3960 
3961   return eth1_frequency;
3962 }
3963 
3964 /**
3965   * @brief  Return ETH1PTP clock frequency
3966   * @param  ETH1PTPxSource This parameter can be one of the following values:
3967   *         @arg @ref RCCEx_ETH1_PTP_Clock_Source
3968   * @retval ETH1PTP clock frequency (in Hz)
3969   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
3970   */
RCCEx_GetETH1PTPCLKFreq(uint32_t ETH1PTPxSource)3971 static uint32_t RCCEx_GetETH1PTPCLKFreq(uint32_t ETH1PTPxSource)
3972 {
3973   uint32_t eth1ptp_frequency = RCC_PERIPH_FREQUENCY_NO;
3974   uint32_t ic_divider;
3975 
3976   switch (LL_RCC_GetETHPTPClockSource(ETH1PTPxSource))
3977   {
3978     case LL_RCC_ETH1PTP_CLKSOURCE_HCLK:
3979       eth1ptp_frequency = RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq());
3980       break;
3981 
3982     case LL_RCC_ETH1PTP_CLKSOURCE_CLKP:
3983       eth1ptp_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
3984       break;
3985 
3986     case LL_RCC_ETH1PTP_CLKSOURCE_IC13:
3987       if (LL_RCC_IC13_IsEnabled() != 0U)
3988       {
3989         ic_divider = LL_RCC_IC13_GetDivider();
3990         switch (LL_RCC_IC13_GetSource())
3991         {
3992           case LL_RCC_ICCLKSOURCE_PLL1:
3993             eth1ptp_frequency = HAL_RCCEx_GetPLL1CLKFreq();
3994             eth1ptp_frequency = eth1ptp_frequency / ic_divider;
3995             break;
3996           case LL_RCC_ICCLKSOURCE_PLL2:
3997             eth1ptp_frequency = HAL_RCCEx_GetPLL2CLKFreq();
3998             eth1ptp_frequency = eth1ptp_frequency / ic_divider;
3999             break;
4000           case LL_RCC_ICCLKSOURCE_PLL3:
4001             eth1ptp_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4002             eth1ptp_frequency = eth1ptp_frequency / ic_divider;
4003             break;
4004           case LL_RCC_ICCLKSOURCE_PLL4:
4005             eth1ptp_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4006             eth1ptp_frequency = eth1ptp_frequency / ic_divider;
4007             break;
4008           default:
4009             /* Unexpected case */
4010             break;
4011         }
4012       }
4013       break;
4014 
4015     case LL_RCC_ETH1PTP_CLKSOURCE_HSE:
4016       if (LL_RCC_HSE_IsReady() != 0U)
4017       {
4018         eth1ptp_frequency = HSE_VALUE;
4019       }
4020       break;
4021 
4022     default:
4023       /* Unexpected case */
4024       break;
4025   }
4026 
4027   return (eth1ptp_frequency / __HAL_RCC_GET_ETH1PTP_DIVIDER());
4028 }
4029 
4030 /**
4031   * @brief  Return FDCAN clock frequency
4032   * @param  FDCANxSource This parameter can be one of the following values:
4033   *         @arg @ref RCCEx_FDCAN_Clock_Source
4034   * @retval FDCAN clock frequency (in Hz)
4035   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
4036   */
RCCEx_GetFDCANCLKFreq(uint32_t FDCANxSource)4037 static uint32_t RCCEx_GetFDCANCLKFreq(uint32_t FDCANxSource)
4038 {
4039   uint32_t fdcan_frequency = RCC_PERIPH_FREQUENCY_NO;
4040   uint32_t ic_divider;
4041 
4042   switch (LL_RCC_GetFDCANClockSource(FDCANxSource))
4043   {
4044     case LL_RCC_FDCAN_CLKSOURCE_PCLK1:
4045       fdcan_frequency = RCCEx_GetPCLK1Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
4046       break;
4047 
4048     case LL_RCC_FDCAN_CLKSOURCE_CLKP:
4049       fdcan_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
4050       break;
4051 
4052     case LL_RCC_FDCAN_CLKSOURCE_IC19:
4053       if (LL_RCC_IC19_IsEnabled() != 0U)
4054       {
4055         ic_divider = LL_RCC_IC19_GetDivider();
4056         switch (LL_RCC_IC19_GetSource())
4057         {
4058           case LL_RCC_ICCLKSOURCE_PLL1:
4059             fdcan_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4060             fdcan_frequency = fdcan_frequency / ic_divider;
4061             break;
4062           case LL_RCC_ICCLKSOURCE_PLL2:
4063             fdcan_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4064             fdcan_frequency = fdcan_frequency / ic_divider;
4065             break;
4066           case LL_RCC_ICCLKSOURCE_PLL3:
4067             fdcan_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4068             fdcan_frequency = fdcan_frequency / ic_divider;
4069             break;
4070           case LL_RCC_ICCLKSOURCE_PLL4:
4071             fdcan_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4072             fdcan_frequency = fdcan_frequency / ic_divider;
4073             break;
4074           default:
4075             /* Unexpected case */
4076             break;
4077         }
4078       }
4079       break;
4080 
4081     case LL_RCC_FDCAN_CLKSOURCE_HSE:
4082       if (LL_RCC_HSE_IsReady() != 0U)
4083       {
4084         fdcan_frequency = HSE_VALUE;
4085       }
4086       break;
4087 
4088     default:
4089       /* Unexpected case */
4090       break;
4091   }
4092 
4093   return fdcan_frequency;
4094 }
4095 
4096 /**
4097   * @brief  Return FMC clock frequency
4098   * @param  FMCxSource This parameter can be one of the following values:
4099   *         @arg @ref RCCEx_FMC_Clock_Source
4100   * @retval FMC clock frequency (in Hz)
4101   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
4102   */
RCCEx_GetFMCCLKFreq(uint32_t FMCxSource)4103 static uint32_t RCCEx_GetFMCCLKFreq(uint32_t FMCxSource)
4104 {
4105   uint32_t fmc_frequency = RCC_PERIPH_FREQUENCY_NO;
4106   uint32_t ic_divider;
4107 
4108   switch (LL_RCC_GetFMCClockSource(FMCxSource))
4109   {
4110     case LL_RCC_FMC_CLKSOURCE_HCLK:
4111       fmc_frequency = RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq());
4112       break;
4113 
4114     case LL_RCC_FMC_CLKSOURCE_CLKP:
4115       fmc_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
4116       break;
4117 
4118     case LL_RCC_FMC_CLKSOURCE_IC3:
4119       if (LL_RCC_IC3_IsEnabled() != 0U)
4120       {
4121         ic_divider = LL_RCC_IC3_GetDivider();
4122         switch (LL_RCC_IC3_GetSource())
4123         {
4124           case LL_RCC_ICCLKSOURCE_PLL1:
4125             fmc_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4126             fmc_frequency = fmc_frequency / ic_divider;
4127             break;
4128           case LL_RCC_ICCLKSOURCE_PLL2:
4129             fmc_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4130             fmc_frequency = fmc_frequency / ic_divider;
4131             break;
4132           case LL_RCC_ICCLKSOURCE_PLL3:
4133             fmc_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4134             fmc_frequency = fmc_frequency / ic_divider;
4135             break;
4136           case LL_RCC_ICCLKSOURCE_PLL4:
4137             fmc_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4138             fmc_frequency = fmc_frequency / ic_divider;
4139             break;
4140           default:
4141             /* Unexpected case */
4142             break;
4143         }
4144       }
4145       break;
4146 
4147     case LL_RCC_FMC_CLKSOURCE_IC4:
4148       if (LL_RCC_IC4_IsEnabled() != 0U)
4149       {
4150         ic_divider = LL_RCC_IC4_GetDivider();
4151         switch (LL_RCC_IC4_GetSource())
4152         {
4153           case LL_RCC_ICCLKSOURCE_PLL1:
4154             fmc_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4155             fmc_frequency = fmc_frequency / ic_divider;
4156             break;
4157           case LL_RCC_ICCLKSOURCE_PLL2:
4158             fmc_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4159             fmc_frequency = fmc_frequency / ic_divider;
4160             break;
4161           case LL_RCC_ICCLKSOURCE_PLL3:
4162             fmc_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4163             fmc_frequency = fmc_frequency / ic_divider;
4164             break;
4165           case LL_RCC_ICCLKSOURCE_PLL4:
4166             fmc_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4167             fmc_frequency = fmc_frequency / ic_divider;
4168             break;
4169           default:
4170             /* Unexpected case */
4171             break;
4172         }
4173       }
4174       break;
4175 
4176     default:
4177       /* Unexpected case */
4178       break;
4179   }
4180 
4181   return fmc_frequency;
4182 }
4183 
4184 /**
4185   * @brief  Return I2Cx clock frequency
4186   * @param  I2CxSource This parameter can be one of the following values:
4187   *         @arg @ref RCCEx_I2C1_Clock_Source
4188   *         @arg @ref RCCEx_I2C2_Clock_Source
4189   *         @arg @ref RCCEx_I2C3_Clock_Source
4190   *         @arg @ref RCCEx_I2C4_Clock_Source
4191   * @retval I2C clock frequency (in Hz)
4192   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
4193   */
RCCEx_GetI2CCLKFreq(uint32_t I2CxSource)4194 static uint32_t RCCEx_GetI2CCLKFreq(uint32_t I2CxSource)
4195 {
4196   uint32_t i2c_frequency = RCC_PERIPH_FREQUENCY_NO;
4197   uint32_t ic_divider;
4198 
4199   switch (LL_RCC_GetI2CClockSource(I2CxSource))
4200   {
4201     case LL_RCC_I2C1_CLKSOURCE_PCLK1:
4202     case LL_RCC_I2C2_CLKSOURCE_PCLK1:
4203     case LL_RCC_I2C3_CLKSOURCE_PCLK1:
4204     case LL_RCC_I2C4_CLKSOURCE_PCLK1:
4205       i2c_frequency = RCCEx_GetPCLK1Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
4206       break;
4207 
4208     case LL_RCC_I2C1_CLKSOURCE_CLKP:
4209     case LL_RCC_I2C2_CLKSOURCE_CLKP:
4210     case LL_RCC_I2C3_CLKSOURCE_CLKP:
4211     case LL_RCC_I2C4_CLKSOURCE_CLKP:
4212       i2c_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
4213       break;
4214 
4215     case LL_RCC_I2C1_CLKSOURCE_IC10:
4216     case LL_RCC_I2C2_CLKSOURCE_IC10:
4217     case LL_RCC_I2C3_CLKSOURCE_IC10:
4218     case LL_RCC_I2C4_CLKSOURCE_IC10:
4219       if (LL_RCC_IC10_IsEnabled() != 0U)
4220       {
4221         ic_divider = LL_RCC_IC10_GetDivider();
4222         switch (LL_RCC_IC10_GetSource())
4223         {
4224           case LL_RCC_ICCLKSOURCE_PLL1:
4225             i2c_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4226             i2c_frequency = i2c_frequency / ic_divider;
4227             break;
4228           case LL_RCC_ICCLKSOURCE_PLL2:
4229             i2c_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4230             i2c_frequency = i2c_frequency / ic_divider;
4231             break;
4232           case LL_RCC_ICCLKSOURCE_PLL3:
4233             i2c_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4234             i2c_frequency = i2c_frequency / ic_divider;
4235             break;
4236           case LL_RCC_ICCLKSOURCE_PLL4:
4237             i2c_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4238             i2c_frequency = i2c_frequency / ic_divider;
4239             break;
4240           default:
4241             /* Unexpected case */
4242             break;
4243         }
4244       }
4245       break;
4246 
4247     case LL_RCC_I2C1_CLKSOURCE_IC15:
4248     case LL_RCC_I2C2_CLKSOURCE_IC15:
4249     case LL_RCC_I2C3_CLKSOURCE_IC15:
4250     case LL_RCC_I2C4_CLKSOURCE_IC15:
4251       if (LL_RCC_IC15_IsEnabled() != 0U)
4252       {
4253         ic_divider = LL_RCC_IC15_GetDivider();
4254         switch (LL_RCC_IC15_GetSource())
4255         {
4256           case LL_RCC_ICCLKSOURCE_PLL1:
4257             i2c_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4258             i2c_frequency = i2c_frequency / ic_divider;
4259             break;
4260           case LL_RCC_ICCLKSOURCE_PLL2:
4261             i2c_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4262             i2c_frequency = i2c_frequency / ic_divider;
4263             break;
4264           case LL_RCC_ICCLKSOURCE_PLL3:
4265             i2c_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4266             i2c_frequency = i2c_frequency / ic_divider;
4267             break;
4268           case LL_RCC_ICCLKSOURCE_PLL4:
4269             i2c_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4270             i2c_frequency = i2c_frequency / ic_divider;
4271             break;
4272           default:
4273             /* Unexpected case */
4274             break;
4275         }
4276       }
4277       break;
4278 
4279     case LL_RCC_I2C1_CLKSOURCE_HSI:
4280     case LL_RCC_I2C2_CLKSOURCE_HSI:
4281     case LL_RCC_I2C3_CLKSOURCE_HSI:
4282     case LL_RCC_I2C4_CLKSOURCE_HSI:
4283       if (LL_RCC_HSI_IsReady() != 0U)
4284       {
4285         i2c_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
4286       }
4287       break;
4288 
4289     case LL_RCC_I2C1_CLKSOURCE_MSI:
4290     case LL_RCC_I2C2_CLKSOURCE_MSI:
4291     case LL_RCC_I2C3_CLKSOURCE_MSI:
4292     case LL_RCC_I2C4_CLKSOURCE_MSI:
4293       if (LL_RCC_MSI_IsReady() != 0U)
4294       {
4295         i2c_frequency = MSI_VALUE;
4296       }
4297       break;
4298 
4299     default:
4300       /* Unexpected case */
4301       break;
4302   }
4303 
4304   return i2c_frequency;
4305 }
4306 
4307 /**
4308   * @brief  Return I3Cx clock frequency
4309   * @param  I3CxSource This parameter can be one of the following values:
4310   *         @arg @ref RCCEx_I3C1_Clock_Source
4311   *         @arg @ref RCCEx_I3C2_Clock_Source
4312   * @retval I3C clock frequency (in Hz)
4313   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
4314   */
RCCEx_GetI3CCLKFreq(uint32_t I3CxSource)4315 static uint32_t RCCEx_GetI3CCLKFreq(uint32_t I3CxSource)
4316 {
4317   uint32_t i3c_frequency = RCC_PERIPH_FREQUENCY_NO;
4318   uint32_t ic_divider;
4319 
4320   switch (LL_RCC_GetI3CClockSource(I3CxSource))
4321   {
4322     case LL_RCC_I3C1_CLKSOURCE_PCLK1:
4323     case LL_RCC_I3C2_CLKSOURCE_PCLK1:
4324       i3c_frequency = RCCEx_GetPCLK1Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
4325       break;
4326 
4327     case LL_RCC_I3C1_CLKSOURCE_CLKP:
4328     case LL_RCC_I3C2_CLKSOURCE_CLKP:
4329       i3c_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
4330       break;
4331 
4332     case LL_RCC_I3C1_CLKSOURCE_IC10:
4333     case LL_RCC_I3C2_CLKSOURCE_IC10:
4334       if (LL_RCC_IC10_IsEnabled() != 0U)
4335       {
4336         ic_divider = LL_RCC_IC10_GetDivider();
4337         switch (LL_RCC_IC10_GetSource())
4338         {
4339           case LL_RCC_ICCLKSOURCE_PLL1:
4340             i3c_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4341             i3c_frequency = i3c_frequency / ic_divider;
4342             break;
4343           case LL_RCC_ICCLKSOURCE_PLL2:
4344             i3c_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4345             i3c_frequency = i3c_frequency / ic_divider;
4346             break;
4347           case LL_RCC_ICCLKSOURCE_PLL3:
4348             i3c_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4349             i3c_frequency = i3c_frequency / ic_divider;
4350             break;
4351           case LL_RCC_ICCLKSOURCE_PLL4:
4352             i3c_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4353             i3c_frequency = i3c_frequency / ic_divider;
4354             break;
4355           default:
4356             /* Unexpected case */
4357             break;
4358         }
4359       }
4360       break;
4361 
4362     case LL_RCC_I3C1_CLKSOURCE_IC15:
4363     case LL_RCC_I3C2_CLKSOURCE_IC15:
4364       if (LL_RCC_IC15_IsEnabled() != 0U)
4365       {
4366         ic_divider = LL_RCC_IC15_GetDivider();
4367         switch (LL_RCC_IC15_GetSource())
4368         {
4369           case LL_RCC_ICCLKSOURCE_PLL1:
4370             i3c_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4371             i3c_frequency = i3c_frequency / ic_divider;
4372             break;
4373           case LL_RCC_ICCLKSOURCE_PLL2:
4374             i3c_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4375             i3c_frequency = i3c_frequency / ic_divider;
4376             break;
4377           case LL_RCC_ICCLKSOURCE_PLL3:
4378             i3c_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4379             i3c_frequency = i3c_frequency / ic_divider;
4380             break;
4381           case LL_RCC_ICCLKSOURCE_PLL4:
4382             i3c_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4383             i3c_frequency = i3c_frequency / ic_divider;
4384             break;
4385           default:
4386             /* Unexpected case */
4387             break;
4388         }
4389       }
4390       break;
4391 
4392     case LL_RCC_I3C1_CLKSOURCE_HSI:
4393     case LL_RCC_I3C2_CLKSOURCE_HSI:
4394       if (LL_RCC_HSI_IsReady() != 0U)
4395       {
4396         i3c_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
4397       }
4398       break;
4399 
4400     case LL_RCC_I3C1_CLKSOURCE_MSI:
4401     case LL_RCC_I3C2_CLKSOURCE_MSI:
4402       if (LL_RCC_MSI_IsReady() != 0U)
4403       {
4404         i3c_frequency = MSI_VALUE;
4405       }
4406       break;
4407 
4408     default:
4409       /* Unexpected case */
4410       break;
4411   }
4412 
4413   return i3c_frequency;
4414 }
4415 
4416 /**
4417   * @brief  Return LPTIMx clock frequency
4418   * @param  LPTIMxSource This parameter can be one of the following values:
4419   *         @arg @ref RCCEx_LPTIM1_Clock_Source
4420   *         @arg @ref RCCEx_LPTIM2_Clock_Source
4421   *         @arg @ref RCCEx_LPTIM3_Clock_Source
4422   *         @arg @ref RCCEx_LPTIM4_Clock_Source
4423   *         @arg @ref RCCEx_LPTIM5_Clock_Source
4424   * @retval LPTIM clock frequency (in Hz)
4425   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
4426   */
RCCEx_GetLPTIMCLKFreq(uint32_t LPTIMxSource)4427 static uint32_t RCCEx_GetLPTIMCLKFreq(uint32_t LPTIMxSource)
4428 {
4429   uint32_t lptim_frequency = RCC_PERIPH_FREQUENCY_NO;
4430   uint32_t ic_divider;
4431 
4432   switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
4433   {
4434     case LL_RCC_LPTIM1_CLKSOURCE_PCLK1:
4435       lptim_frequency = RCCEx_GetPCLK1Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
4436       break;
4437 
4438     case LL_RCC_LPTIM2_CLKSOURCE_PCLK4:
4439     case LL_RCC_LPTIM3_CLKSOURCE_PCLK4:
4440     case LL_RCC_LPTIM4_CLKSOURCE_PCLK4:
4441     case LL_RCC_LPTIM5_CLKSOURCE_PCLK4:
4442       lptim_frequency = RCCEx_GetPCLK4Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
4443       break;
4444 
4445     case LL_RCC_LPTIM1_CLKSOURCE_CLKP:
4446     case LL_RCC_LPTIM2_CLKSOURCE_CLKP:
4447     case LL_RCC_LPTIM3_CLKSOURCE_CLKP:
4448     case LL_RCC_LPTIM4_CLKSOURCE_CLKP:
4449     case LL_RCC_LPTIM5_CLKSOURCE_CLKP:
4450       lptim_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
4451       break;
4452 
4453     case LL_RCC_LPTIM1_CLKSOURCE_IC15:
4454     case LL_RCC_LPTIM2_CLKSOURCE_IC15:
4455     case LL_RCC_LPTIM3_CLKSOURCE_IC15:
4456     case LL_RCC_LPTIM4_CLKSOURCE_IC15:
4457     case LL_RCC_LPTIM5_CLKSOURCE_IC15:
4458       if (LL_RCC_IC15_IsEnabled() != 0U)
4459       {
4460         ic_divider = LL_RCC_IC15_GetDivider();
4461         switch (LL_RCC_IC15_GetSource())
4462         {
4463           case LL_RCC_ICCLKSOURCE_PLL1:
4464             lptim_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4465             lptim_frequency = lptim_frequency / ic_divider;
4466             break;
4467           case LL_RCC_ICCLKSOURCE_PLL2:
4468             lptim_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4469             lptim_frequency = lptim_frequency / ic_divider;
4470             break;
4471           case LL_RCC_ICCLKSOURCE_PLL3:
4472             lptim_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4473             lptim_frequency = lptim_frequency / ic_divider;
4474             break;
4475           case LL_RCC_ICCLKSOURCE_PLL4:
4476             lptim_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4477             lptim_frequency = lptim_frequency / ic_divider;
4478             break;
4479           default:
4480             /* Unexpected case */
4481             break;
4482         }
4483       }
4484       break;
4485 
4486     case LL_RCC_LPTIM1_CLKSOURCE_LSE:
4487     case LL_RCC_LPTIM2_CLKSOURCE_LSE:
4488     case LL_RCC_LPTIM3_CLKSOURCE_LSE:
4489     case LL_RCC_LPTIM4_CLKSOURCE_LSE:
4490     case LL_RCC_LPTIM5_CLKSOURCE_LSE:
4491       if (LL_RCC_LSE_IsReady() != 0U)
4492       {
4493         lptim_frequency = LSE_VALUE;
4494       }
4495       break;
4496 
4497     case LL_RCC_LPTIM1_CLKSOURCE_LSI:
4498     case LL_RCC_LPTIM2_CLKSOURCE_LSI:
4499     case LL_RCC_LPTIM3_CLKSOURCE_LSI:
4500     case LL_RCC_LPTIM4_CLKSOURCE_LSI:
4501     case LL_RCC_LPTIM5_CLKSOURCE_LSI:
4502       if (LL_RCC_LSI_IsReady() != 0U)
4503       {
4504         lptim_frequency = LSI_VALUE;
4505       }
4506       break;
4507 
4508     case LL_RCC_LPTIM1_CLKSOURCE_TIMG:
4509     case LL_RCC_LPTIM2_CLKSOURCE_TIMG:
4510     case LL_RCC_LPTIM3_CLKSOURCE_TIMG:
4511     case LL_RCC_LPTIM4_CLKSOURCE_TIMG:
4512     case LL_RCC_LPTIM5_CLKSOURCE_TIMG:
4513       lptim_frequency = HAL_RCC_GetSysClockFreq() / (1UL << LL_RCC_GetTIMPrescaler());
4514       break;
4515 
4516     default:
4517       /* Unexpected case */
4518       break;
4519   }
4520 
4521   return lptim_frequency;
4522 }
4523 
4524 /**
4525   * @brief  Return LPUART clock frequency
4526   * @param  LPUARTxSource This parameter can be one of the following values:
4527   *         @arg @ref RCCEx_LPUART1_Clock_Source
4528   * @retval LPUART clock frequency (in Hz)
4529   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
4530   */
RCCEx_GetLPUARTCLKFreq(uint32_t LPUARTxSource)4531 static uint32_t RCCEx_GetLPUARTCLKFreq(uint32_t LPUARTxSource)
4532 {
4533   uint32_t lpuart_frequency = RCC_PERIPH_FREQUENCY_NO;
4534   uint32_t ic_divider;
4535 
4536   switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource))
4537   {
4538     case LL_RCC_LPUART1_CLKSOURCE_PCLK4:
4539       lpuart_frequency = RCCEx_GetPCLK4Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
4540       break;
4541 
4542     case LL_RCC_LPUART1_CLKSOURCE_CLKP:
4543       lpuart_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
4544       break;
4545 
4546     case LL_RCC_LPUART1_CLKSOURCE_IC9:
4547       if (LL_RCC_IC9_IsEnabled() != 0U)
4548       {
4549         ic_divider = LL_RCC_IC9_GetDivider();
4550         switch (LL_RCC_IC9_GetSource())
4551         {
4552           case LL_RCC_ICCLKSOURCE_PLL1:
4553             lpuart_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4554             lpuart_frequency = lpuart_frequency / ic_divider;
4555             break;
4556           case LL_RCC_ICCLKSOURCE_PLL2:
4557             lpuart_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4558             lpuart_frequency = lpuart_frequency / ic_divider;
4559             break;
4560           case LL_RCC_ICCLKSOURCE_PLL3:
4561             lpuart_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4562             lpuart_frequency = lpuart_frequency / ic_divider;
4563             break;
4564           case LL_RCC_ICCLKSOURCE_PLL4:
4565             lpuart_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4566             lpuart_frequency = lpuart_frequency / ic_divider;
4567             break;
4568           default:
4569             /* Unexpected case */
4570             break;
4571         }
4572       }
4573       break;
4574 
4575     case LL_RCC_LPUART1_CLKSOURCE_IC14:
4576       if (LL_RCC_IC14_IsEnabled() != 0U)
4577       {
4578         ic_divider = LL_RCC_IC14_GetDivider();
4579         switch (LL_RCC_IC14_GetSource())
4580         {
4581           case LL_RCC_ICCLKSOURCE_PLL1:
4582             lpuart_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4583             lpuart_frequency = lpuart_frequency / ic_divider;
4584             break;
4585           case LL_RCC_ICCLKSOURCE_PLL2:
4586             lpuart_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4587             lpuart_frequency = lpuart_frequency / ic_divider;
4588             break;
4589           case LL_RCC_ICCLKSOURCE_PLL3:
4590             lpuart_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4591             lpuart_frequency = lpuart_frequency / ic_divider;
4592             break;
4593           case LL_RCC_ICCLKSOURCE_PLL4:
4594             lpuart_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4595             lpuart_frequency = lpuart_frequency / ic_divider;
4596             break;
4597           default:
4598             /* Unexpected case */
4599             break;
4600         }
4601       }
4602       break;
4603 
4604     case LL_RCC_LPUART1_CLKSOURCE_HSI:
4605       if (LL_RCC_HSI_IsReady() != 0U)
4606       {
4607         lpuart_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
4608       }
4609       break;
4610 
4611     case LL_RCC_LPUART1_CLKSOURCE_MSI:
4612       if (LL_RCC_MSI_IsReady() != 0U)
4613       {
4614         lpuart_frequency = MSI_VALUE;
4615       }
4616       break;
4617 
4618     case LL_RCC_LPUART1_CLKSOURCE_LSE:
4619       if (LL_RCC_LSE_IsReady() != 0U)
4620       {
4621         lpuart_frequency = LSE_VALUE;
4622       }
4623       break;
4624 
4625     default:
4626       /* Unexpected case */
4627       break;
4628   }
4629 
4630   return lpuart_frequency;
4631 }
4632 
4633 /**
4634   * @brief  Return LTDC clock frequency
4635   * @param  LTDCxSource This parameter can be one of the following values:
4636   *         @arg @ref RCCEx_LTDC_Clock_Source
4637   * @retval LTDC clock frequency (in Hz)
4638   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
4639   */
RCCEx_GetLTDCCLKFreq(uint32_t LTDCxSource)4640 static uint32_t RCCEx_GetLTDCCLKFreq(uint32_t LTDCxSource)
4641 {
4642   uint32_t ltdc_frequency = RCC_PERIPH_FREQUENCY_NO;
4643   uint32_t ic_divider;
4644 
4645   switch (LL_RCC_GetLTDCClockSource(LTDCxSource))
4646   {
4647     case LL_RCC_LTDC_CLKSOURCE_PCLK5:
4648       ltdc_frequency = RCCEx_GetPCLK5Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
4649       break;
4650 
4651     case LL_RCC_LTDC_CLKSOURCE_CLKP:
4652       ltdc_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
4653       break;
4654 
4655     case LL_RCC_LTDC_CLKSOURCE_IC16:
4656       if (LL_RCC_IC16_IsEnabled() != 0U)
4657       {
4658         ic_divider = LL_RCC_IC16_GetDivider();
4659         switch (LL_RCC_IC16_GetSource())
4660         {
4661           case LL_RCC_ICCLKSOURCE_PLL1:
4662             ltdc_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4663             ltdc_frequency = ltdc_frequency / ic_divider;
4664             break;
4665           case LL_RCC_ICCLKSOURCE_PLL2:
4666             ltdc_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4667             ltdc_frequency = ltdc_frequency / ic_divider;
4668             break;
4669           case LL_RCC_ICCLKSOURCE_PLL3:
4670             ltdc_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4671             ltdc_frequency = ltdc_frequency / ic_divider;
4672             break;
4673           case LL_RCC_ICCLKSOURCE_PLL4:
4674             ltdc_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4675             ltdc_frequency = ltdc_frequency / ic_divider;
4676             break;
4677           default:
4678             /* Unexpected case */
4679             break;
4680         }
4681       }
4682       break;
4683 
4684     case LL_RCC_LTDC_CLKSOURCE_HSI:
4685       if (LL_RCC_HSI_IsReady() != 0U)
4686       {
4687         ltdc_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
4688       }
4689       break;
4690 
4691     default:
4692       /* Unexpected case */
4693       break;
4694   }
4695 
4696   return ltdc_frequency;
4697 }
4698 
4699 /**
4700   * @brief  Return MDFx clock frequency
4701   * @param  MDFxSource This parameter can be one of the following values:
4702   *         @arg @ref RCCEx_MDF1_Clock_Source
4703   * @retval MDF clock frequency (in Hz)
4704   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
4705   */
RCCEx_GetMDFCLKFreq(uint32_t MDFxSource)4706 static uint32_t RCCEx_GetMDFCLKFreq(uint32_t MDFxSource)
4707 {
4708   uint32_t adf_frequency = RCC_PERIPH_FREQUENCY_NO;
4709   uint32_t ic_divider;
4710 
4711   switch (LL_RCC_GetMDFClockSource(MDFxSource))
4712   {
4713     case LL_RCC_MDF1_CLKSOURCE_HCLK:
4714       adf_frequency = RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq());
4715       break;
4716 
4717     case LL_RCC_MDF1_CLKSOURCE_CLKP:
4718       adf_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
4719       break;
4720 
4721     case LL_RCC_MDF1_CLKSOURCE_IC7:
4722       if (LL_RCC_IC7_IsEnabled() != 0U)
4723       {
4724         ic_divider = LL_RCC_IC7_GetDivider();
4725         switch (LL_RCC_IC7_GetSource())
4726         {
4727           case LL_RCC_ICCLKSOURCE_PLL1:
4728             adf_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4729             adf_frequency = adf_frequency / ic_divider;
4730             break;
4731           case LL_RCC_ICCLKSOURCE_PLL2:
4732             adf_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4733             adf_frequency = adf_frequency / ic_divider;
4734             break;
4735           case LL_RCC_ICCLKSOURCE_PLL3:
4736             adf_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4737             adf_frequency = adf_frequency / ic_divider;
4738             break;
4739           case LL_RCC_ICCLKSOURCE_PLL4:
4740             adf_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4741             adf_frequency = adf_frequency / ic_divider;
4742             break;
4743           default:
4744             /* Unexpected case */
4745             break;
4746         }
4747       }
4748       break;
4749 
4750     case LL_RCC_MDF1_CLKSOURCE_IC8:
4751       if (LL_RCC_IC8_IsEnabled() != 0U)
4752       {
4753         ic_divider = LL_RCC_IC8_GetDivider();
4754         switch (LL_RCC_IC8_GetSource())
4755         {
4756           case LL_RCC_ICCLKSOURCE_PLL1:
4757             adf_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4758             adf_frequency = adf_frequency / ic_divider;
4759             break;
4760           case LL_RCC_ICCLKSOURCE_PLL2:
4761             adf_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4762             adf_frequency = adf_frequency / ic_divider;
4763             break;
4764           case LL_RCC_ICCLKSOURCE_PLL3:
4765             adf_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4766             adf_frequency = adf_frequency / ic_divider;
4767             break;
4768           case LL_RCC_ICCLKSOURCE_PLL4:
4769             adf_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4770             adf_frequency = adf_frequency / ic_divider;
4771             break;
4772           default:
4773             /* Unexpected case */
4774             break;
4775         }
4776       }
4777       break;
4778 
4779     case LL_RCC_MDF1_CLKSOURCE_HSI:
4780       if (LL_RCC_HSI_IsReady() != 0U)
4781       {
4782         adf_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
4783       }
4784       break;
4785 
4786     case LL_RCC_MDF1_CLKSOURCE_MSI:
4787       if (LL_RCC_MSI_IsReady() != 0U)
4788       {
4789         adf_frequency = MSI_VALUE;
4790       }
4791       break;
4792 
4793     case LL_RCC_MDF1_CLKSOURCE_I2S_CKIN:
4794       adf_frequency = EXTERNAL_CLOCK_VALUE;
4795       break;
4796 
4797     case LL_RCC_MDF1_CLKSOURCE_TIMG:
4798       adf_frequency = HAL_RCC_GetSysClockFreq() / (1UL << LL_RCC_GetTIMPrescaler());
4799       break;
4800 
4801     default:
4802       /* Unexpected case */
4803       break;
4804   }
4805 
4806   return adf_frequency;
4807 }
4808 
4809 /**
4810   * @brief  Return PSSI clock frequency
4811   * @param  PSSIxSource This parameter can be one of the following values:
4812   *         @arg @ref RCCEx_PSSI_Clock_Source
4813   * @retval PSSI clock frequency (in Hz)
4814   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
4815   */
RCCEx_GetPSSICLKFreq(uint32_t PSSIxSource)4816 static uint32_t RCCEx_GetPSSICLKFreq(uint32_t PSSIxSource)
4817 {
4818   uint32_t pssi_frequency = RCC_PERIPH_FREQUENCY_NO;
4819   uint32_t ic_divider;
4820 
4821   switch (LL_RCC_GetPSSIClockSource(PSSIxSource))
4822   {
4823     case LL_RCC_PSSI_CLKSOURCE_HCLK:
4824       pssi_frequency = RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq());
4825       break;
4826 
4827     case LL_RCC_PSSI_CLKSOURCE_CLKP:
4828       pssi_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
4829       break;
4830 
4831     case LL_RCC_PSSI_CLKSOURCE_IC20:
4832       if (LL_RCC_IC20_IsEnabled() != 0U)
4833       {
4834         ic_divider = LL_RCC_IC20_GetDivider();
4835         switch (LL_RCC_IC20_GetSource())
4836         {
4837           case LL_RCC_ICCLKSOURCE_PLL1:
4838             pssi_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4839             pssi_frequency = pssi_frequency / ic_divider;
4840             break;
4841           case LL_RCC_ICCLKSOURCE_PLL2:
4842             pssi_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4843             pssi_frequency = pssi_frequency / ic_divider;
4844             break;
4845           case LL_RCC_ICCLKSOURCE_PLL3:
4846             pssi_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4847             pssi_frequency = pssi_frequency / ic_divider;
4848             break;
4849           case LL_RCC_ICCLKSOURCE_PLL4:
4850             pssi_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4851             pssi_frequency = pssi_frequency / ic_divider;
4852             break;
4853           default:
4854             /* Unexpected case */
4855             break;
4856         }
4857       }
4858       break;
4859 
4860     case LL_RCC_PSSI_CLKSOURCE_HSI:
4861       if (LL_RCC_HSI_IsReady() != 0U)
4862       {
4863         pssi_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
4864       }
4865       break;
4866 
4867     default:
4868       /* Unexpected case */
4869       break;
4870   }
4871 
4872   return pssi_frequency;
4873 }
4874 
4875 /**
4876   * @brief  Return RTC clock frequency
4877   * @retval RTC clock frequency (in Hz)
4878   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
4879   */
RCCEx_GetRTCCLKFreq()4880 static uint32_t RCCEx_GetRTCCLKFreq()
4881 {
4882   uint32_t rtc_frequency = RCC_PERIPH_FREQUENCY_NO;
4883 
4884   switch (LL_RCC_GetRTCClockSource())
4885   {
4886     case LL_RCC_RTC_CLKSOURCE_NONE:
4887       /* Nothing to do */
4888       break;
4889 
4890     case LL_RCC_RTC_CLKSOURCE_LSE:
4891       if (LL_RCC_LSE_IsReady() != 0U)
4892       {
4893         rtc_frequency = LSE_VALUE;
4894       }
4895       break;
4896 
4897     case LL_RCC_RTC_CLKSOURCE_LSI:
4898       if (LL_RCC_LSI_IsReady() != 0U)
4899       {
4900         rtc_frequency = LSI_VALUE;
4901       }
4902       break;
4903 
4904     case LL_RCC_RTC_CLKSOURCE_HSE:
4905       if (LL_RCC_HSE_IsReady() != 0U)
4906       {
4907         uint32_t prescaler = (READ_BIT(RCC->CCIPR7, RCC_CCIPR7_RTCPRE) >> RCC_CCIPR7_RTCPRE_Pos) + 1U;
4908         rtc_frequency = HSE_VALUE / prescaler;
4909       }
4910       break;
4911 
4912     default:
4913       /* Unexpected case */
4914       break;
4915   }
4916 
4917   return rtc_frequency;
4918 }
4919 
4920 /**
4921   * @brief  Return SAIx clock frequency
4922   * @param  SAIxSource This parameter can be one of the following values:
4923   *         @arg @ref RCCEx_SAI1_Clock_Source
4924   *         @arg @ref RCCEx_SAI2_Clock_Source
4925   * @retval SAI clock frequency (in Hz)
4926   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
4927   */
RCCEx_GetSAICLKFreq(uint32_t SAIxSource)4928 static uint32_t RCCEx_GetSAICLKFreq(uint32_t SAIxSource)
4929 {
4930   uint32_t sai_frequency = RCC_PERIPH_FREQUENCY_NO;
4931   uint32_t ic_divider;
4932 
4933   switch (LL_RCC_GetSAIClockSource(SAIxSource))
4934   {
4935     case LL_RCC_SAI1_CLKSOURCE_PCLK2:
4936     case LL_RCC_SAI2_CLKSOURCE_PCLK2:
4937       sai_frequency = RCCEx_GetPCLK2Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
4938       break;
4939 
4940     case LL_RCC_SAI1_CLKSOURCE_CLKP:
4941     case LL_RCC_SAI2_CLKSOURCE_CLKP:
4942       sai_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
4943       break;
4944 
4945     case LL_RCC_SAI1_CLKSOURCE_IC7:
4946     case LL_RCC_SAI2_CLKSOURCE_IC7:
4947       if (LL_RCC_IC7_IsEnabled() != 0U)
4948       {
4949         ic_divider = LL_RCC_IC7_GetDivider();
4950         switch (LL_RCC_IC7_GetSource())
4951         {
4952           case LL_RCC_ICCLKSOURCE_PLL1:
4953             sai_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4954             sai_frequency = sai_frequency / ic_divider;
4955             break;
4956           case LL_RCC_ICCLKSOURCE_PLL2:
4957             sai_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4958             sai_frequency = sai_frequency / ic_divider;
4959             break;
4960           case LL_RCC_ICCLKSOURCE_PLL3:
4961             sai_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4962             sai_frequency = sai_frequency / ic_divider;
4963             break;
4964           case LL_RCC_ICCLKSOURCE_PLL4:
4965             sai_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4966             sai_frequency = sai_frequency / ic_divider;
4967             break;
4968           default:
4969             /* Unexpected case */
4970             break;
4971         }
4972       }
4973       break;
4974 
4975     case LL_RCC_SAI1_CLKSOURCE_IC8:
4976     case LL_RCC_SAI2_CLKSOURCE_IC8:
4977       if (LL_RCC_IC8_IsEnabled() != 0U)
4978       {
4979         ic_divider = LL_RCC_IC8_GetDivider();
4980         switch (LL_RCC_IC8_GetSource())
4981         {
4982           case LL_RCC_ICCLKSOURCE_PLL1:
4983             sai_frequency = HAL_RCCEx_GetPLL1CLKFreq();
4984             sai_frequency = sai_frequency / ic_divider;
4985             break;
4986           case LL_RCC_ICCLKSOURCE_PLL2:
4987             sai_frequency = HAL_RCCEx_GetPLL2CLKFreq();
4988             sai_frequency = sai_frequency / ic_divider;
4989             break;
4990           case LL_RCC_ICCLKSOURCE_PLL3:
4991             sai_frequency = HAL_RCCEx_GetPLL3CLKFreq();
4992             sai_frequency = sai_frequency / ic_divider;
4993             break;
4994           case LL_RCC_ICCLKSOURCE_PLL4:
4995             sai_frequency = HAL_RCCEx_GetPLL4CLKFreq();
4996             sai_frequency = sai_frequency / ic_divider;
4997             break;
4998           default:
4999             /* Unexpected case */
5000             break;
5001         }
5002       }
5003       break;
5004 
5005     case LL_RCC_SAI1_CLKSOURCE_HSI:
5006     case LL_RCC_SAI2_CLKSOURCE_HSI:
5007       if (LL_RCC_HSI_IsReady() != 0U)
5008       {
5009         sai_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
5010       }
5011       break;
5012 
5013     case LL_RCC_SAI1_CLKSOURCE_MSI:
5014     case LL_RCC_SAI2_CLKSOURCE_MSI:
5015       if (LL_RCC_MSI_IsReady() != 0U)
5016       {
5017         sai_frequency = MSI_VALUE;
5018       }
5019       break;
5020 
5021     case LL_RCC_SAI1_CLKSOURCE_I2S_CKIN:
5022     case LL_RCC_SAI2_CLKSOURCE_I2S_CKIN:
5023       sai_frequency = EXTERNAL_CLOCK_VALUE;
5024       break;
5025 
5026     case LL_RCC_SAI1_CLKSOURCE_SPDIFRX1:
5027     case LL_RCC_SAI2_CLKSOURCE_SPDIFRX1:
5028       sai_frequency = RCCEx_GetSPDIFRXCLKFreq(LL_RCC_SPDIFRX1_CLKSOURCE);
5029       break;
5030 
5031     default:
5032       /* Unexpected case */
5033       break;
5034   }
5035 
5036   return sai_frequency;
5037 }
5038 
5039 /**
5040   * @brief  Return SDMMC clock frequency
5041   * @param  SDMMCxSource This parameter can be one of the following values:
5042   *         @arg @ref RCCEx_SDMMC1_Clock_Source
5043   *         @arg @ref RCCEx_SDMMC2_Clock_Source
5044   * @retval SDMMC clock frequency (in Hz)
5045   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
5046   */
RCCEx_GetSDMMCCLKFreq(uint32_t SDMMCxSource)5047 static uint32_t RCCEx_GetSDMMCCLKFreq(uint32_t SDMMCxSource)
5048 {
5049   uint32_t sdmmc_frequency = RCC_PERIPH_FREQUENCY_NO;
5050   uint32_t ic_divider;
5051 
5052   switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
5053   {
5054     case LL_RCC_SDMMC1_CLKSOURCE_HCLK:
5055     case LL_RCC_SDMMC2_CLKSOURCE_HCLK:
5056       sdmmc_frequency = RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq());
5057       break;
5058 
5059     case LL_RCC_SDMMC1_CLKSOURCE_CLKP:
5060     case LL_RCC_SDMMC2_CLKSOURCE_CLKP:
5061       sdmmc_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
5062       break;
5063 
5064     case LL_RCC_SDMMC1_CLKSOURCE_IC4:
5065     case LL_RCC_SDMMC2_CLKSOURCE_IC4:
5066       if (LL_RCC_IC4_IsEnabled() != 0U)
5067       {
5068         ic_divider = LL_RCC_IC4_GetDivider();
5069         switch (LL_RCC_IC4_GetSource())
5070         {
5071           case LL_RCC_ICCLKSOURCE_PLL1:
5072             sdmmc_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5073             sdmmc_frequency = sdmmc_frequency / ic_divider;
5074             break;
5075           case LL_RCC_ICCLKSOURCE_PLL2:
5076             sdmmc_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5077             sdmmc_frequency = sdmmc_frequency / ic_divider;
5078             break;
5079           case LL_RCC_ICCLKSOURCE_PLL3:
5080             sdmmc_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5081             sdmmc_frequency = sdmmc_frequency / ic_divider;
5082             break;
5083           case LL_RCC_ICCLKSOURCE_PLL4:
5084             sdmmc_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5085             sdmmc_frequency = sdmmc_frequency / ic_divider;
5086             break;
5087           default:
5088             /* Unexpected case */
5089             break;
5090         }
5091       }
5092       break;
5093 
5094     case LL_RCC_SDMMC1_CLKSOURCE_IC5:
5095     case LL_RCC_SDMMC2_CLKSOURCE_IC5:
5096       if (LL_RCC_IC5_IsEnabled() != 0U)
5097       {
5098         ic_divider = LL_RCC_IC5_GetDivider();
5099         switch (LL_RCC_IC5_GetSource())
5100         {
5101           case LL_RCC_ICCLKSOURCE_PLL1:
5102             sdmmc_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5103             sdmmc_frequency = sdmmc_frequency / ic_divider;
5104             break;
5105           case LL_RCC_ICCLKSOURCE_PLL2:
5106             sdmmc_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5107             sdmmc_frequency = sdmmc_frequency / ic_divider;
5108             break;
5109           case LL_RCC_ICCLKSOURCE_PLL3:
5110             sdmmc_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5111             sdmmc_frequency = sdmmc_frequency / ic_divider;
5112             break;
5113           case LL_RCC_ICCLKSOURCE_PLL4:
5114             sdmmc_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5115             sdmmc_frequency = sdmmc_frequency / ic_divider;
5116             break;
5117           default:
5118             /* Unexpected case */
5119             break;
5120         }
5121       }
5122       break;
5123 
5124     default:
5125       /* Unexpected case */
5126       break;
5127   }
5128 
5129   return sdmmc_frequency;
5130 }
5131 
5132 /**
5133   * @brief  Return SPDIFRX clock frequency
5134   * @param  SPDIFRXxSource This parameter can be one of the following values:
5135   *         @arg @ref RCCEx_SPDIFRX1_Clock_Source
5136   * @retval SPDIF clock frequency (in Hz)
5137   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
5138   */
RCCEx_GetSPDIFRXCLKFreq(uint32_t SPDIFRXxSource)5139 static uint32_t RCCEx_GetSPDIFRXCLKFreq(uint32_t SPDIFRXxSource)
5140 {
5141   uint32_t spdifrx_frequency = RCC_PERIPH_FREQUENCY_NO;
5142   uint32_t ic_divider;
5143 
5144   switch (LL_RCC_GetSPDIFRXClockSource(SPDIFRXxSource))
5145   {
5146     case LL_RCC_SPDIFRX1_CLKSOURCE_PCLK1:
5147       spdifrx_frequency = RCCEx_GetPCLK1Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
5148       break;
5149 
5150     case LL_RCC_SPDIFRX1_CLKSOURCE_CLKP:
5151       spdifrx_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
5152       break;
5153 
5154     case LL_RCC_SPDIFRX1_CLKSOURCE_IC7:
5155       if (LL_RCC_IC7_IsEnabled() != 0U)
5156       {
5157         ic_divider = LL_RCC_IC7_GetDivider();
5158         switch (LL_RCC_IC7_GetSource())
5159         {
5160           case LL_RCC_ICCLKSOURCE_PLL1:
5161             spdifrx_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5162             spdifrx_frequency = spdifrx_frequency / ic_divider;
5163             break;
5164           case LL_RCC_ICCLKSOURCE_PLL2:
5165             spdifrx_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5166             spdifrx_frequency = spdifrx_frequency / ic_divider;
5167             break;
5168           case LL_RCC_ICCLKSOURCE_PLL3:
5169             spdifrx_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5170             spdifrx_frequency = spdifrx_frequency / ic_divider;
5171             break;
5172           case LL_RCC_ICCLKSOURCE_PLL4:
5173             spdifrx_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5174             spdifrx_frequency = spdifrx_frequency / ic_divider;
5175             break;
5176           default:
5177             /* Unexpected case */
5178             break;
5179         }
5180       }
5181       break;
5182 
5183     case LL_RCC_SPDIFRX1_CLKSOURCE_IC8:
5184       if (LL_RCC_IC8_IsEnabled() != 0U)
5185       {
5186         ic_divider = LL_RCC_IC8_GetDivider();
5187         switch (LL_RCC_IC8_GetSource())
5188         {
5189           case LL_RCC_ICCLKSOURCE_PLL1:
5190             spdifrx_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5191             spdifrx_frequency = spdifrx_frequency / ic_divider;
5192             break;
5193           case LL_RCC_ICCLKSOURCE_PLL2:
5194             spdifrx_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5195             spdifrx_frequency = spdifrx_frequency / ic_divider;
5196             break;
5197           case LL_RCC_ICCLKSOURCE_PLL3:
5198             spdifrx_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5199             spdifrx_frequency = spdifrx_frequency / ic_divider;
5200             break;
5201           case LL_RCC_ICCLKSOURCE_PLL4:
5202             spdifrx_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5203             spdifrx_frequency = spdifrx_frequency / ic_divider;
5204             break;
5205           default:
5206             /* Unexpected case */
5207             break;
5208         }
5209       }
5210       break;
5211 
5212     case LL_RCC_SPDIFRX1_CLKSOURCE_HSI:
5213       if (LL_RCC_HSI_IsReady() != 0U)
5214       {
5215         spdifrx_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
5216       }
5217       break;
5218 
5219     case LL_RCC_SPDIFRX1_CLKSOURCE_MSI:
5220       if (LL_RCC_MSI_IsReady() != 0U)
5221       {
5222         spdifrx_frequency = MSI_VALUE;
5223       }
5224       break;
5225 
5226     case LL_RCC_SPDIFRX1_CLKSOURCE_I2S_CKIN:
5227       spdifrx_frequency = EXTERNAL_CLOCK_VALUE;
5228       break;
5229 
5230     default:
5231       /* Unexpected case */
5232       break;
5233   }
5234 
5235   return spdifrx_frequency;
5236 }
5237 
5238 /**
5239   * @brief  Return SPIx clock frequency
5240   * @param  SPIxSource This parameter can be one of the following values:
5241   *         @arg @ref RCCEx_SPI1_Clock_Source
5242   *         @arg @ref RCCEx_SPI2_Clock_Source
5243   *         @arg @ref RCCEx_SPI3_Clock_Source
5244   *         @arg @ref RCCEx_SPI4_Clock_Source
5245   *         @arg @ref RCCEx_SPI5_Clock_Source
5246   *         @arg @ref RCCEx_SPI6_Clock_Source
5247   * @retval SPI clock frequency (in Hz)
5248   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
5249   */
RCCEx_GetSPICLKFreq(uint32_t SPIxSource)5250 static uint32_t RCCEx_GetSPICLKFreq(uint32_t SPIxSource)
5251 {
5252   uint32_t spi_frequency = RCC_PERIPH_FREQUENCY_NO;
5253   uint32_t ic_divider;
5254 
5255   switch (LL_RCC_GetSPIClockSource(SPIxSource))
5256   {
5257     case LL_RCC_SPI2_CLKSOURCE_PCLK1:
5258     case LL_RCC_SPI3_CLKSOURCE_PCLK1:
5259       spi_frequency = RCCEx_GetPCLK1Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
5260       break;
5261 
5262     case LL_RCC_SPI1_CLKSOURCE_PCLK2:
5263     case LL_RCC_SPI4_CLKSOURCE_PCLK2:
5264     case LL_RCC_SPI5_CLKSOURCE_PCLK2:
5265       spi_frequency = RCCEx_GetPCLK2Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
5266       break;
5267 
5268     case LL_RCC_SPI6_CLKSOURCE_PCLK4:
5269       spi_frequency = RCCEx_GetPCLK4Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
5270       break;
5271 
5272     case LL_RCC_SPI1_CLKSOURCE_CLKP:
5273     case LL_RCC_SPI2_CLKSOURCE_CLKP:
5274     case LL_RCC_SPI3_CLKSOURCE_CLKP:
5275     case LL_RCC_SPI4_CLKSOURCE_CLKP:
5276     case LL_RCC_SPI5_CLKSOURCE_CLKP:
5277     case LL_RCC_SPI6_CLKSOURCE_CLKP:
5278       spi_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
5279       break;
5280 
5281     case LL_RCC_SPI1_CLKSOURCE_IC8:
5282     case LL_RCC_SPI2_CLKSOURCE_IC8:
5283     case LL_RCC_SPI3_CLKSOURCE_IC8:
5284     case LL_RCC_SPI6_CLKSOURCE_IC8:
5285       if (LL_RCC_IC8_IsEnabled() != 0U)
5286       {
5287         ic_divider = LL_RCC_IC8_GetDivider();
5288         switch (LL_RCC_IC8_GetSource())
5289         {
5290           case LL_RCC_ICCLKSOURCE_PLL1:
5291             spi_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5292             spi_frequency = spi_frequency / ic_divider;
5293             break;
5294           case LL_RCC_ICCLKSOURCE_PLL2:
5295             spi_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5296             spi_frequency = spi_frequency / ic_divider;
5297             break;
5298           case LL_RCC_ICCLKSOURCE_PLL3:
5299             spi_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5300             spi_frequency = spi_frequency / ic_divider;
5301             break;
5302           case LL_RCC_ICCLKSOURCE_PLL4:
5303             spi_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5304             spi_frequency = spi_frequency / ic_divider;
5305             break;
5306           default:
5307             /* Unexpected case */
5308             break;
5309         }
5310       }
5311       break;
5312 
5313     case LL_RCC_SPI1_CLKSOURCE_IC9:
5314     case LL_RCC_SPI2_CLKSOURCE_IC9:
5315     case LL_RCC_SPI3_CLKSOURCE_IC9:
5316     case LL_RCC_SPI4_CLKSOURCE_IC9:
5317     case LL_RCC_SPI5_CLKSOURCE_IC9:
5318     case LL_RCC_SPI6_CLKSOURCE_IC9:
5319       if (LL_RCC_IC9_IsEnabled() != 0U)
5320       {
5321         ic_divider = LL_RCC_IC9_GetDivider();
5322         switch (LL_RCC_IC9_GetSource())
5323         {
5324           case LL_RCC_ICCLKSOURCE_PLL1:
5325             spi_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5326             spi_frequency = spi_frequency / ic_divider;
5327             break;
5328           case LL_RCC_ICCLKSOURCE_PLL2:
5329             spi_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5330             spi_frequency = spi_frequency / ic_divider;
5331             break;
5332           case LL_RCC_ICCLKSOURCE_PLL3:
5333             spi_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5334             spi_frequency = spi_frequency / ic_divider;
5335             break;
5336           case LL_RCC_ICCLKSOURCE_PLL4:
5337             spi_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5338             spi_frequency = spi_frequency / ic_divider;
5339             break;
5340           default:
5341             /* Unexpected case */
5342             break;
5343         }
5344       }
5345       break;
5346 
5347     case LL_RCC_SPI4_CLKSOURCE_IC14:
5348     case LL_RCC_SPI5_CLKSOURCE_IC14:
5349       if (LL_RCC_IC14_IsEnabled() != 0U)
5350       {
5351         ic_divider = LL_RCC_IC14_GetDivider();
5352         switch (LL_RCC_IC14_GetSource())
5353         {
5354           case LL_RCC_ICCLKSOURCE_PLL1:
5355             spi_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5356             spi_frequency = spi_frequency / ic_divider;
5357             break;
5358           case LL_RCC_ICCLKSOURCE_PLL2:
5359             spi_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5360             spi_frequency = spi_frequency / ic_divider;
5361             break;
5362           case LL_RCC_ICCLKSOURCE_PLL3:
5363             spi_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5364             spi_frequency = spi_frequency / ic_divider;
5365             break;
5366           case LL_RCC_ICCLKSOURCE_PLL4:
5367             spi_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5368             spi_frequency = spi_frequency / ic_divider;
5369             break;
5370           default:
5371             /* Unexpected case */
5372             break;
5373         }
5374       }
5375       break;
5376 
5377     case LL_RCC_SPI1_CLKSOURCE_HSI:
5378     case LL_RCC_SPI2_CLKSOURCE_HSI:
5379     case LL_RCC_SPI3_CLKSOURCE_HSI:
5380     case LL_RCC_SPI4_CLKSOURCE_HSI:
5381     case LL_RCC_SPI5_CLKSOURCE_HSI:
5382     case LL_RCC_SPI6_CLKSOURCE_HSI:
5383       if (LL_RCC_HSI_IsReady() != 0U)
5384       {
5385         spi_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
5386       }
5387       break;
5388 
5389     case LL_RCC_SPI1_CLKSOURCE_MSI:
5390     case LL_RCC_SPI2_CLKSOURCE_MSI:
5391     case LL_RCC_SPI3_CLKSOURCE_MSI:
5392     case LL_RCC_SPI4_CLKSOURCE_MSI:
5393     case LL_RCC_SPI5_CLKSOURCE_MSI:
5394     case LL_RCC_SPI6_CLKSOURCE_MSI:
5395       if (LL_RCC_MSI_IsReady() != 0U)
5396       {
5397         spi_frequency = MSI_VALUE;
5398       }
5399       break;
5400 
5401     case LL_RCC_SPI1_CLKSOURCE_I2S_CKIN:
5402     case LL_RCC_SPI2_CLKSOURCE_I2S_CKIN:
5403     case LL_RCC_SPI3_CLKSOURCE_I2S_CKIN:
5404     case LL_RCC_SPI6_CLKSOURCE_I2S_CKIN:
5405       spi_frequency = EXTERNAL_CLOCK_VALUE;
5406       break;
5407 
5408     case LL_RCC_SPI4_CLKSOURCE_HSE:
5409     case LL_RCC_SPI5_CLKSOURCE_HSE:
5410       if (LL_RCC_HSE_IsReady() != 0U)
5411       {
5412         spi_frequency = HSE_VALUE;
5413       }
5414       break;
5415 
5416     default:
5417       /* Unexpected case */
5418       break;
5419   }
5420 
5421   return spi_frequency;
5422 }
5423 
5424 /**
5425   * @brief  Return UARTx clock frequency
5426   * @param  UARTxSource This parameter can be one of the following values:
5427   *         @arg @ref RCCEx_UART4_Clock_Source
5428   *         @arg @ref RCCEx_UART5_Clock_Source
5429   *         @arg @ref RCCEx_UART7_Clock_Source
5430   *         @arg @ref RCCEx_UART8_Clock_Source
5431   *         @arg @ref RCCEx_UART9_Clock_Source
5432   * @retval USART clock frequency (in Hz)
5433   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
5434   */
RCCEx_GetUARTCLKFreq(uint32_t UARTxSource)5435 static uint32_t RCCEx_GetUARTCLKFreq(uint32_t UARTxSource)
5436 {
5437   uint32_t uart_frequency = RCC_PERIPH_FREQUENCY_NO;
5438   uint32_t ic_divider;
5439 
5440   switch (LL_RCC_GetUARTClockSource(UARTxSource))
5441   {
5442     case LL_RCC_UART4_CLKSOURCE_PCLK1:
5443     case LL_RCC_UART5_CLKSOURCE_PCLK1:
5444     case LL_RCC_UART7_CLKSOURCE_PCLK1:
5445     case LL_RCC_UART8_CLKSOURCE_PCLK1:
5446       uart_frequency = RCCEx_GetPCLK1Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
5447       break;
5448 
5449     case LL_RCC_UART9_CLKSOURCE_PCLK2:
5450       uart_frequency = RCCEx_GetPCLK2Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
5451       break;
5452 
5453     case LL_RCC_UART4_CLKSOURCE_CLKP:
5454     case LL_RCC_UART5_CLKSOURCE_CLKP:
5455     case LL_RCC_UART7_CLKSOURCE_CLKP:
5456     case LL_RCC_UART8_CLKSOURCE_CLKP:
5457     case LL_RCC_UART9_CLKSOURCE_CLKP:
5458       uart_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
5459       break;
5460 
5461     case LL_RCC_UART4_CLKSOURCE_IC9:
5462     case LL_RCC_UART5_CLKSOURCE_IC9:
5463     case LL_RCC_UART7_CLKSOURCE_IC9:
5464     case LL_RCC_UART8_CLKSOURCE_IC9:
5465     case LL_RCC_UART9_CLKSOURCE_IC9:
5466       if (LL_RCC_IC9_IsEnabled() != 0U)
5467       {
5468         ic_divider = LL_RCC_IC9_GetDivider();
5469         switch (LL_RCC_IC9_GetSource())
5470         {
5471           case LL_RCC_ICCLKSOURCE_PLL1:
5472             uart_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5473             uart_frequency = uart_frequency / ic_divider;
5474             break;
5475           case LL_RCC_ICCLKSOURCE_PLL2:
5476             uart_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5477             uart_frequency = uart_frequency / ic_divider;
5478             break;
5479           case LL_RCC_ICCLKSOURCE_PLL3:
5480             uart_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5481             uart_frequency = uart_frequency / ic_divider;
5482             break;
5483           case LL_RCC_ICCLKSOURCE_PLL4:
5484             uart_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5485             uart_frequency = uart_frequency / ic_divider;
5486             break;
5487           default:
5488             /* Unexpected case */
5489             break;
5490         }
5491       }
5492       break;
5493 
5494     case LL_RCC_UART4_CLKSOURCE_IC14:
5495     case LL_RCC_UART5_CLKSOURCE_IC14:
5496     case LL_RCC_UART7_CLKSOURCE_IC14:
5497     case LL_RCC_UART8_CLKSOURCE_IC14:
5498     case LL_RCC_UART9_CLKSOURCE_IC14:
5499       if (LL_RCC_IC14_IsEnabled() != 0U)
5500       {
5501         ic_divider = LL_RCC_IC14_GetDivider();
5502         switch (LL_RCC_IC14_GetSource())
5503         {
5504           case LL_RCC_ICCLKSOURCE_PLL1:
5505             uart_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5506             uart_frequency = uart_frequency / ic_divider;
5507             break;
5508           case LL_RCC_ICCLKSOURCE_PLL2:
5509             uart_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5510             uart_frequency = uart_frequency / ic_divider;
5511             break;
5512           case LL_RCC_ICCLKSOURCE_PLL3:
5513             uart_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5514             uart_frequency = uart_frequency / ic_divider;
5515             break;
5516           case LL_RCC_ICCLKSOURCE_PLL4:
5517             uart_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5518             uart_frequency = uart_frequency / ic_divider;
5519             break;
5520           default:
5521             /* Unexpected case */
5522             break;
5523         }
5524       }
5525       break;
5526 
5527     case LL_RCC_UART4_CLKSOURCE_HSI:
5528     case LL_RCC_UART5_CLKSOURCE_HSI:
5529     case LL_RCC_UART7_CLKSOURCE_HSI:
5530     case LL_RCC_UART8_CLKSOURCE_HSI:
5531     case LL_RCC_UART9_CLKSOURCE_HSI:
5532       if (LL_RCC_HSI_IsReady() != 0U)
5533       {
5534         uart_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
5535       }
5536       break;
5537 
5538     case LL_RCC_UART4_CLKSOURCE_MSI:
5539     case LL_RCC_UART5_CLKSOURCE_MSI:
5540     case LL_RCC_UART7_CLKSOURCE_MSI:
5541     case LL_RCC_UART8_CLKSOURCE_MSI:
5542     case LL_RCC_UART9_CLKSOURCE_MSI:
5543       if (LL_RCC_MSI_IsReady() != 0U)
5544       {
5545         uart_frequency = MSI_VALUE;
5546       }
5547       break;
5548 
5549     case LL_RCC_UART4_CLKSOURCE_LSE:
5550     case LL_RCC_UART5_CLKSOURCE_LSE:
5551     case LL_RCC_UART7_CLKSOURCE_LSE:
5552     case LL_RCC_UART8_CLKSOURCE_LSE:
5553     case LL_RCC_UART9_CLKSOURCE_LSE:
5554       if (LL_RCC_LSE_IsReady() != 0U)
5555       {
5556         uart_frequency = LSE_VALUE;
5557       }
5558       break;
5559 
5560     default:
5561       /* Unexpected case */
5562       break;
5563   }
5564 
5565   return uart_frequency;
5566 }
5567 
5568 /**
5569   * @brief  Return USARTx clock frequency
5570   * @param  USARTxSource This parameter can be one of the following values:
5571   *         @arg @ref RCCEx_USART1_Clock_Source
5572   *         @arg @ref RCCEx_USART2_Clock_Source
5573   *         @arg @ref RCCEx_USART3_Clock_Source
5574   *         @arg @ref RCCEx_USART6_Clock_Source
5575   *         @arg @ref RCCEx_USART10_Clock_Source
5576   * @retval USART clock frequency (in Hz)
5577   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
5578   */
RCCEx_GetUSARTCLKFreq(uint32_t USARTxSource)5579 static uint32_t RCCEx_GetUSARTCLKFreq(uint32_t USARTxSource)
5580 {
5581   uint32_t usart_frequency = RCC_PERIPH_FREQUENCY_NO;
5582   uint32_t ic_divider;
5583 
5584   switch (LL_RCC_GetUSARTClockSource(USARTxSource))
5585   {
5586     case LL_RCC_USART1_CLKSOURCE_PCLK2:
5587     case LL_RCC_USART6_CLKSOURCE_PCLK2:
5588     case LL_RCC_USART10_CLKSOURCE_PCLK2:
5589       usart_frequency = RCCEx_GetPCLK2Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
5590       break;
5591 
5592     case LL_RCC_USART2_CLKSOURCE_PCLK1:
5593     case LL_RCC_USART3_CLKSOURCE_PCLK1:
5594       usart_frequency = RCCEx_GetPCLK1Freq(RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq()));
5595       break;
5596 
5597     case LL_RCC_USART1_CLKSOURCE_CLKP:
5598     case LL_RCC_USART2_CLKSOURCE_CLKP:
5599     case LL_RCC_USART3_CLKSOURCE_CLKP:
5600     case LL_RCC_USART6_CLKSOURCE_CLKP:
5601     case LL_RCC_USART10_CLKSOURCE_CLKP:
5602       usart_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
5603       break;
5604 
5605     case LL_RCC_USART1_CLKSOURCE_IC9:
5606     case LL_RCC_USART2_CLKSOURCE_IC9:
5607     case LL_RCC_USART3_CLKSOURCE_IC9:
5608     case LL_RCC_USART6_CLKSOURCE_IC9:
5609     case LL_RCC_USART10_CLKSOURCE_IC9:
5610       if (LL_RCC_IC9_IsEnabled() != 0U)
5611       {
5612         ic_divider = LL_RCC_IC9_GetDivider();
5613         switch (LL_RCC_IC9_GetSource())
5614         {
5615           case LL_RCC_ICCLKSOURCE_PLL1:
5616             usart_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5617             usart_frequency = usart_frequency / ic_divider;
5618             break;
5619           case LL_RCC_ICCLKSOURCE_PLL2:
5620             usart_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5621             usart_frequency = usart_frequency / ic_divider;
5622             break;
5623           case LL_RCC_ICCLKSOURCE_PLL3:
5624             usart_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5625             usart_frequency = usart_frequency / ic_divider;
5626             break;
5627           case LL_RCC_ICCLKSOURCE_PLL4:
5628             usart_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5629             usart_frequency = usart_frequency / ic_divider;
5630             break;
5631           default:
5632             /* Unexpected case */
5633             break;
5634         }
5635       }
5636       break;
5637 
5638     case LL_RCC_USART1_CLKSOURCE_IC14:
5639     case LL_RCC_USART2_CLKSOURCE_IC14:
5640     case LL_RCC_USART3_CLKSOURCE_IC14:
5641     case LL_RCC_USART6_CLKSOURCE_IC14:
5642     case LL_RCC_USART10_CLKSOURCE_IC14:
5643       if (LL_RCC_IC14_IsEnabled() != 0U)
5644       {
5645         ic_divider = LL_RCC_IC14_GetDivider();
5646         switch (LL_RCC_IC14_GetSource())
5647         {
5648           case LL_RCC_ICCLKSOURCE_PLL1:
5649             usart_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5650             usart_frequency = usart_frequency / ic_divider;
5651             break;
5652           case LL_RCC_ICCLKSOURCE_PLL2:
5653             usart_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5654             usart_frequency = usart_frequency / ic_divider;
5655             break;
5656           case LL_RCC_ICCLKSOURCE_PLL3:
5657             usart_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5658             usart_frequency = usart_frequency / ic_divider;
5659             break;
5660           case LL_RCC_ICCLKSOURCE_PLL4:
5661             usart_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5662             usart_frequency = usart_frequency / ic_divider;
5663             break;
5664           default:
5665             /* Unexpected case */
5666             break;
5667         }
5668       }
5669       break;
5670 
5671     case LL_RCC_USART1_CLKSOURCE_HSI:
5672     case LL_RCC_USART2_CLKSOURCE_HSI:
5673     case LL_RCC_USART3_CLKSOURCE_HSI:
5674     case LL_RCC_USART6_CLKSOURCE_HSI:
5675     case LL_RCC_USART10_CLKSOURCE_HSI:
5676       if (LL_RCC_HSI_IsReady() != 0U)
5677       {
5678         usart_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider() >> RCC_HSICFGR_HSIDIV_Pos);
5679       }
5680       break;
5681 
5682     case LL_RCC_USART1_CLKSOURCE_MSI:
5683     case LL_RCC_USART2_CLKSOURCE_MSI:
5684     case LL_RCC_USART3_CLKSOURCE_MSI:
5685     case LL_RCC_USART6_CLKSOURCE_MSI:
5686     case LL_RCC_USART10_CLKSOURCE_MSI:
5687       if (LL_RCC_MSI_IsReady() != 0U)
5688       {
5689         usart_frequency = MSI_VALUE;
5690       }
5691       break;
5692 
5693     case LL_RCC_USART1_CLKSOURCE_LSE:
5694     case LL_RCC_USART2_CLKSOURCE_LSE:
5695     case LL_RCC_USART3_CLKSOURCE_LSE:
5696     case LL_RCC_USART6_CLKSOURCE_LSE:
5697     case LL_RCC_USART10_CLKSOURCE_LSE:
5698       if (LL_RCC_LSE_IsReady() != 0U)
5699       {
5700         usart_frequency = LSE_VALUE;
5701       }
5702       break;
5703 
5704     default:
5705       /* Unexpected case */
5706       break;
5707   }
5708 
5709   return usart_frequency;
5710 }
5711 
5712 /**
5713   * @brief  Return OTGPHYx clock frequency
5714   * @param  OTGPHYxSource This parameter can be one of the following values:
5715   *         @arg @ref RCCEx_USB_OTGHS1_Clock_Source
5716   *         @arg @ref RCCEx_USB_OTGHS2_Clock_Source
5717   * @retval OTGPHY clock frequency (in Hz)
5718   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready or Disabled
5719   */
RCCEx_GetOTGPHYCLKFreq(uint32_t OTGPHYxSource)5720 static uint32_t RCCEx_GetOTGPHYCLKFreq(uint32_t OTGPHYxSource)
5721 {
5722   uint32_t usb_frequency = RCC_PERIPH_FREQUENCY_NO;
5723 
5724   switch (LL_RCC_GetUSBClockSource(OTGPHYxSource))
5725   {
5726     case LL_RCC_OTGPHY1_CLKSOURCE_CLKP:
5727     case LL_RCC_OTGPHY2_CLKSOURCE_CLKP:
5728       usb_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
5729       break;
5730     case LL_RCC_OTGPHY1_CLKSOURCE_HSE_DIV_2:
5731     case LL_RCC_OTGPHY2_CLKSOURCE_HSE_DIV_2:
5732       if (LL_RCC_HSE_IsReady() != 0U)
5733       {
5734         usb_frequency = HSE_VALUE / 2U;
5735       }
5736       break;
5737     case LL_RCC_OTGPHY1_CLKSOURCE_HSE_DIV_2_OSC:
5738     case LL_RCC_OTGPHY2_CLKSOURCE_HSE_DIV_2_OSC:
5739       if (LL_RCC_HSE_IsReady() != 0U)
5740       {
5741         if (LL_RCC_HSE_IsSelectedHSEDiv2AsDiv2Clock() == 0UL)
5742         {
5743           usb_frequency = HSE_VALUE;
5744         }
5745         else
5746         {
5747           usb_frequency = HSE_VALUE / 2U;
5748         }
5749       }
5750       break;
5751     case LL_RCC_OTGPHY1_CLKSOURCE_IC15:
5752     case LL_RCC_OTGPHY2_CLKSOURCE_IC15:
5753       if (LL_RCC_IC15_IsEnabled() != 0U)
5754       {
5755         uint32_t ic_divider = LL_RCC_IC15_GetDivider();
5756         switch (LL_RCC_IC15_GetSource())
5757         {
5758           case LL_RCC_ICCLKSOURCE_PLL1:
5759             usb_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5760             usb_frequency = usb_frequency / ic_divider;
5761             break;
5762           case LL_RCC_ICCLKSOURCE_PLL2:
5763             usb_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5764             usb_frequency = usb_frequency / ic_divider;
5765             break;
5766           case LL_RCC_ICCLKSOURCE_PLL3:
5767             usb_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5768             usb_frequency = usb_frequency / ic_divider;
5769             break;
5770           case LL_RCC_ICCLKSOURCE_PLL4:
5771             usb_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5772             usb_frequency = usb_frequency / ic_divider;
5773             break;
5774           default:
5775             /* Unexpected case */
5776             break;
5777         }
5778       }
5779       break;
5780 
5781     default:
5782       /* Unexpected case */
5783       break;
5784   }
5785 
5786   return usb_frequency;
5787 }
5788 
5789 /**
5790   * @brief  Return OTGPHYxCKREF clock frequency
5791   * @param  OTGPHYxCKREFSource This parameter can be one of the following values:
5792   *         @arg @ref RCCEx_USBPHY1_Clock_Source
5793   *         @arg @ref RCCEx_USBPHY2_Clock_Source
5794   * @retval OTGPHYCKREF clock frequency (in Hz)
5795   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready or Disabled
5796   */
RCCEx_GetOTGPHYCKREFCLKFreq(uint32_t OTGPHYxCKREFSource)5797 static uint32_t RCCEx_GetOTGPHYCKREFCLKFreq(uint32_t OTGPHYxCKREFSource)
5798 {
5799   uint32_t usb_frequency = RCC_PERIPH_FREQUENCY_NO;
5800 
5801   switch (LL_RCC_GetUSBClockSource(OTGPHYxCKREFSource))
5802   {
5803     case LL_RCC_OTGPHY1CKREF_CLKSOURCE_HSE_DIV_2_OSC:
5804     case LL_RCC_OTGPHY2CKREF_CLKSOURCE_HSE_DIV_2_OSC:
5805       if (LL_RCC_HSE_IsReady() != 0U)
5806       {
5807         if (LL_RCC_HSE_IsSelectedHSEDiv2AsDiv2Clock() == 0UL)
5808         {
5809           usb_frequency = HSE_VALUE;
5810         }
5811         else
5812         {
5813           usb_frequency = HSE_VALUE / 2U;
5814         }
5815       }
5816       break;
5817 
5818     case LL_RCC_OTGPHY1CKREF_CLKSOURCE_OTGPHY1:
5819       usb_frequency = RCCEx_GetOTGPHYCLKFreq(LL_RCC_OTGPHY1_CLKSOURCE);
5820       break;
5821 
5822     case LL_RCC_OTGPHY2CKREF_CLKSOURCE_OTGPHY2:
5823       usb_frequency = RCCEx_GetOTGPHYCLKFreq(LL_RCC_OTGPHY2_CLKSOURCE);
5824       break;
5825 
5826     default:
5827       /* Unexpected case */
5828       break;
5829   }
5830 
5831   return usb_frequency;
5832 }
5833 
5834 /**
5835   * @brief  Return XSPI clock frequency
5836   * @param  XSPIxSource This parameter can be one of the following values:
5837   *         @arg @ref RCCEx_XSPI1_Clock_Source
5838   *         @arg @ref RCCEx_XSPI2_Clock_Source
5839   *         @arg @ref RCCEx_XSPI3_Clock_Source
5840   * @retval XSPI clock frequency (in Hz)
5841   *         - @ref  RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
5842   */
5843 
RCCEx_GetXSPICLKFreq(uint32_t XSPIxSource)5844 static uint32_t RCCEx_GetXSPICLKFreq(uint32_t XSPIxSource)
5845 {
5846   uint32_t xspi_frequency = RCC_PERIPH_FREQUENCY_NO;
5847   uint32_t ic_divider;
5848 
5849   switch (LL_RCC_GetXSPIClockSource(XSPIxSource))
5850   {
5851     case LL_RCC_XSPI1_CLKSOURCE_HCLK:
5852     case LL_RCC_XSPI2_CLKSOURCE_HCLK:
5853     case LL_RCC_XSPI3_CLKSOURCE_HCLK:
5854       xspi_frequency = RCCEx_GetHCLKFreq(HAL_RCC_GetSysClockFreq());
5855       break;
5856 
5857     case LL_RCC_XSPI1_CLKSOURCE_CLKP:
5858     case LL_RCC_XSPI2_CLKSOURCE_CLKP:
5859     case LL_RCC_XSPI3_CLKSOURCE_CLKP:
5860       xspi_frequency = RCCEx_GetCLKPCLKFreq(LL_RCC_CLKP_CLKSOURCE);
5861       break;
5862 
5863     case LL_RCC_XSPI1_CLKSOURCE_IC3:
5864     case LL_RCC_XSPI2_CLKSOURCE_IC3:
5865     case LL_RCC_XSPI3_CLKSOURCE_IC3:
5866       if (LL_RCC_IC3_IsEnabled() != 0U)
5867       {
5868         ic_divider = LL_RCC_IC3_GetDivider();
5869         switch (LL_RCC_IC3_GetSource())
5870         {
5871           case LL_RCC_ICCLKSOURCE_PLL1:
5872             xspi_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5873             xspi_frequency = xspi_frequency / ic_divider;
5874             break;
5875           case LL_RCC_ICCLKSOURCE_PLL2:
5876             xspi_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5877             xspi_frequency = xspi_frequency / ic_divider;
5878             break;
5879           case LL_RCC_ICCLKSOURCE_PLL3:
5880             xspi_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5881             xspi_frequency = xspi_frequency / ic_divider;
5882             break;
5883           case LL_RCC_ICCLKSOURCE_PLL4:
5884             xspi_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5885             xspi_frequency = xspi_frequency / ic_divider;
5886             break;
5887           default:
5888             /* Unexpected case */
5889             break;
5890         }
5891       }
5892       break;
5893 
5894     case LL_RCC_XSPI1_CLKSOURCE_IC4:
5895     case LL_RCC_XSPI2_CLKSOURCE_IC4:
5896     case LL_RCC_XSPI3_CLKSOURCE_IC4:
5897       if (LL_RCC_IC4_IsEnabled() != 0U)
5898       {
5899         ic_divider = LL_RCC_IC4_GetDivider();
5900         switch (LL_RCC_IC4_GetSource())
5901         {
5902           case LL_RCC_ICCLKSOURCE_PLL1:
5903             xspi_frequency = HAL_RCCEx_GetPLL1CLKFreq();
5904             xspi_frequency = xspi_frequency / ic_divider;
5905             break;
5906           case LL_RCC_ICCLKSOURCE_PLL2:
5907             xspi_frequency = HAL_RCCEx_GetPLL2CLKFreq();
5908             xspi_frequency = xspi_frequency / ic_divider;
5909             break;
5910           case LL_RCC_ICCLKSOURCE_PLL3:
5911             xspi_frequency = HAL_RCCEx_GetPLL3CLKFreq();
5912             xspi_frequency = xspi_frequency / ic_divider;
5913             break;
5914           case LL_RCC_ICCLKSOURCE_PLL4:
5915             xspi_frequency = HAL_RCCEx_GetPLL4CLKFreq();
5916             xspi_frequency = xspi_frequency / ic_divider;
5917             break;
5918           default:
5919             /* Unexpected case */
5920             break;
5921         }
5922       }
5923       break;
5924 
5925     default:
5926       /* Nothing to do */
5927       break;
5928   }
5929 
5930   return xspi_frequency;
5931 }
5932 
5933 /**
5934   * @}
5935   */
5936 
5937 #endif /* HAL_RCC_MODULE_ENABLED */
5938 
5939 /**
5940   * @}
5941   */
5942 
5943 /**
5944   * @}
5945   */
5946