Subversion Repositories AFRtranscoder

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 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