tdse-tp2_05-model_integration

Index Commits Files Refs README
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c (48748B)
   1 /**
   2   ******************************************************************************
   3   * @file    stm32f1xx_hal_rcc.c
   4   * @author  MCD Application Team
   5   * @brief   RCC HAL module driver.
   6   *          This file provides firmware functions to manage the following
   7   *          functionalities of the Reset and Clock Control (RCC) peripheral:
   8   *           + Initialization and de-initialization functions
   9   *           + Peripheral Control functions
  10   *
  11   @verbatim
  12   ==============================================================================
  13                       ##### RCC specific features #####
  14   ==============================================================================
  15     [..]
  16       After reset the device is running from Internal High Speed oscillator
  17       (HSI 8MHz) with Flash 0 wait state, Flash prefetch buffer is enabled,
  18       and all peripherals are off except internal SRAM, Flash and JTAG.
  19       (+) There is no prescaler on High speed (AHB) and Low speed (APB) buses;
  20           all peripherals mapped on these buses are running at HSI speed.
  21       (+) The clock for all peripherals is switched off, except the SRAM and FLASH.
  22       (+) All GPIOs are in input floating state, except the JTAG pins which
  23           are assigned to be used for debug purpose.
  24     [..] Once the device started from reset, the user application has to:
  25       (+) Configure the clock source to be used to drive the System clock
  26           (if the application needs higher frequency/performance)
  27       (+) Configure the System clock frequency and Flash settings
  28       (+) Configure the AHB and APB buses prescalers
  29       (+) Enable the clock for the peripheral(s) to be used
  30       (+) Configure the clock source(s) for peripherals whose clocks are not
  31           derived from the System clock (I2S, RTC, ADC, USB OTG FS)
  32 
  33                       ##### RCC Limitations #####
  34   ==============================================================================
  35     [..]
  36       A delay between an RCC peripheral clock enable and the effective peripheral
  37       enabling should be taken into account in order to manage the peripheral read/write
  38       from/to registers.
  39       (+) This delay depends on the peripheral mapping.
  40         (++) AHB & APB peripherals, 1 dummy read is necessary
  41 
  42     [..]
  43       Workarounds:
  44       (#) For AHB & APB peripherals, a dummy read to the peripheral register has been
  45           inserted in each __HAL_RCC_PPP_CLK_ENABLE() macro.
  46 
  47   @endverbatim
  48   ******************************************************************************
  49   * @attention
  50   *
  51   * Copyright (c) 2016 STMicroelectronics.
  52   * All rights reserved.
  53   *
  54   * This software is licensed under terms that can be found in the LICENSE file in
  55   * the root directory of this software component.
  56   * If no LICENSE file comes with this software, it is provided AS-IS.
  57   ******************************************************************************
  58   */
  59 
  60 /* Includes ------------------------------------------------------------------*/
  61 #include "stm32f1xx_hal.h"
  62 
  63 /** @addtogroup STM32F1xx_HAL_Driver
  64   * @{
  65   */
  66 
  67 /** @defgroup RCC RCC
  68 * @brief RCC HAL module driver
  69   * @{
  70   */
  71 
  72 #ifdef HAL_RCC_MODULE_ENABLED
  73 
  74 /* Private typedef -----------------------------------------------------------*/
  75 /* Private define ------------------------------------------------------------*/
  76 /** @defgroup RCC_Private_Constants RCC Private Constants
  77  * @{
  78  */
  79 /**
  80   * @}
  81   */
  82 /* Private macro -------------------------------------------------------------*/
  83 /** @defgroup RCC_Private_Macros RCC Private Macros
  84   * @{
  85   */
  86 
  87 #define MCO1_CLK_ENABLE()     __HAL_RCC_GPIOA_CLK_ENABLE()
  88 #define MCO1_GPIO_PORT        GPIOA
  89 #define MCO1_PIN              GPIO_PIN_8
  90 
  91 /**
  92   * @}
  93   */
  94 
  95 /* Private variables ---------------------------------------------------------*/
  96 /** @defgroup RCC_Private_Variables RCC Private Variables
  97   * @{
  98   */
  99 /**
 100   * @}
 101   */
 102 
 103 /* Private function prototypes -----------------------------------------------*/
 104 static void RCC_Delay(uint32_t mdelay);
 105 
 106 /* Exported functions --------------------------------------------------------*/
 107 
 108 /** @defgroup RCC_Exported_Functions RCC Exported Functions
 109   * @{
 110   */
 111 
 112 /** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions
 113   *  @brief    Initialization and Configuration functions
 114   *
 115   @verbatim
 116   ===============================================================================
 117            ##### Initialization and de-initialization functions #####
 118   ===============================================================================
 119     [..]
 120       This section provides functions allowing to configure the internal/external oscillators
 121       (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System buses clocks (SYSCLK, AHB, APB1
 122       and APB2).
 123 
 124     [..] Internal/external clock and PLL configuration
 125       (#) HSI (high-speed internal), 8 MHz factory-trimmed RC used directly or through
 126           the PLL as System clock source.
 127       (#) LSI (low-speed internal), ~40 KHz low consumption RC used as IWDG and/or RTC
 128           clock source.
 129 
 130       (#) HSE (high-speed external), 4 to 24 MHz (STM32F100xx) or 4 to 16 MHz (STM32F101x/STM32F102x/STM32F103x) or 3 to 25 MHz (STM32F105x/STM32F107x)  crystal oscillator used directly or
 131           through the PLL as System clock source. Can be used also as RTC clock source.
 132 
 133       (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source.
 134 
 135       (#) PLL (clocked by HSI or HSE), featuring different output clocks:
 136         (++) The first output is used to generate the high speed system clock (up to 72 MHz for STM32F10xxx or up to 24 MHz for STM32F100xx)
 137         (++) The second output is used to generate the clock for the USB OTG FS (48 MHz)
 138 
 139       (#) CSS (Clock security system), once enable using the macro __HAL_RCC_CSS_ENABLE()
 140           and if a HSE clock failure occurs(HSE used directly or through PLL as System
 141           clock source), the System clocks automatically switched to HSI and an interrupt
 142           is generated if enabled. The interrupt is linked to the Cortex-M3 NMI
 143           (Non-Maskable Interrupt) exception vector.
 144 
 145       (#) MCO1 (microcontroller clock output), used to output SYSCLK, HSI,
 146           HSE or PLL clock (divided by 2) on PA8 pin + PLL2CLK, PLL3CLK/2, PLL3CLK and XTI for STM32F105x/STM32F107x
 147 
 148     [..] System, AHB and APB buses clocks configuration
 149       (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI,
 150           HSE and PLL.
 151           The AHB clock (HCLK) is derived from System clock through configurable
 152           prescaler and used to clock the CPU, memory and peripherals mapped
 153           on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived
 154           from AHB clock through configurable prescalers and used to clock
 155           the peripherals mapped on these buses. You can use
 156           "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks.
 157 
 158       -@- All the peripheral clocks are derived from the System clock (SYSCLK) except:
 159           (+@) RTC: RTC clock can be derived either from the LSI, LSE or HSE clock
 160               divided by 128.
 161           (+@) USB OTG FS and RTC: USB OTG FS require a frequency equal to 48 MHz
 162               to work correctly. This clock is derived of the main PLL through PLL Multiplier.
 163           (+@) I2S interface on STM32F105x/STM32F107x can be derived from PLL3CLK
 164           (+@) IWDG clock which is always the LSI clock.
 165 
 166       (#) For STM32F10xxx, the maximum frequency of the SYSCLK and HCLK/PCLK2 is 72 MHz, PCLK1 36 MHz.
 167           For STM32F100xx, the maximum frequency of the SYSCLK and HCLK/PCLK1/PCLK2 is 24 MHz.
 168           Depending on the SYSCLK frequency, the flash latency should be adapted accordingly.
 169   @endverbatim
 170   * @{
 171   */
 172 
 173 /*
 174   Additional consideration on the SYSCLK based on Latency settings:
 175         +-----------------------------------------------+
 176         | Latency       | SYSCLK clock frequency (MHz)  |
 177         |---------------|-------------------------------|
 178         |0WS(1CPU cycle)|       0 < SYSCLK <= 24        |
 179         |---------------|-------------------------------|
 180         |1WS(2CPU cycle)|      24 < SYSCLK <= 48        |
 181         |---------------|-------------------------------|
 182         |2WS(3CPU cycle)|      48 < SYSCLK <= 72        |
 183         +-----------------------------------------------+
 184   */
 185 
 186 /**
 187   * @brief  Resets the RCC clock configuration to the default reset state.
 188   * @note   The default reset state of the clock configuration is given below:
 189   *            - HSI ON and used as system clock source
 190   *            - HSE, PLL, PLL2 and PLL3 are OFF
 191   *            - AHB, APB1 and APB2 prescaler set to 1.
 192   *            - CSS and MCO1 OFF
 193   *            - All interrupts disabled
 194   *            - All flags are cleared
 195   * @note   This function does not modify the configuration of the
 196   *            - Peripheral clocks
 197   *            - LSI, LSE and RTC clocks
 198   * @retval HAL_StatusTypeDef
 199   */
 200 HAL_StatusTypeDef HAL_RCC_DeInit(void)
 201 {
 202   uint32_t tickstart;
 203 
 204   /* Get Start Tick */
 205   tickstart = HAL_GetTick();
 206 
 207   /* Set HSION bit */
 208   SET_BIT(RCC->CR, RCC_CR_HSION);
 209 
 210   /* Wait till HSI is ready */
 211   while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET)
 212   {
 213     if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)
 214     {
 215       return HAL_TIMEOUT;
 216     }
 217   }
 218 
 219   /* Set HSITRIM bits to the reset value */
 220   MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, (0x10U << RCC_CR_HSITRIM_Pos));
 221 
 222   /* Get Start Tick */
 223   tickstart = HAL_GetTick();
 224 
 225   /* Reset CFGR register */
 226   CLEAR_REG(RCC->CFGR);
 227 
 228   /* Wait till clock switch is ready */
 229   while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RESET)
 230   {
 231     if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE)
 232     {
 233       return HAL_TIMEOUT;
 234     }
 235   }
 236 
 237   /* Update the SystemCoreClock global variable */
 238   SystemCoreClock = HSI_VALUE;
 239 
 240   /* Adapt Systick interrupt period */
 241   if (HAL_InitTick(uwTickPrio) != HAL_OK)
 242   {
 243     return HAL_ERROR;
 244   }
 245 
 246   /* Get Start Tick */
 247   tickstart = HAL_GetTick();
 248 
 249   /* Second step is to clear PLLON bit */
 250   CLEAR_BIT(RCC->CR, RCC_CR_PLLON);
 251 
 252   /* Wait till PLL is disabled */
 253   while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RESET)
 254   {
 255     if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
 256     {
 257       return HAL_TIMEOUT;
 258     }
 259   }
 260 
 261   /* Ensure to reset PLLSRC and PLLMUL bits */
 262   CLEAR_REG(RCC->CFGR);
 263 
 264   /* Get Start Tick */
 265   tickstart = HAL_GetTick();
 266 
 267   /* Reset HSEON & CSSON bits */
 268   CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_CSSON);
 269 
 270   /* Wait till HSE is disabled */
 271   while (READ_BIT(RCC->CR, RCC_CR_HSERDY) != RESET)
 272   {
 273     if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
 274     {
 275       return HAL_TIMEOUT;
 276     }
 277   }
 278 
 279   /* Reset HSEBYP bit */
 280   CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP);
 281 
 282 #if defined(RCC_PLL2_SUPPORT)
 283   /* Get Start Tick */
 284   tickstart = HAL_GetTick();
 285 
 286   /* Clear PLL2ON bit */
 287   CLEAR_BIT(RCC->CR, RCC_CR_PLL2ON);
 288 
 289   /* Wait till PLL2 is disabled */
 290   while (READ_BIT(RCC->CR, RCC_CR_PLL2RDY) != RESET)
 291   {
 292     if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE)
 293     {
 294       return HAL_TIMEOUT;
 295     }
 296   }
 297 #endif /* RCC_PLL2_SUPPORT */
 298 
 299 #if defined(RCC_PLLI2S_SUPPORT)
 300   /* Get Start Tick */
 301   tickstart = HAL_GetTick();
 302 
 303   /* Clear PLL3ON bit */
 304   CLEAR_BIT(RCC->CR, RCC_CR_PLL3ON);
 305 
 306   /* Wait till PLL3 is disabled */
 307   while (READ_BIT(RCC->CR, RCC_CR_PLL3RDY) != RESET)
 308   {
 309     if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE)
 310     {
 311       return HAL_TIMEOUT;
 312     }
 313   }
 314 #endif /* RCC_PLLI2S_SUPPORT */
 315 
 316 #if defined(RCC_CFGR2_PREDIV1)
 317   /* Reset CFGR2 register */
 318   CLEAR_REG(RCC->CFGR2);
 319 #endif /* RCC_CFGR2_PREDIV1 */
 320 
 321   /* Reset all CSR flags */
 322   SET_BIT(RCC->CSR, RCC_CSR_RMVF);
 323 
 324   /* Disable all interrupts */
 325   CLEAR_REG(RCC->CIR);
 326 
 327   return HAL_OK;
 328 }
 329 
 330 /**
 331   * @brief  Initializes the RCC Oscillators according to the specified parameters in the
 332   *         RCC_OscInitTypeDef.
 333   * @param  RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that
 334   *         contains the configuration information for the RCC Oscillators.
 335   * @note   The PLL is not disabled when used as system clock.
 336   * @note   The PLL is not disabled when USB OTG FS clock is enabled (specific to devices with USB FS)
 337   * @note   Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not
 338   *         supported by this macro. User should request a transition to LSE Off
 339   *         first and then LSE On or LSE Bypass.
 340   * @note   Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not
 341   *         supported by this macro. User should request a transition to HSE Off
 342   *         first and then HSE On or HSE Bypass.
 343   * @retval HAL status
 344   */
 345 HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)
 346 {
 347   uint32_t tickstart;
 348   uint32_t pll_config;
 349 
 350   /* Check Null pointer */
 351   if (RCC_OscInitStruct == NULL)
 352   {
 353     return HAL_ERROR;
 354   }
 355 
 356   /* Check the parameters */
 357   assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType));
 358 
 359   /*------------------------------- HSE Configuration ------------------------*/
 360   if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE)
 361   {
 362     /* Check the parameters */
 363     assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState));
 364 
 365     /* When the HSE is used as system clock or clock source for PLL in these cases it is not allowed to be disabled */
 366     if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE)
 367         || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE)))
 368     {
 369       if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF))
 370       {
 371         return HAL_ERROR;
 372       }
 373     }
 374     else
 375     {
 376       /* Set the new HSE configuration ---------------------------------------*/
 377       __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState);
 378 
 379 
 380       /* Check the HSE State */
 381       if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF)
 382       {
 383         /* Get Start Tick */
 384         tickstart = HAL_GetTick();
 385 
 386         /* Wait till HSE is ready */
 387         while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET)
 388         {
 389           if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
 390           {
 391             return HAL_TIMEOUT;
 392           }
 393         }
 394       }
 395       else
 396       {
 397         /* Get Start Tick */
 398         tickstart = HAL_GetTick();
 399 
 400         /* Wait till HSE is disabled */
 401         while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET)
 402         {
 403           if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
 404           {
 405             return HAL_TIMEOUT;
 406           }
 407         }
 408       }
 409     }
 410   }
 411   /*----------------------------- HSI Configuration --------------------------*/
 412   if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI)
 413   {
 414     /* Check the parameters */
 415     assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState));
 416     assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue));
 417 
 418     /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */
 419     if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI)
 420         || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSI_DIV2)))
 421     {
 422       /* When HSI is used as system clock it will not disabled */
 423       if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON))
 424       {
 425         return HAL_ERROR;
 426       }
 427       /* Otherwise, just the calibration is allowed */
 428       else
 429       {
 430         /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/
 431         __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue);
 432       }
 433     }
 434     else
 435     {
 436       /* Check the HSI State */
 437       if (RCC_OscInitStruct->HSIState != RCC_HSI_OFF)
 438       {
 439         /* Enable the Internal High Speed oscillator (HSI). */
 440         __HAL_RCC_HSI_ENABLE();
 441 
 442         /* Get Start Tick */
 443         tickstart = HAL_GetTick();
 444 
 445         /* Wait till HSI is ready */
 446         while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET)
 447         {
 448           if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)
 449           {
 450             return HAL_TIMEOUT;
 451           }
 452         }
 453 
 454         /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/
 455         __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue);
 456       }
 457       else
 458       {
 459         /* Disable the Internal High Speed oscillator (HSI). */
 460         __HAL_RCC_HSI_DISABLE();
 461 
 462         /* Get Start Tick */
 463         tickstart = HAL_GetTick();
 464 
 465         /* Wait till HSI is disabled */
 466         while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET)
 467         {
 468           if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)
 469           {
 470             return HAL_TIMEOUT;
 471           }
 472         }
 473       }
 474     }
 475   }
 476   /*------------------------------ LSI Configuration -------------------------*/
 477   if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI)
 478   {
 479     /* Check the parameters */
 480     assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState));
 481 
 482     /* Check the LSI State */
 483     if (RCC_OscInitStruct->LSIState != RCC_LSI_OFF)
 484     {
 485       /* Enable the Internal Low Speed oscillator (LSI). */
 486       __HAL_RCC_LSI_ENABLE();
 487 
 488       /* Get Start Tick */
 489       tickstart = HAL_GetTick();
 490 
 491       /* Wait till LSI is ready */
 492       while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET)
 493       {
 494         if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE)
 495         {
 496           return HAL_TIMEOUT;
 497         }
 498       }
 499       /*  To have a fully stabilized clock in the specified range, a software delay of 1ms
 500           should be added.*/
 501       RCC_Delay(1);
 502     }
 503     else
 504     {
 505       /* Disable the Internal Low Speed oscillator (LSI). */
 506       __HAL_RCC_LSI_DISABLE();
 507 
 508       /* Get Start Tick */
 509       tickstart = HAL_GetTick();
 510 
 511       /* Wait till LSI is disabled */
 512       while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET)
 513       {
 514         if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE)
 515         {
 516           return HAL_TIMEOUT;
 517         }
 518       }
 519     }
 520   }
 521   /*------------------------------ LSE Configuration -------------------------*/
 522   if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE)
 523   {
 524     FlagStatus       pwrclkchanged = RESET;
 525 
 526     /* Check the parameters */
 527     assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState));
 528 
 529     /* Update LSE configuration in Backup Domain control register    */
 530     /* Requires to enable write access to Backup Domain of necessary */
 531     if (__HAL_RCC_PWR_IS_CLK_DISABLED())
 532     {
 533       __HAL_RCC_PWR_CLK_ENABLE();
 534       pwrclkchanged = SET;
 535     }
 536 
 537     if (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP))
 538     {
 539       /* Enable write access to Backup domain */
 540       SET_BIT(PWR->CR, PWR_CR_DBP);
 541 
 542       /* Wait for Backup domain Write protection disable */
 543       tickstart = HAL_GetTick();
 544 
 545       while (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP))
 546       {
 547         if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE)
 548         {
 549           return HAL_TIMEOUT;
 550         }
 551       }
 552     }
 553 
 554     /* Set the new LSE configuration -----------------------------------------*/
 555     __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState);
 556     /* Check the LSE State */
 557     if (RCC_OscInitStruct->LSEState != RCC_LSE_OFF)
 558     {
 559       /* Get Start Tick */
 560       tickstart = HAL_GetTick();
 561 
 562       /* Wait till LSE is ready */
 563       while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET)
 564       {
 565         if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)
 566         {
 567           return HAL_TIMEOUT;
 568         }
 569       }
 570     }
 571     else
 572     {
 573       /* Get Start Tick */
 574       tickstart = HAL_GetTick();
 575 
 576       /* Wait till LSE is disabled */
 577       while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET)
 578       {
 579         if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)
 580         {
 581           return HAL_TIMEOUT;
 582         }
 583       }
 584     }
 585 
 586     /* Require to disable power clock if necessary */
 587     if (pwrclkchanged == SET)
 588     {
 589       __HAL_RCC_PWR_CLK_DISABLE();
 590     }
 591   }
 592 
 593 #if defined(RCC_CR_PLL2ON)
 594   /*-------------------------------- PLL2 Configuration -----------------------*/
 595   /* Check the parameters */
 596   assert_param(IS_RCC_PLL2(RCC_OscInitStruct->PLL2.PLL2State));
 597   if ((RCC_OscInitStruct->PLL2.PLL2State) != RCC_PLL2_NONE)
 598   {
 599     /* This bit can not be cleared if the PLL2 clock is used indirectly as system
 600       clock (i.e. it is used as PLL clock entry that is used as system clock). */
 601     if ((__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE) && \
 602         (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && \
 603         ((READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC)) == RCC_CFGR2_PREDIV1SRC_PLL2))
 604     {
 605       return HAL_ERROR;
 606     }
 607     else
 608     {
 609       if ((RCC_OscInitStruct->PLL2.PLL2State) == RCC_PLL2_ON)
 610       {
 611         /* Check the parameters */
 612         assert_param(IS_RCC_PLL2_MUL(RCC_OscInitStruct->PLL2.PLL2MUL));
 613         assert_param(IS_RCC_HSE_PREDIV2(RCC_OscInitStruct->PLL2.HSEPrediv2Value));
 614 
 615         /* Prediv2 can be written only when the PLLI2S is disabled. */
 616         /* Return an error only if new value is different from the programmed value */
 617         if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLL3ON) && \
 618             (__HAL_RCC_HSE_GET_PREDIV2() != RCC_OscInitStruct->PLL2.HSEPrediv2Value))
 619         {
 620           return HAL_ERROR;
 621         }
 622 
 623         /* Disable the main PLL2. */
 624         __HAL_RCC_PLL2_DISABLE();
 625 
 626         /* Get Start Tick */
 627         tickstart = HAL_GetTick();
 628 
 629         /* Wait till PLL2 is disabled */
 630         while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) != RESET)
 631         {
 632           if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE)
 633           {
 634             return HAL_TIMEOUT;
 635           }
 636         }
 637 
 638         /* Configure the HSE prediv2 factor --------------------------------*/
 639         __HAL_RCC_HSE_PREDIV2_CONFIG(RCC_OscInitStruct->PLL2.HSEPrediv2Value);
 640 
 641         /* Configure the main PLL2 multiplication factors. */
 642         __HAL_RCC_PLL2_CONFIG(RCC_OscInitStruct->PLL2.PLL2MUL);
 643 
 644         /* Enable the main PLL2. */
 645         __HAL_RCC_PLL2_ENABLE();
 646 
 647         /* Get Start Tick */
 648         tickstart = HAL_GetTick();
 649 
 650         /* Wait till PLL2 is ready */
 651         while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY)  == RESET)
 652         {
 653           if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE)
 654           {
 655             return HAL_TIMEOUT;
 656           }
 657         }
 658       }
 659       else
 660       {
 661         /* Set PREDIV1 source to HSE */
 662         CLEAR_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC);
 663 
 664         /* Disable the main PLL2. */
 665         __HAL_RCC_PLL2_DISABLE();
 666 
 667         /* Get Start Tick */
 668         tickstart = HAL_GetTick();
 669 
 670         /* Wait till PLL2 is disabled */
 671         while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY)  != RESET)
 672         {
 673           if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE)
 674           {
 675             return HAL_TIMEOUT;
 676           }
 677         }
 678       }
 679     }
 680   }
 681 
 682 #endif /* RCC_CR_PLL2ON */
 683   /*-------------------------------- PLL Configuration -----------------------*/
 684   /* Check the parameters */
 685   assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState));
 686   if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE)
 687   {
 688     /* Check if the PLL is used as system clock or not */
 689     if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK)
 690     {
 691       if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON)
 692       {
 693         /* Check the parameters */
 694         assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource));
 695         assert_param(IS_RCC_PLL_MUL(RCC_OscInitStruct->PLL.PLLMUL));
 696 
 697         /* Disable the main PLL. */
 698         __HAL_RCC_PLL_DISABLE();
 699 
 700         /* Get Start Tick */
 701         tickstart = HAL_GetTick();
 702 
 703         /* Wait till PLL is disabled */
 704         while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY)  != RESET)
 705         {
 706           if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
 707           {
 708             return HAL_TIMEOUT;
 709           }
 710         }
 711 
 712         /* Configure the HSE prediv factor --------------------------------*/
 713         /* It can be written only when the PLL is disabled. Not used in PLL source is different than HSE */
 714         if (RCC_OscInitStruct->PLL.PLLSource == RCC_PLLSOURCE_HSE)
 715         {
 716           /* Check the parameter */
 717           assert_param(IS_RCC_HSE_PREDIV(RCC_OscInitStruct->HSEPredivValue));
 718 #if defined(RCC_CFGR2_PREDIV1SRC)
 719           assert_param(IS_RCC_PREDIV1_SOURCE(RCC_OscInitStruct->Prediv1Source));
 720 
 721           /* Set PREDIV1 source */
 722           SET_BIT(RCC->CFGR2, RCC_OscInitStruct->Prediv1Source);
 723 #endif /* RCC_CFGR2_PREDIV1SRC */
 724 
 725           /* Set PREDIV1 Value */
 726           __HAL_RCC_HSE_PREDIV_CONFIG(RCC_OscInitStruct->HSEPredivValue);
 727         }
 728 
 729         /* Configure the main PLL clock source and multiplication factors. */
 730         __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource,
 731                              RCC_OscInitStruct->PLL.PLLMUL);
 732         /* Enable the main PLL. */
 733         __HAL_RCC_PLL_ENABLE();
 734 
 735         /* Get Start Tick */
 736         tickstart = HAL_GetTick();
 737 
 738         /* Wait till PLL is ready */
 739         while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY)  == RESET)
 740         {
 741           if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
 742           {
 743             return HAL_TIMEOUT;
 744           }
 745         }
 746       }
 747       else
 748       {
 749         /* Disable the main PLL. */
 750         __HAL_RCC_PLL_DISABLE();
 751 
 752         /* Get Start Tick */
 753         tickstart = HAL_GetTick();
 754 
 755         /* Wait till PLL is disabled */
 756         while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY)  != RESET)
 757         {
 758           if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
 759           {
 760             return HAL_TIMEOUT;
 761           }
 762         }
 763       }
 764     }
 765     else
 766     {
 767       /* Check if there is a request to disable the PLL used as System clock source */
 768       if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF)
 769       {
 770         return HAL_ERROR;
 771       }
 772       else
 773       {
 774         /* Do not return HAL_ERROR if request repeats the current configuration */
 775         pll_config = RCC->CFGR;
 776         if ((READ_BIT(pll_config, RCC_CFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) ||
 777             (READ_BIT(pll_config, RCC_CFGR_PLLMULL) != RCC_OscInitStruct->PLL.PLLMUL))
 778         {
 779           return HAL_ERROR;
 780         }
 781       }
 782     }
 783   }
 784 
 785   return HAL_OK;
 786 }
 787 
 788 /**
 789   * @brief  Initializes the CPU, AHB and APB buses clocks according to the specified
 790   *         parameters in the RCC_ClkInitStruct.
 791   * @param  RCC_ClkInitStruct pointer to an RCC_OscInitTypeDef structure that
 792   *         contains the configuration information for the RCC peripheral.
 793   * @param  FLatency FLASH Latency
 794   *          The value of this parameter depend on device used within the same series
 795   * @note   The SystemCoreClock CMSIS variable is used to store System Clock Frequency
 796   *         and updated by @ref HAL_RCC_GetHCLKFreq() function called within this function
 797   *
 798   * @note   The HSI is used (enabled by hardware) as system clock source after
 799   *         start-up from Reset, wake-up from STOP and STANDBY mode, or in case
 800   *         of failure of the HSE used directly or indirectly as system clock
 801   *         (if the Clock Security System CSS is enabled).
 802   *
 803   * @note   A switch from one clock source to another occurs only if the target
 804   *         clock source is ready (clock stable after start-up delay or PLL locked).
 805   *         If a clock source which is not yet ready is selected, the switch will
 806   *         occur when the clock source will be ready.
 807   *         You can use @ref HAL_RCC_GetClockConfig() function to know which clock is
 808   *         currently used as system clock source.
 809   * @retval HAL status
 810   */
 811 HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t FLatency)
 812 {
 813   uint32_t tickstart;
 814 
 815   /* Check Null pointer */
 816   if (RCC_ClkInitStruct == NULL)
 817   {
 818     return HAL_ERROR;
 819   }
 820 
 821   /* Check the parameters */
 822   assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType));
 823   assert_param(IS_FLASH_LATENCY(FLatency));
 824 
 825   /* To correctly read data from FLASH memory, the number of wait states (LATENCY)
 826   must be correctly programmed according to the frequency of the CPU clock
 827     (HCLK) of the device. */
 828 
 829 #if defined(FLASH_ACR_LATENCY)
 830   /* Increasing the number of wait states because of higher CPU frequency */
 831   if (FLatency > __HAL_FLASH_GET_LATENCY())
 832   {
 833     /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
 834     __HAL_FLASH_SET_LATENCY(FLatency);
 835 
 836     /* Check that the new number of wait states is taken into account to access the Flash
 837     memory by reading the FLASH_ACR register */
 838     if (__HAL_FLASH_GET_LATENCY() != FLatency)
 839   {
 840     return HAL_ERROR;
 841   }
 842 }
 843 
 844 #endif /* FLASH_ACR_LATENCY */
 845 /*-------------------------- HCLK Configuration --------------------------*/
 846 if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK)
 847   {
 848     /* Set the highest APBx dividers in order to ensure that we do not go through
 849     a non-spec phase whatever we decrease or increase HCLK. */
 850     if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1)
 851     {
 852       MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16);
 853     }
 854 
 855     if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2)
 856     {
 857       MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3));
 858     }
 859 
 860     /* Set the new HCLK clock divider */
 861     assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider));
 862     MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider);
 863   }
 864 
 865   /*------------------------- SYSCLK Configuration ---------------------------*/
 866   if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK)
 867   {
 868     assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource));
 869 
 870     /* HSE is selected as System Clock Source */
 871     if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE)
 872     {
 873       /* Check the HSE ready flag */
 874       if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET)
 875       {
 876         return HAL_ERROR;
 877       }
 878     }
 879     /* PLL is selected as System Clock Source */
 880     else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK)
 881     {
 882       /* Check the PLL ready flag */
 883       if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET)
 884       {
 885         return HAL_ERROR;
 886       }
 887     }
 888     /* HSI is selected as System Clock Source */
 889     else
 890     {
 891       /* Check the HSI ready flag */
 892       if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET)
 893       {
 894         return HAL_ERROR;
 895       }
 896     }
 897     __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource);
 898 
 899     /* Get Start Tick */
 900     tickstart = HAL_GetTick();
 901 
 902     while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos))
 903     {
 904       if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE)
 905       {
 906         return HAL_TIMEOUT;
 907       }
 908     }
 909   }
 910 
 911 #if defined(FLASH_ACR_LATENCY)
 912   /* Decreasing the number of wait states because of lower CPU frequency */
 913   if (FLatency < __HAL_FLASH_GET_LATENCY())
 914   {
 915     /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
 916     __HAL_FLASH_SET_LATENCY(FLatency);
 917 
 918     /* Check that the new number of wait states is taken into account to access the Flash
 919     memory by reading the FLASH_ACR register */
 920     if (__HAL_FLASH_GET_LATENCY() != FLatency)
 921   {
 922     return HAL_ERROR;
 923   }
 924 }
 925 #endif /* FLASH_ACR_LATENCY */
 926 
 927 /*-------------------------- PCLK1 Configuration ---------------------------*/
 928 if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1)
 929   {
 930     assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider));
 931     MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider);
 932   }
 933 
 934   /*-------------------------- PCLK2 Configuration ---------------------------*/
 935   if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2)
 936   {
 937     assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider));
 938     MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3));
 939   }
 940 
 941   /* Update the SystemCoreClock global variable */
 942   SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos];
 943 
 944   /* Configure the source of time base considering new system clocks settings*/
 945   HAL_InitTick(uwTickPrio);
 946 
 947   return HAL_OK;
 948 }
 949 
 950 /**
 951   * @}
 952   */
 953 
 954 /** @defgroup RCC_Exported_Functions_Group2 Peripheral Control functions
 955   *  @brief   RCC clocks control functions
 956   *
 957   @verbatim
 958   ===============================================================================
 959                   ##### Peripheral Control functions #####
 960   ===============================================================================
 961     [..]
 962     This subsection provides a set of functions allowing to control the RCC Clocks
 963     frequencies.
 964 
 965   @endverbatim
 966   * @{
 967   */
 968 
 969 /**
 970   * @brief  Selects the clock source to output on MCO pin.
 971   * @note   MCO pin should be configured in alternate function mode.
 972   * @param  RCC_MCOx specifies the output direction for the clock source.
 973   *          This parameter can be one of the following values:
 974   *            @arg @ref RCC_MCO1 Clock source to output on MCO1 pin(PA8).
 975   * @param  RCC_MCOSource specifies the clock source to output.
 976   *          This parameter can be one of the following values:
 977   *            @arg @ref RCC_MCO1SOURCE_NOCLOCK     No clock selected as MCO clock
 978   *            @arg @ref RCC_MCO1SOURCE_SYSCLK      System clock selected as MCO clock
 979   *            @arg @ref RCC_MCO1SOURCE_HSI         HSI selected as MCO clock
 980   *            @arg @ref RCC_MCO1SOURCE_HSE         HSE selected as MCO clock
 981   @if STM32F105xC
 982   *            @arg @ref RCC_MCO1SOURCE_PLLCLK       PLL clock divided by 2 selected as MCO source
 983   *            @arg @ref RCC_MCO1SOURCE_PLL2CLK      PLL2 clock selected as MCO source
 984   *            @arg @ref RCC_MCO1SOURCE_PLL3CLK_DIV2 PLL3 clock divided by 2 selected as MCO source
 985   *            @arg @ref RCC_MCO1SOURCE_EXT_HSE      XT1 external 3-25 MHz oscillator clock selected as MCO source
 986   *            @arg @ref RCC_MCO1SOURCE_PLL3CLK      PLL3 clock selected as MCO source
 987   @endif
 988   @if STM32F107xC
 989   *            @arg @ref RCC_MCO1SOURCE_PLLCLK       PLL clock divided by 2 selected as MCO source
 990   *            @arg @ref RCC_MCO1SOURCE_PLL2CLK      PLL2 clock selected as MCO source
 991   *            @arg @ref RCC_MCO1SOURCE_PLL3CLK_DIV2 PLL3 clock divided by 2 selected as MCO source
 992   *            @arg @ref RCC_MCO1SOURCE_EXT_HSE XT1  external 3-25 MHz oscillator clock selected as MCO source
 993   *            @arg @ref RCC_MCO1SOURCE_PLL3CLK      PLL3 clock selected as MCO source
 994   @endif
 995   * @param  RCC_MCODiv specifies the MCO DIV.
 996   *          This parameter can be one of the following values:
 997   *            @arg @ref RCC_MCODIV_1 no division applied to MCO clock
 998   * @retval None
 999   */
