STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
stm32f7xx_hal_rcc_ex.c
Go to the documentation of this file.
1 
42 /* Includes ------------------------------------------------------------------*/
43 #include "stm32f7xx_hal.h"
44 
54 #ifdef HAL_RCC_MODULE_ENABLED
55 
56 /* Private typedef -----------------------------------------------------------*/
57 /* Private define ------------------------------------------------------------*/
62 #define PLLI2S_TIMEOUT_VALUE 100 /* Timeout value fixed to 100 ms */
63 #define PLLSAI_TIMEOUT_VALUE 100 /* Timeout value fixed to 100 ms */
64 
68 /* Private macro -------------------------------------------------------------*/
85 /* Private variables ---------------------------------------------------------*/
86 /* Private function prototypes -----------------------------------------------*/
87 /* Private functions ---------------------------------------------------------*/
88 
127 {
128  uint32_t tickstart = 0;
129  uint32_t tmpreg0 = 0;
130  uint32_t tmpreg1 = 0;
131  uint32_t plli2sused = 0;
132  uint32_t pllsaiused = 0;
133 
134  /* Check the parameters */
135  assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection));
136 
137  /*----------------------------------- I2S configuration ----------------------------------*/
138  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S))
139  {
140  /* Check the parameters */
142 
143  /* Configure I2S Clock source */
144  __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2sClockSelection);
145 
146  /* Enable the PLLI2S when it's used as clock source for I2S */
147  if(PeriphClkInit->I2sClockSelection == RCC_I2SCLKSOURCE_PLLI2S)
148  {
149  plli2sused = 1;
150  }
151  }
152 
153  /*------------------------------------ SAI1 configuration --------------------------------------*/
154  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1))
155  {
156  /* Check the parameters */
157  assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection));
158 
159  /* Configure SAI1 Clock source */
161  /* Enable the PLLI2S when it's used as clock source for SAI */
162  if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)
163  {
164  plli2sused = 1;
165  }
166  /* Enable the PLLSAI when it's used as clock source for SAI */
167  if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)
168  {
169  pllsaiused = 1;
170  }
171  }
172 
173  /*------------------------------------ SAI2 configuration --------------------------------------*/
174  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2))
175  {
176  /* Check the parameters */
177  assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection));
178 
179  /* Configure SAI2 Clock source */
181 
182  /* Enable the PLLI2S when it's used as clock source for SAI */
183  if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S)
184  {
185  plli2sused = 1;
186  }
187  /* Enable the PLLSAI when it's used as clock source for SAI */
188  if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI)
189  {
190  pllsaiused = 1;
191  }
192  }
193 
194  /*-------------------------------------- SPDIF-RX Configuration -----------------------------------*/
196  {
197  plli2sused = 1;
198  }
199 
200  /*------------------------------------ RTC configuration --------------------------------------*/
201  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC))
202  {
203  /* Check for RTC Parameters used to output RTCCLK */
205 
206  /* Enable Power Clock*/
208 
209  /* Enable write access to Backup domain */
210  PWR->CR1 |= PWR_CR1_DBP;
211 
212  /* Get Start Tick*/
213  tickstart = HAL_GetTick();
214 
215  /* Wait for Backup domain Write protection disable */
216  while((PWR->CR1 & PWR_CR1_DBP) == RESET)
217  {
218  if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE)
219  {
220  return HAL_TIMEOUT;
221  }
222  }
223 
224  /* Reset the Backup domain only if the RTC Clock source selection is modified */
225  tmpreg0 = (RCC->BDCR & RCC_BDCR_RTCSEL);
226 
227  if((tmpreg0 != 0x00000000U) && (tmpreg0 != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL)))
228  {
229  /* Store the content of BDCR register before the reset of Backup Domain */
230  tmpreg0 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL));
231 
232  /* RTC Clock selection can be changed only if the Backup Domain is reset */
235 
236  /* Restore the Content of BDCR register */
237  RCC->BDCR = tmpreg0;
238 
239  /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */
240  if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON))
241  {
242  /* Get Start Tick*/
243  tickstart = HAL_GetTick();
244 
245  /* Wait till LSE is ready */
247  {
248  if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE)
249  {
250  return HAL_TIMEOUT;
251  }
252  }
253  }
254  }
255  __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection);
256  }
257 
258  /*------------------------------------ TIM configuration --------------------------------------*/
259  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM))
260  {
261  /* Check the parameters */
263 
264  /* Configure Timer Prescaler */
266  }
267 
268  /*-------------------------------------- I2C1 Configuration -----------------------------------*/
270  {
271  /* Check the parameters */
273 
274  /* Configure the I2C1 clock source */
276  }
277 
278  /*-------------------------------------- I2C2 Configuration -----------------------------------*/
280  {
281  /* Check the parameters */
283 
284  /* Configure the I2C2 clock source */
286  }
287 
288  /*-------------------------------------- I2C3 Configuration -----------------------------------*/
290  {
291  /* Check the parameters */
293 
294  /* Configure the I2C3 clock source */
296  }
297 
298  /*-------------------------------------- I2C4 Configuration -----------------------------------*/
300  {
301  /* Check the parameters */
303 
304  /* Configure the I2C4 clock source */
306  }
307 
308  /*-------------------------------------- USART1 Configuration -----------------------------------*/
310  {
311  /* Check the parameters */
313 
314  /* Configure the USART1 clock source */
316  }
317 
318  /*-------------------------------------- USART2 Configuration -----------------------------------*/
320  {
321  /* Check the parameters */
323 
324  /* Configure the USART2 clock source */
326  }
327 
328  /*-------------------------------------- USART3 Configuration -----------------------------------*/
330  {
331  /* Check the parameters */
333 
334  /* Configure the USART3 clock source */
336  }
337 
338  /*-------------------------------------- UART4 Configuration -----------------------------------*/
340  {
341  /* Check the parameters */
343 
344  /* Configure the UART4 clock source */
346  }
347 
348  /*-------------------------------------- UART5 Configuration -----------------------------------*/
350  {
351  /* Check the parameters */
353 
354  /* Configure the UART5 clock source */
356  }
357 
358  /*-------------------------------------- USART6 Configuration -----------------------------------*/
360  {
361  /* Check the parameters */
363 
364  /* Configure the USART6 clock source */
366  }
367 
368  /*-------------------------------------- UART7 Configuration -----------------------------------*/
370  {
371  /* Check the parameters */
373 
374  /* Configure the UART7 clock source */
376  }
377 
378  /*-------------------------------------- UART8 Configuration -----------------------------------*/
380  {
381  /* Check the parameters */
383 
384  /* Configure the UART8 clock source */
386  }
387 
388  /*--------------------------------------- CEC Configuration -----------------------------------*/
389  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC)
390  {
391  /* Check the parameters */
393 
394  /* Configure the CEC clock source */
395  __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection);
396  }
397 
398  /*-------------------------------------- CK48 Configuration -----------------------------------*/
400  {
401  /* Check the parameters */
403 
404  /* Configure the CLK48 source */
406 
407  /* Enable the PLLSAI when it's used as clock source for CK48 */
408  if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48SOURCE_PLLSAIP)
409  {
410  pllsaiused = 1;
411  }
412  }
413 
414  /*-------------------------------------- LTDC Configuration -----------------------------------*/
415 #if defined(STM32F746xx) || defined(STM32F756xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx)
416  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)
417  {
418  pllsaiused = 1;
419  }
420 #endif /* STM32F746xx || STM32F756xx || STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */
421 
422  /*-------------------------------------- LPTIM1 Configuration -----------------------------------*/
424  {
425  /* Check the parameters */
427 
428  /* Configure the LTPIM1 clock source */
430  }
431 
432  /*------------------------------------- SDMMC1 Configuration ------------------------------------*/
434  {
435  /* Check the parameters */
437 
438  /* Configure the SDMMC1 clock source */
440  }
441 
442 #if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx)
443  /*------------------------------------- SDMMC2 Configuration ------------------------------------*/
444  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDMMC2) == RCC_PERIPHCLK_SDMMC2)
445  {
446  /* Check the parameters */
447  assert_param(IS_RCC_SDMMC2CLKSOURCE(PeriphClkInit->Sdmmc2ClockSelection));
448 
449  /* Configure the SDMMC2 clock source */
450  __HAL_RCC_SDMMC2_CONFIG(PeriphClkInit->Sdmmc2ClockSelection);
451  }
452 
453  /*------------------------------------- DFSDM1 Configuration -------------------------------------*/
454  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1)
455  {
456  /* Check the parameters */
457  assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection));
458 
459  /* Configure the DFSDM1 interface clock source */
460  __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection);
461  }
462 
463  /*------------------------------------- DFSDM AUDIO Configuration -------------------------------------*/
464  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1_AUDIO) == RCC_PERIPHCLK_DFSDM1_AUDIO)
465  {
466  /* Check the parameters */
467  assert_param(IS_RCC_DFSDM1AUDIOCLKSOURCE(PeriphClkInit->Dfsdm1AudioClockSelection));
468 
469  /* Configure the DFSDM interface clock source */
470  __HAL_RCC_DFSDM1AUDIO_CONFIG(PeriphClkInit->Dfsdm1AudioClockSelection);
471  }
472 #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */
473 
474  /*-------------------------------------- PLLI2S Configuration ---------------------------------*/
475  /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2, I2S or SPDIF-RX */
476  if((plli2sused == 1) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S))
477  {
478  /* Disable the PLLI2S */
480 
481  /* Get Start Tick*/
482  tickstart = HAL_GetTick();
483 
484  /* Wait till PLLI2S is disabled */
486  {
487  if((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE)
488  {
489  /* return in case of Timeout detected */
490  return HAL_TIMEOUT;
491  }
492  }
493 
494  /* check for common PLLI2S Parameters */
496 
497  /*----------------- In Case of PLLI2S is selected as source clock for I2S -------------------*/
498  if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) && (PeriphClkInit->I2sClockSelection == RCC_I2SCLKSOURCE_PLLI2S)))
499  {
500  /* check for Parameters */
502 
503  /* Read PLLI2SP and PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */
504  tmpreg0 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SP));
505  tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SQ));
506  /* Configure the PLLI2S division factors */
507  /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */
508  /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */
509  __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , tmpreg0, tmpreg1, PeriphClkInit->PLLI2S.PLLI2SR);
510  }
511 
512  /*----------------- In Case of PLLI2S is selected as source clock for SAI -------------------*/
513  if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) ||
515  {
516  /* Check for PLLI2S Parameters */
518  /* Check for PLLI2S/DIVQ parameters */
520 
521  /* Read PLLI2SP and PLLI2SR values from PLLI2SCFGR register (this value is not needed for SAI configuration) */
522  tmpreg0 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SP));
523  tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR));
524  /* Configure the PLLI2S division factors */
525  /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */
526  /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */
527  /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */
528  __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, tmpreg0, PeriphClkInit->PLLI2S.PLLI2SQ, tmpreg1);
529 
530  /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */
532  }
533 
534  /*----------------- In Case of PLLI2S is selected as source clock for SPDIF-RX -------------------*/
536  {
537  /* check for Parameters */
539 
540  /* Read PLLI2SR value from PLLI2SCFGR register (this value is not needed for SPDIF-RX configuration) */
541  tmpreg0 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SQ));
542  tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR));
543  /* Configure the PLLI2S division factors */
544  /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */
545  /* SPDIFCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */
546  __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, tmpreg0, tmpreg1);
547  }
548 
549  /*----------------- In Case of PLLI2S is just selected -----------------*/
551  {
552  /* Check for Parameters */
556 
557  /* Configure the PLLI2S division factors */
558  /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLI2SM) */
559  /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */
560  __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR);
561  }
562 
563  /* Enable the PLLI2S */
565 
566  /* Get Start Tick*/
567  tickstart = HAL_GetTick();
568 
569  /* Wait till PLLI2S is ready */
571  {
572  if((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE)
573  {
574  /* return in case of Timeout detected */
575  return HAL_TIMEOUT;
576  }
577  }
578  }
579 
580  /*-------------------------------------- PLLSAI Configuration ---------------------------------*/
581  /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, LTDC or CK48 */
582  if(pllsaiused == 1)
583  {
584  /* Disable PLLSAI Clock */
586 
587  /* Get Start Tick*/
588  tickstart = HAL_GetTick();
589 
590  /* Wait till PLLSAI is disabled */
591  while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET)
592  {
593  if((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE)
594  {
595  /* return in case of Timeout detected */
596  return HAL_TIMEOUT;
597  }
598  }
599 
600  /* Check the PLLSAI division factors */
602 
603  /*----------------- In Case of PLLSAI is selected as source clock for SAI -------------------*/
604  if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) ||\
606  {
607  /* check for PLLSAIQ Parameter */
609  /* check for PLLSAI/DIVQ Parameter */
611 
612  /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */
613  tmpreg0 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIP));
614  tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIR));
615  /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */
616  /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */
617  /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */
618  __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , tmpreg0, PeriphClkInit->PLLSAI.PLLSAIQ, tmpreg1);
619 
620  /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */
622  }
623 
624  /*----------------- In Case of PLLSAI is selected as source clock for CLK48 -------------------*/
625  /* In Case of PLLI2S is selected as source clock for CK48 */
627  {
628  /* check for Parameters */
630  /* Read PLLSAIQ and PLLSAIR value from PLLSAICFGR register (this value is not needed for CK48 configuration) */
631  tmpreg0 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIQ));
632  tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIR));
633 
634  /* Configure the PLLSAI division factors */
635  /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) x (PLLI2SN/PLLM) */
636  /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */
637  __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIP, tmpreg0, tmpreg1);
638  }
639 
640 #if defined(STM32F746xx) || defined(STM32F756xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx)
641  /*---------------------------- LTDC configuration -------------------------------*/
642  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC))
643  {
646 
647  /* Read PLLSAIP and PLLSAIQ value from PLLSAICFGR register (these value are not needed for LTDC configuration) */
648  tmpreg0 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIQ));
649  tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIP));
650 
651  /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */
652  /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */
653  /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */
654  __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN , tmpreg1, tmpreg0, PeriphClkInit->PLLSAI.PLLSAIR);
655 
656  /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */
658  }
659 #endif /* STM32F746xx || STM32F756xx || STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */
660 
661  /* Enable PLLSAI Clock */
663 
664  /* Get Start Tick*/
665  tickstart = HAL_GetTick();
666 
667  /* Wait till PLLSAI is ready */
668  while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET)
669  {
670  if((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE)
671  {
672  /* return in case of Timeout detected */
673  return HAL_TIMEOUT;
674  }
675  }
676  }
677  return HAL_OK;
678 }
679 
687 {
688  uint32_t tempreg = 0;
689 
690  /* Set all possible values for the extended clock type parameter------------*/
691 #if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx)
693  RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 |\
694  RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\
695  RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_I2C4 |\
696  RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 |\
697  RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_USART1 |\
698  RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 |\
699  RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 |\
700  RCC_PERIPHCLK_USART6 | RCC_PERIPHCLK_UART7 |\
701  RCC_PERIPHCLK_UART8 | RCC_PERIPHCLK_SDMMC1 |\
702  RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDMMC2 |\
703  RCC_PERIPHCLK_DFSDM1 | RCC_PERIPHCLK_DFSDM1_AUDIO;
704 #else
706  RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 |\
707  RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\
708  RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_I2C4 |\
709  RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 |\
710  RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_USART1 |\
711  RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 |\
712  RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 |\
713  RCC_PERIPHCLK_USART6 | RCC_PERIPHCLK_UART7 |\
714  RCC_PERIPHCLK_UART8 | RCC_PERIPHCLK_SDMMC1 |\
715  RCC_PERIPHCLK_CLK48;
716 #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */
717 
718  /* Get the PLLI2S Clock configuration -----------------------------------------------*/
719  PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SN));
720  PeriphClkInit->PLLI2S.PLLI2SP = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SP));
721  PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SQ));
722  PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR));
723 
724  /* Get the PLLSAI Clock configuration -----------------------------------------------*/
725  PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIN));
726  PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIP));
727  PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIQ));
728  PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> POSITION_VAL(RCC_PLLSAICFGR_PLLSAIR));
729 
730  /* Get the PLLSAI/PLLI2S division factors -------------------------------------------*/
731  PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLI2SDIVQ) >> POSITION_VAL(RCC_DCKCFGR1_PLLI2SDIVQ));
732  PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLSAIDIVQ) >> POSITION_VAL(RCC_DCKCFGR1_PLLSAIDIVQ));
733  PeriphClkInit->PLLSAIDivR = (uint32_t)((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLSAIDIVR) >> POSITION_VAL(RCC_DCKCFGR1_PLLSAIDIVR));
734 
735  /* Get the SAI1 clock configuration ----------------------------------------------*/
737 
738  /* Get the SAI2 clock configuration ----------------------------------------------*/
740 
741  /* Get the I2S clock configuration ------------------------------------------*/
743 
744  /* Get the I2C1 clock configuration ------------------------------------------*/
746 
747  /* Get the I2C2 clock configuration ------------------------------------------*/
749 
750  /* Get the I2C3 clock configuration ------------------------------------------*/
752 
753  /* Get the I2C4 clock configuration ------------------------------------------*/
755 
756  /* Get the USART1 clock configuration ------------------------------------------*/
758 
759  /* Get the USART2 clock configuration ------------------------------------------*/
761 
762  /* Get the USART3 clock configuration ------------------------------------------*/
764 
765  /* Get the UART4 clock configuration ------------------------------------------*/
767 
768  /* Get the UART5 clock configuration ------------------------------------------*/
770 
771  /* Get the USART6 clock configuration ------------------------------------------*/
773 
774  /* Get the UART7 clock configuration ------------------------------------------*/
776 
777  /* Get the UART8 clock configuration ------------------------------------------*/
779 
780  /* Get the LPTIM1 clock configuration ------------------------------------------*/
782 
783  /* Get the CEC clock configuration -----------------------------------------------*/
784  PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE();
785 
786  /* Get the CK48 clock configuration -----------------------------------------------*/
788 
789  /* Get the SDMMC1 clock configuration -----------------------------------------------*/
791 
792 #if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx)
793  /* Get the SDMMC2 clock configuration -----------------------------------------------*/
794  PeriphClkInit->Sdmmc2ClockSelection = __HAL_RCC_GET_SDMMC2_SOURCE();
795 
796  /* Get the DFSDM clock configuration -----------------------------------------------*/
797  PeriphClkInit->Dfsdm1ClockSelection = __HAL_RCC_GET_DFSDM1_SOURCE();
798 
799  /* Get the DFSDM AUDIO clock configuration -----------------------------------------------*/
800  PeriphClkInit->Dfsdm1AudioClockSelection = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE();
801 #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */
802 
803  /* Get the RTC Clock configuration -----------------------------------------------*/
804  tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE);
805  PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL));
806 
807  /* Get the TIM Prescaler configuration --------------------------------------------*/
808  if ((RCC->DCKCFGR1 & RCC_DCKCFGR1_TIMPRE) == RESET)
809  {
811  }
812  else
813  {
814  PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED;
815  }
816 }
817 
827 uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk)
828 {
829  uint32_t tmpreg = 0;
830  /* This variable is used to store the SAI clock frequency (value in Hz) */
831  uint32_t frequency = 0;
832  /* This variable is used to store the VCO Input (value in Hz) */
833  uint32_t vcoinput = 0;
834  /* This variable is used to store the SAI clock source */
835  uint32_t saiclocksource = 0;
836 
837  if (PeriphClk == RCC_PERIPHCLK_SAI1)
838  {
839  saiclocksource = RCC->DCKCFGR1;
840  saiclocksource &= RCC_DCKCFGR1_SAI1SEL;
841  switch (saiclocksource)
842  {
843  case 0: /* PLLSAI is the clock source for SAI1 */
844  {
845  /* Configure the PLLSAI division factor */
846  /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */
847  if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI)
848  {
849  /* In Case the PLL Source is HSI (Internal Clock) */
850  vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM));
851  }
852  else
853  {
854  /* In Case the PLL Source is HSE (External Clock) */
855  vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)));
856  }
857  /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */
858  /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */
859  tmpreg = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24;
860  frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6))/(tmpreg);
861 
862  /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */
863  tmpreg = (((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLSAIDIVQ) >> 8) + 1);
864  frequency = frequency/(tmpreg);
865  break;
866  }
867  case RCC_DCKCFGR1_SAI1SEL_0: /* PLLI2S is the clock source for SAI1 */
868  {
869  /* Configure the PLLI2S division factor */
870  /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */
871  if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI)
872  {
873  /* In Case the PLL Source is HSI (Internal Clock) */
874  vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM));
875  }
876  else
877  {
878  /* In Case the PLL Source is HSE (External Clock) */
879  vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)));
880  }
881 
882  /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */
883  /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */
884  tmpreg = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24;
885  frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6))/(tmpreg);
886 
887  /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */
888  tmpreg = ((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLI2SDIVQ) + 1);
889  frequency = frequency/(tmpreg);
890  break;
891  }
892  case RCC_DCKCFGR1_SAI1SEL_1: /* External clock is the clock source for SAI1 */
893  {
894  frequency = EXTERNAL_CLOCK_VALUE;
895  break;
896  }
897 #if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx)
898  case RCC_DCKCFGR1_SAI1SEL: /* HSI or HSE is the clock source for SAI*/
899  {
900  if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI)
901  {
902  /* In Case the main PLL Source is HSI */
903  frequency = HSI_VALUE;
904  }
905  else
906  {
907  /* In Case the main PLL Source is HSE */
908  frequency = HSE_VALUE;
909  }
910  break;
911  }
912 #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */
913  default :
914  {
915  break;
916  }
917  }
918  }
919 
920  if (PeriphClk == RCC_PERIPHCLK_SAI2)
921  {
922  saiclocksource = RCC->DCKCFGR1;
923  saiclocksource &= RCC_DCKCFGR1_SAI2SEL;
924  switch (saiclocksource)
925  {
926  case 0: /* PLLSAI is the clock source for SAI*/
927  {
928  /* Configure the PLLSAI division factor */
929  /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */
930  if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI)
931  {
932  /* In Case the PLL Source is HSI (Internal Clock) */
933  vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM));
934  }
935  else
936  {
937  /* In Case the PLL Source is HSE (External Clock) */
938  vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)));
939  }
940  /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */
941  /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */
942  tmpreg = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24;
943  frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6))/(tmpreg);
944 
945  /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */
946  tmpreg = (((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLSAIDIVQ) >> 8) + 1);
947  frequency = frequency/(tmpreg);
948  break;
949  }
950  case RCC_DCKCFGR1_SAI2SEL_0: /* PLLI2S is the clock source for SAI2 */
951  {
952  /* Configure the PLLI2S division factor */
953  /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */
954  if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI)
955  {
956  /* In Case the PLL Source is HSI (Internal Clock) */
957  vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM));
958  }
959  else
960  {
961  /* In Case the PLL Source is HSE (External Clock) */
962  vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)));
963  }
964 
965  /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */
966  /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */
967  tmpreg = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24;
968  frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6))/(tmpreg);
969 
970  /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */
971  tmpreg = ((RCC->DCKCFGR1 & RCC_DCKCFGR1_PLLI2SDIVQ) + 1);
972  frequency = frequency/(tmpreg);
973  break;
974  }
975  case RCC_DCKCFGR1_SAI2SEL_1: /* External clock is the clock source for SAI2 */
976  {
977  frequency = EXTERNAL_CLOCK_VALUE;
978  break;
979  }
980 #if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx)
981  case RCC_DCKCFGR1_SAI2SEL: /* HSI or HSE is the clock source for SAI2 */
982  {
983  if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI)
984  {
985  /* In Case the main PLL Source is HSI */
986  frequency = HSI_VALUE;
987  }
988  else
989  {
990  /* In Case the main PLL Source is HSE */
991  frequency = HSE_VALUE;
992  }
993  break;
994  }
995 #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */
996  default :
997  {
998  break;
999  }
1000  }
1001  }
1002 
1003  return frequency;
1004 }
1005 
1006 #if defined (STM32F765xx) || defined(STM32F767xx) || defined(STM32F769xx) || defined(STM32F777xx) || defined(STM32F779xx)
1007 
1022 {
1023  uint32_t tickstart = 0;
1024 
1025  /* Check the parameters */
1026  assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType));
1027 
1028  /*------------------------------- HSE Configuration ------------------------*/
1029  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE)
1030  {
1031  /* Check the parameters */
1032  assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState));
1033  /* When the HSE is used as system clock or clock source for PLL, It can not be disabled */
1036  {
1037  if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF))
1038  {
1039  return HAL_ERROR;
1040  }
1041  }
1042  else
1043  {
1044  /* Set the new HSE configuration ---------------------------------------*/
1045  __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState);
1046 
1047  /* Check the HSE State */
1048  if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF)
1049  {
1050  /* Get Start Tick*/
1051  tickstart = HAL_GetTick();
1052 
1053  /* Wait till HSE is ready */
1055  {
1056  if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE)
1057  {
1058  return HAL_TIMEOUT;
1059  }
1060  }
1061  }
1062  else
1063  {
1064  /* Get Start Tick*/
1065  tickstart = HAL_GetTick();
1066 
1067  /* Wait till HSE is bypassed or disabled */
1069  {
1070  if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE)
1071  {
1072  return HAL_TIMEOUT;
1073  }
1074  }
1075  }
1076  }
1077  }
1078  /*----------------------------- HSI Configuration --------------------------*/
1079  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI)
1080  {
1081  /* Check the parameters */
1082  assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState));
1084 
1085  /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */
1088  {
1089  /* When HSI is used as system clock it will not disabled */
1090  if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON))
1091  {
1092  return HAL_ERROR;
1093  }
1094  /* Otherwise, just the calibration is allowed */
1095  else
1096  {
1097  /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/
1099  }
1100  }
1101  else
1102  {
1103  /* Check the HSI State */
1104  if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF)
1105  {
1106  /* Enable the Internal High Speed oscillator (HSI). */
1108 
1109  /* Get Start Tick*/
1110  tickstart = HAL_GetTick();
1111 
1112  /* Wait till HSI is ready */
1114  {
1115  if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE)
1116  {
1117  return HAL_TIMEOUT;
1118  }
1119  }
1120 
1121  /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/
1123  }
1124  else
1125  {
1126  /* Disable the Internal High Speed oscillator (HSI). */
1128 
1129  /* Get Start Tick*/
1130  tickstart = HAL_GetTick();
1131 
1132  /* Wait till HSI is ready */
1134  {
1135  if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE)
1136  {
1137  return HAL_TIMEOUT;
1138  }
1139  }
1140  }
1141  }
1142  }
1143  /*------------------------------ LSI Configuration -------------------------*/
1144  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI)
1145  {
1146  /* Check the parameters */
1147  assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState));
1148 
1149  /* Check the LSI State */
1150  if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF)
1151  {
1152  /* Enable the Internal Low Speed oscillator (LSI). */
1154 
1155  /* Get Start Tick*/
1156  tickstart = HAL_GetTick();
1157 
1158  /* Wait till LSI is ready */
1160  {
1161  if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE)
1162  {
1163  return HAL_TIMEOUT;
1164  }
1165  }
1166  }
1167  else
1168  {
1169  /* Disable the Internal Low Speed oscillator (LSI). */
1171 
1172  /* Get Start Tick*/
1173  tickstart = HAL_GetTick();
1174 
1175  /* Wait till LSI is ready */
1177  {
1178  if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE)
1179  {
1180  return HAL_TIMEOUT;
1181  }
1182  }
1183  }
1184  }
1185  /*------------------------------ LSE Configuration -------------------------*/
1186  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE)
1187  {
1188  /* Check the parameters */
1189  assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState));
1190 
1191  /* Enable Power Clock*/
1193 
1194  /* Enable write access to Backup domain */
1195  PWR->CR1 |= PWR_CR1_DBP;
1196 
1197  /* Wait for Backup domain Write protection disable */
1198  tickstart = HAL_GetTick();
1199 
1200  while((PWR->CR1 & PWR_CR1_DBP) == RESET)
1201  {
1202  if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE)
1203  {
1204  return HAL_TIMEOUT;
1205  }
1206  }
1207 
1208  /* Set the new LSE configuration -----------------------------------------*/
1209  __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState);
1210  /* Check the LSE State */
1211  if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF)
1212  {
1213  /* Get Start Tick*/
1214  tickstart = HAL_GetTick();
1215 
1216  /* Wait till LSE is ready */
1218  {
1219  if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE)
1220  {
1221  return HAL_TIMEOUT;
1222  }
1223  }
1224  }
1225  else
1226  {
1227  /* Get Start Tick*/
1228  tickstart = HAL_GetTick();
1229 
1230  /* Wait till LSE is ready */
1232  {
1233  if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE)
1234  {
1235  return HAL_TIMEOUT;
1236  }
1237  }
1238  }
1239  }
1240  /*-------------------------------- PLL Configuration -----------------------*/
1241  /* Check the parameters */
1242  assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState));
1243  if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE)
1244  {
1245  /* Check if the PLL is used as system clock or not */
1247  {
1248  if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON)
1249  {
1250  /* Check the parameters */
1251  assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource));
1252  assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM));
1253  assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN));
1254  assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP));
1255  assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ));
1256  assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR));
1257 
1258  /* Disable the main PLL. */
1260 
1261  /* Get Start Tick*/
1262  tickstart = HAL_GetTick();
1263 
1264  /* Wait till PLL is ready */
1266  {
1267  if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE)
1268  {
1269  return HAL_TIMEOUT;
1270  }
1271  }
1272 
1273  /* Configure the main PLL clock source, multiplication and division factors. */
1274  __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource,
1275  RCC_OscInitStruct->PLL.PLLM,
1276  RCC_OscInitStruct->PLL.PLLN,
1277  RCC_OscInitStruct->PLL.PLLP,
1278  RCC_OscInitStruct->PLL.PLLQ,
1279  RCC_OscInitStruct->PLL.PLLR);
1280 
1281  /* Enable the main PLL. */
1283 
1284  /* Get Start Tick*/
1285  tickstart = HAL_GetTick();
1286 
1287  /* Wait till PLL is ready */
1289  {
1290  if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE)
1291  {
1292  return HAL_TIMEOUT;
1293  }
1294  }
1295  }
1296  else
1297  {
1298  /* Disable the main PLL. */
1300 
1301  /* Get Start Tick*/
1302  tickstart = HAL_GetTick();
1303 
1304  /* Wait till PLL is ready */
1306  {
1307  if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE)
1308  {
1309  return HAL_TIMEOUT;
1310  }
1311  }
1312  }
1313  }
1314  else
1315  {
1316  return HAL_ERROR;
1317  }
1318  }
1319  return HAL_OK;
1320 }
1321 #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */
1322 
1331 #endif /* HAL_RCC_MODULE_ENABLED */
1332 
1340 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
#define RCC_DBP_TIMEOUT_VALUE
#define RCC_TIMPRES_ACTIVATED
#define RCC_FLAG_PLLRDY
#define LSI_TIMEOUT_VALUE
#define __HAL_RCC_GET_SAI2_SOURCE()
Macro to get the SAI2 clock source.
#define IS_RCC_USART1CLKSOURCE(SOURCE)
#define IS_RCC_USART6CLKSOURCE(SOURCE)
#define IS_RCC_LSE(LSE)
#define __HAL_RCC_I2C3_CONFIG(__I2C3_CLKSOURCE__)
Macro to configure the I2C3 clock (I2C3CLK).
#define __HAL_RCC_LSI_ENABLE()
Macros to enable or disable the Internal Low Speed oscillator (LSI).
RCC_PLLI2SInitTypeDef PLLI2S
#define RCC_PERIPHCLK_I2S
#define __HAL_RCC_GET_I2C1_SOURCE()
Macro to get the I2C1 clock source.
#define IS_RCC_TIMPRES(VALUE)
#define RCC_BDCR_LSEON
Definition: stm32f745xx.h:5600
#define PLL_TIMEOUT_VALUE
#define RCC_PLLSAICFGR_PLLSAIN
Definition: stm32f745xx.h:5655
#define assert_param(expr)
Include module's header file.
#define IS_RCC_HSE(HSE)
#define __HAL_RCC_USART6_CONFIG(__USART6_CLKSOURCE__)
Macro to configure the USART6 clock (USART6CLK).
#define RCC_DCKCFGR1_TIMPRE
Definition: stm32f745xx.h:5705
#define HSI_VALUE
Internal High Speed oscillator (HSI) value. This value is used by the RCC HAL module to compute the s...
#define RCC_FLAG_HSIRDY
#define __HAL_RCC_I2S_CONFIG(__SOURCE__)
Macro to configure the I2S clock source (I2SCLK).
#define RCC_HSI_ON
#define __HAL_RCC_UART7_CONFIG(__UART7_CLKSOURCE__)
Macro to configure the UART7 clock (UART7CLK).
#define __HAL_RCC_SAI2_CONFIG(__SOURCE__)
Macro to configure SAI2 clock source selection.
#define IS_RCC_UART8CLKSOURCE(SOURCE)
#define __HAL_RCC_GET_UART7_SOURCE()
macro to get the UART7 clock source.
#define RCC_PERIPHCLK_RTC
#define __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(__HSICALIBRATIONVALUE__)
Macro to adjust the Internal High Speed oscillator (HSI) calibration value.
#define __HAL_RCC_I2C2_CONFIG(__I2C2_CLKSOURCE__)
Macro to configure the I2C2 clock (I2C2CLK).
#define __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(__PLLI2SDivQ__)
Macro to configure the SAI clock Divider coming from PLLI2S.
#define RCC_PLLSOURCE_HSI
#define __HAL_RCC_GET_USART6_SOURCE()
macro to get the USART6 clock source.
#define __HAL_RCC_CLK48_CONFIG(__CLK48_SOURCE__)
Macro to configure the CLK48 source (CLK48CLK).
HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit)
#define __HAL_RCC_UART8_CONFIG(__UART8_CLKSOURCE__)
Macro to configure the UART8 clock (UART8CLK).
#define IS_RCC_PLL(PLL)
#define __HAL_RCC_USART1_CONFIG(__USART1_CLKSOURCE__)
Macro to configure the USART1 clock (USART1CLK).
#define RCC_PERIPHCLK_I2C4
#define RCC_FLAG_HSERDY
#define __HAL_RCC_TIMCLKPRESCALER(__PRESC__)
Macro to configure the Timers clocks prescalers.
#define IS_RCC_PLLSAIQ_VALUE(VALUE)
#define __HAL_RCC_HSI_DISABLE()
#define __HAL_RCC_I2C4_CONFIG(__I2C4_CLKSOURCE__)
Macro to configure the I2C4 clock (I2C4CLK).
#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__)
Macro to configure the PLLSAI clock multiplication and division factors.
#define RCC_PERIPHCLK_SDMMC1
#define RCC_SAI2CLKSOURCE_PLLSAI
#define RCC_PLLSAICFGR_PLLSAIP
Definition: stm32f745xx.h:5665
#define __HAL_RCC_GET_USART3_SOURCE()
macro to get the USART3 clock source.
#define RCC_PERIPHCLK_I2C3
#define RCC_PERIPHCLK_UART7
#define IS_RCC_USART2CLKSOURCE(SOURCE)
#define RCC_DCKCFGR1_SAI2SEL_0
Definition: stm32f745xx.h:5702
#define IS_RCC_PLLP_VALUE(VALUE)
#define RCC_HSE_OFF
#define __HAL_RCC_GET_SAI1_SOURCE()
Macro to get the SAI1 clock source.
#define RCC_PERIPHCLK_CLK48
#define RCC_OSCILLATORTYPE_LSI
#define IS_RCC_PLLN_VALUE(VALUE)
RCC_PLLInitTypeDef PLL
#define __HAL_RCC_PLLI2S_DISABLE()
#define RCC_PLL_ON
#define __HAL_RCC_UART5_CONFIG(__UART5_CLKSOURCE__)
Macro to configure the UART5 clock (UART5CLK).
#define IS_RCC_CLK48SOURCE(SOURCE)
#define RCC_PERIPHCLK_USART3
#define IS_RCC_PLLI2SQ_VALUE(VALUE)
#define RCC_FLAG_LSERDY
#define RCC_PERIPHCLK_USART1
#define RCC
Definition: stm32f745xx.h:1325
#define PWR_CR1_DBP
Definition: stm32f745xx.h:4979
#define RCC_CLK48SOURCE_PLLSAIP
#define POSITION_VAL(VAL)
Definition: stm32f7xx.h:192
#define RCC_FLAG_PLLI2SRDY
#define __HAL_RCC_BACKUPRESET_FORCE()
Macros to force or release the Backup domain reset.
#define RCC_SAI1CLKSOURCE_PLLSAI
#define __HAL_RCC_LSE_CONFIG(__STATE__)
Macro to configure the External Low Speed oscillator (LSE).
#define __HAL_RCC_PWR_CLK_ENABLE()
#define IS_RCC_USART3CLKSOURCE(SOURCE)
#define IS_RCC_PLLI2SR_VALUE(VALUE)
#define RCC_PLLSAICFGR_PLLSAIR
Definition: stm32f745xx.h:5673
#define RCC_PERIPHCLK_UART4
#define IS_RCC_PLLSAI_DIVR_VALUE(VALUE)
#define RCC_SYSCLKSOURCE_STATUS_PLLCLK
#define __HAL_RCC_PLL_DISABLE()
#define HSE_VALUE
Adjust the value of External High Speed oscillator (HSE) used in your application. This value is used by the RCC HAL module to compute the system frequency (when HSE is used as system clock source, directly or through the PLL).
#define RCC_DCKCFGR1_SAI2SEL_1
Definition: stm32f745xx.h:5703
#define RCC_PLLCFGR_PLLSRC_HSE
Definition: stm32f745xx.h:5227
#define IS_RCC_LPTIM1CLK(SOURCE)
#define IS_RCC_UART5CLKSOURCE(SOURCE)
#define RCC_DCKCFGR1_PLLSAIDIVR
Definition: stm32f745xx.h:5693
#define EXTERNAL_CLOCK_VALUE
External clock source for I2S peripheral This value is used by the I2S HAL module to compute the I2S ...
#define __HAL_RCC_LPTIM1_CONFIG(__LPTIM1_CLKSOURCE__)
Macro to configure the LPTIM1 clock (LPTIM1CLK).
#define __HAL_RCC_GET_CLK48_SOURCE()
macro to get the CLK48 source.
#define IS_RCC_PLLSAIN_VALUE(VALUE)
#define __HAL_RCC_PLL_ENABLE()
Macros to enable or disable the main PLL.
#define __HAL_RCC_BACKUPRESET_RELEASE()
#define RCC_CFGR_RTCPRE
Definition: stm32f745xx.h:5295
#define RCC_PERIPHCLK_I2C1
#define IS_RCC_RTCCLKSOURCE(SOURCE)
#define RCC_PLLCFGR_PLLM
Definition: stm32f745xx.h:5206
#define __HAL_RCC_HSI_ENABLE()
Macros to enable or disable the Internal High Speed oscillator (HSI).
#define RCC_PLLSAICFGR_PLLSAIQ
Definition: stm32f745xx.h:5668
#define RCC_DCKCFGR1_PLLI2SDIVQ
Definition: stm32f745xx.h:5679
#define RCC_DCKCFGR1_SAI2SEL
Definition: stm32f745xx.h:5701
#define HSI_TIMEOUT_VALUE
#define __HAL_RCC_GET_FLAG(__FLAG__)
RCC extended clocks structure definition.
#define RCC_PLLCFGR_PLLSRC
Definition: stm32f745xx.h:5226
#define RCC_PLLI2SCFGR_PLLI2SN
Definition: stm32f745xx.h:5631
#define RCC_BDCR_RTCSEL
Definition: stm32f745xx.h:5606
#define IS_RCC_I2C4CLKSOURCE(SOURCE)
#define RCC_OSCILLATORTYPE_HSI
#define RCC_SAI2CLKSOURCE_PLLI2S
#define IS_RCC_I2SCLKSOURCE(SOURCE)
This file contains all the functions prototypes for the HAL module driver.
#define IS_RCC_UART4CLKSOURCE(SOURCE)
#define __HAL_RCC_GET_CEC_SOURCE()
macro to get the CEC clock source.
#define RCC_PERIPHCLK_UART8
#define __HAL_RCC_GET_UART8_SOURCE()
macro to get the UART8 clock source.
#define __HAL_RCC_GET_I2C3_SOURCE()
macro to get the I2C3 clock source.
#define RCC_DCKCFGR1_SAI1SEL_0
Definition: stm32f745xx.h:5698
#define RCC_DCKCFGR1_SAI1SEL_1
Definition: stm32f745xx.h:5699
void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit)
#define RCC_PERIPHCLK_UART5
#define PWR
Definition: stm32f745xx.h:1285
#define RCC_PERIPHCLK_SPDIFRX
#define RCC_PLL_NONE
#define IS_RCC_CALIBRATION_VALUE(VALUE)
#define __HAL_RCC_PLLI2S_ENABLE()
Macros to enable or disable the PLLI2S.
#define __HAL_RCC_CEC_CONFIG(__CEC_CLKSOURCE__)
Macro to configure the CEC clock (CECCLK).
#define RCC_PERIPHCLK_CEC
#define IS_RCC_PLLQ_VALUE(VALUE)
#define __HAL_RCC_RTC_CONFIG(__RTCCLKSource__)
#define __HAL_RCC_I2C1_CONFIG(__I2C1_CLKSOURCE__)
Macro to configure the I2C1 clock (I2C1CLK).
#define IS_RCC_CECCLKSOURCE(SOURCE)
#define RCC_SYSCLKSOURCE_STATUS_HSI
#define IS_RCC_SDMMC1CLKSOURCE(SOURCE)
#define HSE_TIMEOUT_VALUE
#define RCC_PLLI2SCFGR_PLLI2SQ
Definition: stm32f745xx.h:5644
#define IS_RCC_HSI(HSI)
#define RCC_OSCILLATORTYPE_HSE
#define __HAL_RCC_GET_USART2_SOURCE()
macro to get the USART2 clock source.
#define RCC_PLLI2SCFGR_PLLI2SP
Definition: stm32f745xx.h:5641
HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
#define IS_RCC_PLLSAI_DIVQ_VALUE(VALUE)
#define IS_RCC_I2C2CLKSOURCE(SOURCE)
RCC Internal/External Oscillator (HSE, HSI, LSE and LSI) configuration structure definition.
#define RCC_PERIPHCLK_PLLI2S
#define RCC_DCKCFGR1_PLLSAIDIVQ
Definition: stm32f745xx.h:5686
#define RCC_PERIPHCLK_SAI2
#define __HAL_RCC_GET_I2C2_SOURCE()
Macro to get the I2C2 clock source.
#define __HAL_RCC_GET_UART5_SOURCE()
macro to get the UART5 clock source.
#define __HAL_RCC_USART3_CONFIG(__USART3_CLKSOURCE__)
Macro to configure the USART3 clock (USART3CLK).
#define RCC_DCKCFGR1_SAI1SEL
Definition: stm32f745xx.h:5697
#define IS_RCC_PLLSAIP_VALUE(VALUE)
#define __HAL_RCC_SDMMC1_CONFIG(__SDMMC1_CLKSOURCE__)
Macro to configure the SDMMC1 clock (SDMMC1CLK).
#define HAL_IS_BIT_SET(REG, BIT)
#define RCC_PERIPHCLK_I2C2
#define RCC_HSI_OFF
#define __HAL_RCC_GET_USART1_SOURCE()
macro to get the USART1 clock source.
#define IS_RCC_UART7CLKSOURCE(SOURCE)
#define __HAL_RCC_USART2_CONFIG(__USART2_CLKSOURCE__)
Macro to configure the USART2 clock (USART2CLK).
uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk)
#define IS_RCC_PLLM_VALUE(VALUE)
#define __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(__PLLSAIDivR__)
Macro to configure the LTDC clock Divider coming from PLLSAI.
#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__)
Macro to configure the main PLL clock source, multiplication and division factors.
#define __HAL_RCC_GET_LPTIM1_SOURCE()
macro to get the LPTIM1 clock source.
#define __HAL_RCC_GET_I2C4_SOURCE()
macro to get the I2C4 clock source.
#define RCC_PERIPHCLK_LPTIM1
#define IS_RCC_PLLI2SP_VALUE(VALUE)
#define RCC_I2SCLKSOURCE_PLLI2S
#define RCC_PERIPHCLK_TIM
#define IS_RCC_PLLSOURCE(SOURCE)
#define __HAL_RCC_GET_SDMMC1_SOURCE()
macro to get the SDMMC1 clock source.
#define IS_RCC_OSCILLATORTYPE(OSCILLATOR)
#define RCC_TIMPRES_DESACTIVATED
#define __HAL_RCC_GET_UART4_SOURCE()
macro to get the UART4 clock source.
#define RCC_FLAG_LSIRDY
#define __HAL_RCC_UART4_CONFIG(__UART4_CLKSOURCE__)
Macro to configure the UART4 clock (UART4CLK).
#define IS_RCC_PLLI2SN_VALUE(VALUE)
#define RCC_PERIPHCLK_USART2
#define RCC_PERIPHCLK_SAI1
#define IS_RCC_LSI(LSI)
#define __HAL_RCC_HSE_CONFIG(__STATE__)
Macro to configure the External High Speed oscillator (HSE).
#define RCC_SAI1CLKSOURCE_PLLI2S
#define IS_RCC_I2C1CLKSOURCE(SOURCE)
HAL_StatusTypeDef
HAL Status structures definition.
#define IS_RCC_PLLSAIR_VALUE(VALUE)
#define RCC_OSCILLATORTYPE_LSE
#define RCC_LSI_OFF
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define RCC_SYSCLKSOURCE_STATUS_HSE
#define IS_RCC_PLLI2S_DIVQ_VALUE(VALUE)
#define RCC_LSE_TIMEOUT_VALUE
#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SN__, __PLLI2SP__, __PLLI2SQ__, __PLLI2SR__)
Macro to configure the PLLI2S clock multiplication and division factors.
#define __HAL_RCC_PLLSAI_GET_FLAG()
Check PLLSAI RDY flag is set or not.
#define RCC_LSE_OFF
#define __HAL_RCC_LSI_DISABLE()
#define __HAL_RCC_SAI1_CONFIG(__SOURCE__)
Macro to configure SAI1 clock source selection.
#define RCC_PLLCFGR_PLLSRC_HSI
Definition: stm32f745xx.h:5228
#define __HAL_RCC_PLLSAI_DISABLE()
#define __HAL_RCC_GET_I2SCLKSOURCE()
Macro to Get I2S clock source selection.
#define IS_RCC_I2C3CLKSOURCE(SOURCE)
#define __HAL_RCC_GET_SYSCLK_SOURCE()
Macro to get the clock source used as system clock.
#define RCC_PLLI2SCFGR_PLLI2SR
Definition: stm32f745xx.h:5649
#define __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(__PLLSAIDivQ__)
Macro to configure the SAI clock Divider coming from PLLSAI.
#define __HAL_RCC_PLLSAI_ENABLE()
Macros to Enable or Disable the PLLISAI.
RCC_PLLSAIInitTypeDef PLLSAI
#define RCC_PERIPHCLK_USART6