1000 void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv)
1001 {
1002   GPIO_InitTypeDef gpio = {0U};
1003 
1004   /* Check the parameters */
1005   assert_param(IS_RCC_MCO(RCC_MCOx));
1006   assert_param(IS_RCC_MCODIV(RCC_MCODiv));
1007   assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource));
1008 
1009   /* Prevent unused argument(s) compilation warning */
1010   UNUSED(RCC_MCOx);
1011   UNUSED(RCC_MCODiv);
1012 
1013   /* Configure the MCO1 pin in alternate function mode */
1014   gpio.Mode      = GPIO_MODE_AF_PP;
1015   gpio.Speed     = GPIO_SPEED_FREQ_HIGH;
1016   gpio.Pull      = GPIO_NOPULL;
1017   gpio.Pin       = MCO1_PIN;
1018 
1019   /* MCO1 Clock Enable */
1020   MCO1_CLK_ENABLE();
1021 
1022   HAL_GPIO_Init(MCO1_GPIO_PORT, &gpio);
1023 
1024   /* Configure the MCO clock source */
1025   __HAL_RCC_MCO1_CONFIG(RCC_MCOSource, RCC_MCODiv);
1026 }
1027 
1028 /**
1029   * @brief  Enables the Clock Security System.
1030   * @note   If a failure is detected on the HSE oscillator clock, this oscillator
1031   *         is automatically disabled and an interrupt is generated to inform the
1032   *         software about the failure (Clock Security System Interrupt, CSSI),
1033   *         allowing the MCU to perform rescue operations. The CSSI is linked to
1034   *         the Cortex-M3 NMI (Non-Maskable Interrupt) exception vector.
1035   * @retval None
1036   */
1037 void HAL_RCC_EnableCSS(void)
1038 {
1039   *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)ENABLE;
1040 }
1041 
1042 /**
1043   * @brief  Disables the Clock Security System.
1044   * @retval None
1045   */
1046 void HAL_RCC_DisableCSS(void)
1047 {
1048   *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)DISABLE;
1049 }
1050 
1051 /**
1052   * @brief  Returns the SYSCLK frequency
1053   * @note   The system frequency computed by this function is not the real
1054   *         frequency in the chip. It is calculated based on the predefined
1055   *         constant and the selected clock source:
1056   * @note     If SYSCLK source is HSI, function returns values based on HSI_VALUE(*)
1057   * @note     If SYSCLK source is HSE, function returns a value based on HSE_VALUE
1058   *           divided by PREDIV factor(**)
1059   * @note     If SYSCLK source is PLL, function returns a value based on HSE_VALUE
1060   *           divided by PREDIV factor(**) or HSI_VALUE(*) multiplied by the PLL factor.
1061   * @note     (*) HSI_VALUE is a constant defined in stm32f1xx_hal_conf.h file (default value
1062   *               8 MHz) but the real value may vary depending on the variations
1063   *               in voltage and temperature.
1064   * @note     (**) HSE_VALUE is a constant defined in stm32f1xx_hal_conf.h file (default value
1065   *                8 MHz), user has to ensure that HSE_VALUE is same as the real
1066   *                frequency of the crystal used. Otherwise, this function may
1067   *                have wrong result.
1068   *
1069   * @note   The result of this function could be not correct when using fractional
1070   *         value for HSE crystal.
1071   *
1072   * @note   This function can be used by the user application to compute the
1073   *         baud-rate for the communication peripherals or configure other parameters.
1074   *
1075   * @note   Each time SYSCLK changes, this function must be called to update the
1076   *         right SYSCLK value. Otherwise, any configuration based on this function will be incorrect.
1077   *
1078   * @retval SYSCLK frequency
1079   */
1080 uint32_t HAL_RCC_GetSysClockFreq(void)
1081 {
1082 #if defined(RCC_CFGR2_PREDIV1SRC)
1083   static const uint8_t aPLLMULFactorTable[14U] = {0, 0, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 13};
1084   static const uint8_t aPredivFactorTable[16U] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
1085 #else
1086   static const uint8_t aPLLMULFactorTable[16U] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16};
1087 #if defined(RCC_CFGR2_PREDIV1)
1088   static const uint8_t aPredivFactorTable[16U] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
1089 #else
1090   static const uint8_t aPredivFactorTable[2U] = {1, 2};
1091 #endif /*RCC_CFGR2_PREDIV1*/
1092 
1093 #endif
1094   uint32_t tmpreg = 0U, prediv = 0U, pllclk = 0U, pllmul = 0U;
1095   uint32_t sysclockfreq = 0U;
1096 #if defined(RCC_CFGR2_PREDIV1SRC)
1097   uint32_t prediv2 = 0U, pll2mul = 0U;
1098 #endif /*RCC_CFGR2_PREDIV1SRC*/
1099 
1100   tmpreg = RCC->CFGR;
1101 
1102   /* Get SYSCLK source -------------------------------------------------------*/
1103   switch (tmpreg & RCC_CFGR_SWS)
1104   {
1105     case RCC_SYSCLKSOURCE_STATUS_HSE:  /* HSE used as system clock */
1106     {
1107       sysclockfreq = HSE_VALUE;
1108       break;
1109     }
1110     case RCC_SYSCLKSOURCE_STATUS_PLLCLK:  /* PLL used as system clock */
1111     {
1112       pllmul = aPLLMULFactorTable[(uint32_t)(tmpreg & RCC_CFGR_PLLMULL) >> RCC_CFGR_PLLMULL_Pos];
1113       if ((tmpreg & RCC_CFGR_PLLSRC) != RCC_PLLSOURCE_HSI_DIV2)
1114       {
1115 #if defined(RCC_CFGR2_PREDIV1)
1116         prediv = aPredivFactorTable[(uint32_t)(RCC->CFGR2 & RCC_CFGR2_PREDIV1) >> RCC_CFGR2_PREDIV1_Pos];
1117 #else
1118         prediv = aPredivFactorTable[(uint32_t)(RCC->CFGR & RCC_CFGR_PLLXTPRE) >> RCC_CFGR_PLLXTPRE_Pos];
1119 #endif /*RCC_CFGR2_PREDIV1*/
1120 #if defined(RCC_CFGR2_PREDIV1SRC)
1121 
1122         if (HAL_IS_BIT_SET(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC))
1123         {
1124           /* PLL2 selected as Prediv1 source */
1125           /* PLLCLK = PLL2CLK / PREDIV1 * PLLMUL with PLL2CLK = HSE/PREDIV2 * PLL2MUL */
1126           prediv2 = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> RCC_CFGR2_PREDIV2_Pos) + 1;
1127           pll2mul = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> RCC_CFGR2_PLL2MUL_Pos) + 2;
1128           pllclk = (uint32_t)(((uint64_t)HSE_VALUE * (uint64_t)pll2mul * (uint64_t)pllmul) / ((uint64_t)prediv2 * (uint64_t)prediv));
1129         }
1130         else
1131         {
1132           /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV1 * PLLMUL */
1133           pllclk = (uint32_t)((HSE_VALUE * pllmul) / prediv);
1134         }
1135 
1136         /* If PLLMUL was set to 13 means that it was to cover the case PLLMUL 6.5 (avoid using float) */
1137         /* In this case need to divide pllclk by 2 */
1138         if (pllmul == aPLLMULFactorTable[(uint32_t)(RCC_CFGR_PLLMULL6_5) >> RCC_CFGR_PLLMULL_Pos])
1139         {
1140           pllclk = pllclk / 2;
1141         }
1142 #else
1143         /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV1 * PLLMUL */
1144         pllclk = (uint32_t)((HSE_VALUE  * pllmul) / prediv);
1145 #endif /*RCC_CFGR2_PREDIV1SRC*/
1146       }
1147       else
1148       {
1149         /* HSI used as PLL clock source : PLLCLK = HSI/2 * PLLMUL */
1150         pllclk = (uint32_t)((HSI_VALUE >> 1) * pllmul);
1151       }
1152       sysclockfreq = pllclk;
1153       break;
1154     }
1155     case RCC_SYSCLKSOURCE_STATUS_HSI:  /* HSI used as system clock source */
1156     default: /* HSI used as system clock */
1157     {
1158       sysclockfreq = HSI_VALUE;
1159       break;
1160     }
1161   }
1162   return sysclockfreq;
1163 }
1164 
1165 /**
1166   * @brief  Returns the HCLK frequency
1167   * @note   Each time HCLK changes, this function must be called to update the
1168   *         right HCLK value. Otherwise, any configuration based on this function will be incorrect.
1169   *
1170   * @note   The SystemCoreClock CMSIS variable is used to store System Clock Frequency
1171   *         and updated within this function
1172   * @retval HCLK frequency
1173   */
1174 uint32_t HAL_RCC_GetHCLKFreq(void)
1175 {
1176   return SystemCoreClock;
1177 }
1178 
1179 /**
1180   * @brief  Returns the PCLK1 frequency
1181   * @note   Each time PCLK1 changes, this function must be called to update the
1182   *         right PCLK1 value. Otherwise, any configuration based on this function will be incorrect.
1183   * @retval PCLK1 frequency
1184   */
1185 uint32_t HAL_RCC_GetPCLK1Freq(void)
1186 {
1187   /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/
1188   return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]);
1189 }
1190 
1191 /**
1192   * @brief  Returns the PCLK2 frequency
1193   * @note   Each time PCLK2 changes, this function must be called to update the
1194   *         right PCLK2 value. Otherwise, any configuration based on this function will be incorrect.
1195   * @retval PCLK2 frequency
1196   */
1197 uint32_t HAL_RCC_GetPCLK2Freq(void)
1198 {
1199   /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/
1200   return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]);
1201 }
1202 
1203 /**
1204   * @brief  Configures the RCC_OscInitStruct according to the internal
1205   * RCC configuration registers.
1206   * @param  RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that
1207   * will be configured.
1208   * @retval None
1209   */
1210 void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)
1211 {
1212   /* Check the parameters */
1213   assert_param(RCC_OscInitStruct != NULL);
1214 
1215   /* Set all possible values for the Oscillator type parameter ---------------*/
1216   RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI  \
1217                                       | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI;
1218 
1219 #if defined(RCC_CFGR2_PREDIV1SRC)
1220   /* Get the Prediv1 source --------------------------------------------------*/
1221   RCC_OscInitStruct->Prediv1Source = READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC);
1222 #endif /* RCC_CFGR2_PREDIV1SRC */
1223 
1224   /* Get the HSE configuration -----------------------------------------------*/
1225   if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP)
1226   {
1227     RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS;
1228   }
1229   else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON)
1230   {
1231     RCC_OscInitStruct->HSEState = RCC_HSE_ON;
1232   }
1233   else
1234   {
1235     RCC_OscInitStruct->HSEState = RCC_HSE_OFF;
1236   }
1237   RCC_OscInitStruct->HSEPredivValue = __HAL_RCC_HSE_GET_PREDIV();
1238 
1239   /* Get the HSI configuration -----------------------------------------------*/
1240   if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION)
1241   {
1242     RCC_OscInitStruct->HSIState = RCC_HSI_ON;
1243   }
1244   else
1245   {
1246     RCC_OscInitStruct->HSIState = RCC_HSI_OFF;
1247   }
1248 
1249   RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos);
1250 
1251   /* Get the LSE configuration -----------------------------------------------*/
1252   if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP)
1253   {
1254     RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS;
1255   }
1256   else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON)
1257   {
1258     RCC_OscInitStruct->LSEState = RCC_LSE_ON;
1259   }
1260   else
1261   {
1262     RCC_OscInitStruct->LSEState = RCC_LSE_OFF;
1263   }
1264 
1265   /* Get the LSI configuration -----------------------------------------------*/
1266   if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION)
1267   {
1268     RCC_OscInitStruct->LSIState = RCC_LSI_ON;
1269   }
1270   else
1271   {
1272     RCC_OscInitStruct->LSIState = RCC_LSI_OFF;
1273   }
1274 
1275 
1276   /* Get the PLL configuration -----------------------------------------------*/
1277   if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON)
1278   {
1279     RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON;
1280   }
1281   else
1282   {
1283     RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF;
1284   }
1285   RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->CFGR & RCC_CFGR_PLLSRC);
1286   RCC_OscInitStruct->PLL.PLLMUL = (uint32_t)(RCC->CFGR & RCC_CFGR_PLLMULL);
1287 #if defined(RCC_CR_PLL2ON)
1288   /* Get the PLL2 configuration -----------------------------------------------*/
1289   if ((RCC->CR & RCC_CR_PLL2ON) == RCC_CR_PLL2ON)
1290   {
1291     RCC_OscInitStruct->PLL2.PLL2State = RCC_PLL2_ON;
1292   }
1293   else
1294   {
1295     RCC_OscInitStruct->PLL2.PLL2State = RCC_PLL2_OFF;
1296   }
1297   RCC_OscInitStruct->PLL2.HSEPrediv2Value = __HAL_RCC_HSE_GET_PREDIV2();
1298   RCC_OscInitStruct->PLL2.PLL2MUL = (uint32_t)(RCC->CFGR2 & RCC_CFGR2_PLL2MUL);
1299 #endif /* RCC_CR_PLL2ON */
1300 }
1301 
1302 /**
1303   * @brief  Get the RCC_ClkInitStruct according to the internal
1304   * RCC configuration registers.
1305   * @param  RCC_ClkInitStruct pointer to an RCC_ClkInitTypeDef structure that
1306   * contains the current clock configuration.
1307   * @param  pFLatency Pointer on the Flash Latency.
1308   * @retval None
1309   */
1310 void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t *pFLatency)
1311 {
1312   /* Check the parameters */
1313   assert_param(RCC_ClkInitStruct != NULL);
1314   assert_param(pFLatency != NULL);
1315 
1316   /* Set all possible values for the Clock type parameter --------------------*/
1317   RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
1318 
1319   /* Get the SYSCLK configuration --------------------------------------------*/
1320   RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW);
1321 
1322   /* Get the HCLK configuration ----------------------------------------------*/
1323   RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_HPRE);
1324 
1325   /* Get the APB1 configuration ----------------------------------------------*/
1326   RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_PPRE1);
1327 
1328   /* Get the APB2 configuration ----------------------------------------------*/
1329   RCC_ClkInitStruct->APB2CLKDivider = (uint32_t)((RCC->CFGR & RCC_CFGR_PPRE2) >> 3);
1330 
1331 #if   defined(FLASH_ACR_LATENCY)
1332   /* Get the Flash Wait State (Latency) configuration ------------------------*/
1333   *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY);
1334 #else
1335   /* For VALUE lines devices, only LATENCY_0 can be set*/
1336   *pFLatency = (uint32_t)FLASH_LATENCY_0;
1337 #endif
1338 }
1339 
1340 /**
1341   * @brief This function handles the RCC CSS interrupt request.
1342   * @note This API should be called under the NMI_Handler().
1343   * @retval None
1344   */
1345 void HAL_RCC_NMI_IRQHandler(void)
1346 {
1347   /* Check RCC CSSF flag  */
1348   if (__HAL_RCC_GET_IT(RCC_IT_CSS))
1349   {
1350     /* RCC Clock Security System interrupt user callback */
1351     HAL_RCC_CSSCallback();
1352 
1353     /* Clear RCC CSS pending bit */
1354     __HAL_RCC_CLEAR_IT(RCC_IT_CSS);
1355   }
1356 }
1357 
1358 /**
1359   * @brief  This function provides delay (in milliseconds) based on CPU cycles method.
1360   * @param  mdelay: specifies the delay time length, in milliseconds.
1361   * @retval None
1362   */
1363 static void RCC_Delay(uint32_t mdelay)
1364 {
1365   __IO uint32_t Delay = mdelay * (SystemCoreClock / 8U / 1000U);
1366   do
1367   {
1368     __NOP();
1369   }
1370   while (Delay --);
1371 }
1372 
1373 /**
1374   * @brief  RCC Clock Security System interrupt callback
1375   * @retval none
1376   */
1377 __weak void HAL_RCC_CSSCallback(void)
1378 {
1379   /* NOTE : This function Should not be modified, when the callback is needed,
1380     the HAL_RCC_CSSCallback could be implemented in the user file
1381     */
1382 }
1383 
1384 /**
1385   * @}
1386   */
1387 
1388 /**
1389   * @}
1390   */
1391 
1392 #endif /* HAL_RCC_MODULE_ENABLED */
1393 /**
1394   * @}
1395   */
1396 
1397 /**
1398   * @}
1399   */
1400