Forum: Mikrocontroller und Digitale Elektronik STM32F103C Systemtakt Einstellung Hilfe


von Kristoffer Ullsten (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche den Systemtakt von einem STM32F103C Board ohne externen 
Quartz auf 56MHz einzustellen.

Ich weiss nicht genau wie ich die Multiplikatoren und Prescalers auf 
Register Ebene einstelle. Kann mir jemand bitte helfen danke!
1
/**
2
  ******************************************************************************
3
  * @file    GPIO/IOToggle/system_stm32f10x.c
4
  * @author  MCD Application Team
5
  * @version V3.5.0
6
  * @date    08-April-2011
7
  * @brief   CMSIS Cortex-M3 Device Peripheral Access Layer System Source File.
8
  * 
9
  * 1.  This file provides two functions and one global variable to be called from 
10
  *     user application:
11
  *      - SystemInit(): Setups the system clock (System clock source, PLL Multiplier
12
  *                      factors, AHB/APBx prescalers and Flash settings). 
13
  *                      This function is called at startup just after reset and 
14
  *                      before branch to main program. This call is made inside
15
  *                      the "startup_stm32f10x_xx.s" file.
16
  *
17
  *      - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
18
  *                                  by the user application to setup the SysTick 
19
  *                                  timer or configure other parameters.
20
  *                                     
21
  *      - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
22
  *                                 be called whenever the core clock is changed
23
  *                                 during program execution.
24
  *
25
  * 2. After each device reset the HSI (8 MHz) is used as system clock source.
26
  *    Then SystemInit() function is called, in "startup_stm32f10x_xx.s" file, to
27
  *    configure the system clock before to branch to main program.
28
  *
29
  * 3. If the system clock source selected by user fails to startup, the SystemInit()
30
  *    function will do nothing and HSI still used as system clock source. User can 
31
  *    add some code to deal with this issue inside the SetSysClock() function.
32
  *
33
  * 4. The default value of HSE crystal is set to 8 MHz (or 25 MHz, depedning on
34
  *    the product used), refer to "HSE_VALUE" define in "stm32f10x.h" file. 
35
  *    When HSE is used as system clock source, directly or through PLL, and you
36
  *    are using different crystal you have to adapt the HSE value to your own
37
  *    configuration.
38
  *        
39
  ******************************************************************************
40
  * @attention
41
  *
42
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
43
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
44
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
45
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
46
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
47
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
48
  *
49
  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
50
  ******************************************************************************
51
  */
52
53
/** @addtogroup CMSIS
54
  * @{
55
  */
56
57
/** @addtogroup stm32f10x_system
58
  * @{
59
  */  
60
  
61
/** @addtogroup STM32F10x_System_Private_Includes
62
  * @{
63
  */
64
65
#include "stm32f10x.h"
66
67
/**
68
  * @}
69
  */
70
71
/** @addtogroup STM32F10x_System_Private_TypesDefinitions
72
  * @{
73
  */
74
75
/**
76
  * @}
77
  */
78
79
/** @addtogroup STM32F10x_System_Private_Defines
80
  * @{
81
  */
82
83
/*!< Uncomment the line corresponding to the desired System clock (SYSCLK)
84
   frequency (after reset the HSI is used as SYSCLK source)
85
   
86
   IMPORTANT NOTE:
87
   ============== 
88
   1. After each device reset the HSI is used as System clock source.
89
90
   2. Please make sure that the selected System clock doesn't exceed your device's
91
      maximum frequency.
92
      
93
   3. If none of the define below is enabled, the HSI is used as System clock
94
    source.
95
96
   4. The System clock configuration functions provided within this file assume that:
97
        - For Low, Medium and High density Value line devices an external 8MHz 
98
          crystal is used to drive the System clock.
99
        - For Low, Medium and High density devices an external 8MHz crystal is
100
          used to drive the System clock.
101
        - For Connectivity line devices an external 25MHz crystal is used to drive
102
          the System clock.
103
     If you are using different crystal you have to adapt those functions accordingly.
104
    */
105
    
106
107
// #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) 
108
// /* #define SYSCLK_FREQ_HSE    HSE_Value */
109
//  #define SYSCLK_FREQ_24MHz  24000000
110
// #else
111
// /* #define SYSCLK_FREQ_HSE    HSE_Value */
112
//  #define SYSCLK_FREQ_24MHz  24000000  
113
// /* #define SYSCLK_FREQ_36MHz  36000000 */
114
// /* #define SYSCLK_FREQ_48MHz  48000000 */
115
// /* #define SYSCLK_FREQ_56MHz  56000000 */
116
// #define SYSCLK_FREQ_72MHz  72000000
117
// #endif
118
119
#define SYSCLK_FREQ_56MHz  56000000
120
121
122
/*!< Uncomment the following line if you need to use external SRAM mounted
123
     on STM3210E-EVAL board (STM32 High density and XL-density devices) or on 
124
     STM32100E-EVAL board (STM32 High-density value line devices) as data memory */ 
125
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
126
/* #define DATA_IN_ExtSRAM */
127
#endif
128
129
/*!< Uncomment the following line if you need to relocate your vector Table in
130
     Internal SRAM. */ 
131
/* #define VECT_TAB_SRAM */
132
#define VECT_TAB_OFFSET  0x0 /*!< Vector Table base offset field. 
133
                                  This value must be a multiple of 0x200. */
134
135
136
/**
137
  * @}
138
  */
139
140
/** @addtogroup STM32F10x_System_Private_Macros
141
  * @{
142
  */
143
144
/**
145
  * @}
146
  */
147
148
/** @addtogroup STM32F10x_System_Private_Variables
149
  * @{
150
  */
151
152
/*******************************************************************************
153
*  Clock Definitions
154
*******************************************************************************/
155
#ifdef SYSCLK_FREQ_HSE
156
  uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;        /*!< System Clock Frequency (Core Clock) */
157
#elif defined SYSCLK_FREQ_24MHz
158
  uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;        /*!< System Clock Frequency (Core Clock) */
159
#elif defined SYSCLK_FREQ_36MHz
160
  uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;        /*!< System Clock Frequency (Core Clock) */
161
#elif defined SYSCLK_FREQ_48MHz
162
  uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;        /*!< System Clock Frequency (Core Clock) */
163
#elif defined SYSCLK_FREQ_56MHz
164
  uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;        /*!< System Clock Frequency (Core Clock) */
165
#elif defined SYSCLK_FREQ_72MHz
166
  uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        /*!< System Clock Frequency (Core Clock) */
167
#else /*!< HSI Selected as System Clock source */
168
  uint32_t SystemCoreClock         = HSI_Value;        /*!< System Clock Frequency (Core Clock) */
169
#endif
170
171
__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
172
/**
173
  * @}
174
  */
175
176
/** @addtogroup STM32F10x_System_Private_FunctionPrototypes
177
  * @{
178
  */
179
180
static void SetSysClock(void);
181
182
#ifdef SYSCLK_FREQ_HSE
183
  static void SetSysClockToHSE(void);
184
#elif defined SYSCLK_FREQ_24MHz
185
  static void SetSysClockTo24(void);
186
#elif defined SYSCLK_FREQ_36MHz
187
  static void SetSysClockTo36(void);
188
#elif defined SYSCLK_FREQ_48MHz
189
  static void SetSysClockTo48(void);
190
#elif defined SYSCLK_FREQ_56MHz
191
  static void SetSysClockTo56(void);  
192
#elif defined SYSCLK_FREQ_72MHz
193
  static void SetSysClockTo72(void);
194
#endif
195
196
#ifdef DATA_IN_ExtSRAM
197
  static void SystemInit_ExtMemCtl(void); 
198
#endif /* DATA_IN_ExtSRAM */
199
200
/**
201
  * @}
202
  */
203
204
/** @addtogroup STM32F10x_System_Private_Functions
205
  * @{
206
  */
207
208
/**
209
  * @brief  Setup the microcontroller system
210
  *         Initialize the Embedded Flash Interface, the PLL and update the 
211
  *         SystemCoreClock variable.
212
  * @note   This function should be used only after reset.
213
  * @param  None
214
  * @retval None
215
  */
216
void SystemInit (void)
217
{
218
  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
219
  /* Set HSION bit */
220
  RCC->CR |= (uint32_t)0x00000001;
221
222
  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
223
#ifndef STM32F10X_CL
224
  RCC->CFGR &= (uint32_t)0xF8FF0000;
225
#else
226
  RCC->CFGR &= (uint32_t)0xF0FF0000;
227
#endif /* STM32F10X_CL */   
228
  
229
  /* Reset HSEON, CSSON and PLLON bits */
230
  RCC->CR &= (uint32_t)0xFEF6FFFF;
231
232
  /* Reset HSEBYP bit */
233
  RCC->CR &= (uint32_t)0xFFFBFFFF;
234
235
  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
236
  RCC->CFGR &= (uint32_t)0xFF80FFFF;
237
238
#ifdef STM32F10X_CL
239
  /* Reset PLL2ON and PLL3ON bits */
240
  RCC->CR &= (uint32_t)0xEBFFFFFF;
241
242
  /* Disable all interrupts and clear pending bits  */
243
  RCC->CIR = 0x00FF0000;
244
245
  /* Reset CFGR2 register */
246
  RCC->CFGR2 = 0x00000000;
247
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
248
  /* Disable all interrupts and clear pending bits  */
249
  RCC->CIR = 0x009F0000;
250
251
  /* Reset CFGR2 register */
252
  RCC->CFGR2 = 0x00000000;      
253
#else
254
  /* Disable all interrupts and clear pending bits  */
255
  RCC->CIR = 0x009F0000;
256
#endif /* STM32F10X_CL */
257
    
258
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
259
  #ifdef DATA_IN_ExtSRAM
260
    SystemInit_ExtMemCtl(); 
261
  #endif /* DATA_IN_ExtSRAM */
262
#endif 
263
264
  /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
265
  /* Configure the Flash Latency cycles and enable prefetch buffer */
266
  SetSysClock();
267
268
#ifdef VECT_TAB_SRAM
269
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
270
#else
271
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
272
#endif 
273
}
274
275
/**
276
  * @brief  Update SystemCoreClock variable according to Clock Register Values.
277
  *         The SystemCoreClock variable contains the core clock (HCLK), it can
278
  *         be used by the user application to setup the SysTick timer or configure
279
  *         other parameters.
280
  *           
281
  * @note   Each time the core clock (HCLK) changes, this function must be called
282
  *         to update SystemCoreClock variable value. Otherwise, any configuration
283
  *         based on this variable will be incorrect.         
284
  *     
285
  * @note   - The system frequency computed by this function is not the real 
286
  *           frequency in the chip. It is calculated based on the predefined 
287
  *           constant and the selected clock source:
288
  *             
289
  *           - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
290
  *                                              
291
  *           - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
292
  *                          
293
  *           - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) 
294
  *             or HSI_VALUE(*) multiplied by the PLL factors.
295
  *         
296
  *         (*) HSI_VALUE is a constant defined in stm32f1xx.h file (default value
297
  *             8 MHz) but the real value may vary depending on the variations
298
  *             in voltage and temperature.   
299
  *    
300
  *         (**) HSE_VALUE is a constant defined in stm32f1xx.h file (default value
301
  *              8 MHz or 25 MHz, depedning on the product used), user has to ensure
302
  *              that HSE_VALUE is same as the real frequency of the crystal used.
303
  *              Otherwise, this function may have wrong result.
304
  *                
305
  *         - The result of this function could be not correct when using fractional
306
  *           value for HSE crystal.
307
  * @param  None
308
  * @retval None
309
  */
310
void SystemCoreClockUpdate (void)
311
{
312
  uint32_t tmp = 0, pllmull = 0, pllsource = 0;
313
314
#ifdef  STM32F10X_CL
315
  uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0;
316
#endif /* STM32F10X_CL */
317
318
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
319
  uint32_t prediv1factor = 0;
320
#endif /* STM32F10X_LD_VL or STM32F10X_MD_VL or STM32F10X_HD_VL */
321
    
322
  /* Get SYSCLK source -------------------------------------------------------*/
323
  tmp = RCC->CFGR & RCC_CFGR_SWS;
324
  
325
  switch (tmp)
326
  {
327
    case 0x00:  /* HSI used as system clock */
328
      SystemCoreClock = HSI_VALUE;
329
      break;
330
    case 0x04:  /* HSE used as system clock */
331
      SystemCoreClock = HSE_VALUE;
332
      break;
333
    case 0x08:  /* PLL used as system clock */
334
335
      /* Get PLL clock source and multiplication factor ----------------------*/
336
      pllmull = RCC->CFGR & RCC_CFGR_PLLMULL;
337
      pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;
338
      
339
#ifndef STM32F10X_CL      
340
      pllmull = ( pllmull >> 18) + 2;
341
      
342
      if (pllsource == 0x00)
343
      {
344
        /* HSI oscillator clock divided by 2 selected as PLL clock entry */
345
        SystemCoreClock = (HSI_VALUE >> 1) * pllmull;
346
      }
347
      else
348
      {
349
 #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
350
       prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1;
351
       /* HSE oscillator clock selected as PREDIV1 clock entry */
352
       SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; 
353
 #else
354
        /* HSE selected as PLL clock entry */
355
        if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET)
356
        {/* HSE oscillator clock divided by 2 */
357
          SystemCoreClock = (HSE_VALUE >> 1) * pllmull;
358
        }
359
        else
360
        {
361
          SystemCoreClock = HSE_VALUE * pllmull;
362
        }
363
 #endif
364
      }
365
#else
366
      pllmull = pllmull >> 18;
367
      
368
      if (pllmull != 0x0D)
369
      {
370
         pllmull += 2;
371
      }
372
      else
373
      { /* PLL multiplication factor = PLL input clock * 6.5 */
374
        pllmull = 13 / 2; 
375
      }
376
            
377
      if (pllsource == 0x00)
378
      {
379
        /* HSI oscillator clock divided by 2 selected as PLL clock entry */
380
        SystemCoreClock = (HSI_VALUE >> 1) * pllmull;
381
      }
382
      else
383
      {/* PREDIV1 selected as PLL clock entry */
384
        
385
        /* Get PREDIV1 clock source and division factor */
386
        prediv1source = RCC->CFGR2 & RCC_CFGR2_PREDIV1SRC;
387
        prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1;
388
        
389
        if (prediv1source == 0)
390
        { 
391
          /* HSE oscillator clock selected as PREDIV1 clock entry */
392
          SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull;          
393
        }
394
        else
395
        {/* PLL2 clock selected as PREDIV1 clock entry */
396
          
397
          /* Get PREDIV2 division factor and PLL2 multiplication factor */
398
          prediv2factor = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> 4) + 1;
399
          pll2mull = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> 8 ) + 2; 
400
          SystemCoreClock = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull;                         
401
        }
402
      }
403
#endif /* STM32F10X_CL */ 
404
      break;
405
406
    default:
407
      SystemCoreClock = HSI_VALUE;
408
      break;
409
  }
410
  
411
  /* Compute HCLK clock frequency ----------------*/
412
  /* Get HCLK prescaler */
413
  tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
414
  /* HCLK clock frequency */
415
  SystemCoreClock >>= tmp;  
416
}
417
418
/**
419
  * @brief  Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.
420
  * @param  None
421
  * @retval None
422
  */
423
static void SetSysClock(void)
424
{
425
#ifdef SYSCLK_FREQ_HSE
426
  SetSysClockToHSE();
427
#elif defined SYSCLK_FREQ_24MHz
428
  SetSysClockTo24();
429
#elif defined SYSCLK_FREQ_36MHz
430
  SetSysClockTo36();
431
#elif defined SYSCLK_FREQ_48MHz
432
  SetSysClockTo48();
433
#elif defined SYSCLK_FREQ_56MHz
434
  SetSysClockTo56();  
435
#elif defined SYSCLK_FREQ_72MHz
436
  SetSysClockTo72();
437
#endif
438
 
439
 /* If none of the define above is enabled, the HSI is used as System clock
440
    source (default after reset) */ 
441
}
442
443
/**
444
  * @brief  Setup the external memory controller. Called in startup_stm32f10x.s 
445
  *          before jump to __main
446
  * @param  None
447
  * @retval None
448
  */ 
449
#ifdef DATA_IN_ExtSRAM
450
/**
451
  * @brief  Setup the external memory controller. 
452
  *         Called in startup_stm32f10x_xx.s/.c before jump to main.
453
  *         This function configures the external SRAM mounted on STM3210E-EVAL
454
  *         board (STM32 High density devices). This SRAM will be used as program
455
  *         data memory (including heap and stack).
456
  * @param  None
457
  * @retval None
458
  */ 
459
void SystemInit_ExtMemCtl(void) 
460
{
461
/*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is 
462
  required, then adjust the Register Addresses */
463
464
  /* Enable FSMC clock */
465
  RCC->AHBENR = 0x00000114;
466
  
467
  /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */  
468
  RCC->APB2ENR = 0x000001E0;
469
  
470
/* ---------------  SRAM Data lines, NOE and NWE configuration ---------------*/
471
/*----------------  SRAM Address lines configuration -------------------------*/
472
/*----------------  NOE and NWE configuration --------------------------------*/  
473
/*----------------  NE3 configuration ----------------------------------------*/
474
/*----------------  NBL0, NBL1 configuration ---------------------------------*/
475
  
476
  GPIOD->CRL = 0x44BB44BB;  
477
  GPIOD->CRH = 0xBBBBBBBB;
478
479
  GPIOE->CRL = 0xB44444BB;  
480
  GPIOE->CRH = 0xBBBBBBBB;
481
482
  GPIOF->CRL = 0x44BBBBBB;  
483
  GPIOF->CRH = 0xBBBB4444;
484
485
  GPIOG->CRL = 0x44BBBBBB;  
486
  GPIOG->CRH = 0x44444B44;
487
   
488
/*----------------  FSMC Configuration ---------------------------------------*/  
489
/*----------------  Enable FSMC Bank1_SRAM Bank ------------------------------*/
490
  
491
  FSMC_Bank1->BTCR[4] = 0x00001011;
492
  FSMC_Bank1->BTCR[5] = 0x00000200;
493
}
494
#endif /* DATA_IN_ExtSRAM */
495
496
#ifdef SYSCLK_FREQ_HSE
497
/**
498
  * @brief  Selects HSE as System clock source and configure HCLK, PCLK2
499
  *          and PCLK1 prescalers.
500
  * @note   This function should be used only after reset.
501
  * @param  None
502
  * @retval None
503
  */
504
static void SetSysClockToHSE(void)
505
{
506
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
507
  
508
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
509
  /* Enable HSE */    
510
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
511
 
512
  /* Wait till HSE is ready and if Time out is reached exit */
513
  do
514
  {
515
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
516
    StartUpCounter++;  
517
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
518
519
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
520
  {
521
    HSEStatus = (uint32_t)0x01;
522
  }
523
  else
524
  {
525
    HSEStatus = (uint32_t)0x00;
526
  }  
527
528
  if (HSEStatus == (uint32_t)0x01)
529
  {
530
531
#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL
532
    /* Enable Prefetch Buffer */
533
    FLASH->ACR |= FLASH_ACR_PRFTBE;
534
535
    /* Flash 0 wait state */
536
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
537
538
#ifndef STM32F10X_CL
539
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0;
540
#else
541
    if (HSE_VALUE <= 24000000)
542
  {
543
      FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0;
544
  }
545
  else
546
  {
547
      FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1;
548
  }
549
#endif /* STM32F10X_CL */
550
#endif
551
 
552
    /* HCLK = SYSCLK */
553
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
554
      
555
    /* PCLK2 = HCLK */
556
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
557
    
558
    /* PCLK1 = HCLK */
559
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;
560
    
561
    /* Select HSE as system clock source */
562
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
563
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSE;    
564
565
    /* Wait till HSE is used as system clock source */
566
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x04)
567
    {
568
    }
569
  }
570
  else
571
  { /* If HSE fails to start-up, the application will have wrong clock 
572
         configuration. User can add here some code to deal with this error */
573
  }  
574
}
575
#elif defined SYSCLK_FREQ_24MHz
576
/**
577
  * @brief  Sets System clock frequency to 24MHz and configure HCLK, PCLK2 
578
  *          and PCLK1 prescalers.
579
  * @note   This function should be used only after reset.
580
  * @param  None
581
  * @retval None
582
  */
583
static void SetSysClockTo24(void)
584
{
585
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
586
  
587
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
588
  /* Enable HSE */    
589
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
590
 
591
  /* Wait till HSE is ready and if Time out is reached exit */
592
  do
593
  {
594
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
595
    StartUpCounter++;  
596
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
597
598
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
599
  {
600
    HSEStatus = (uint32_t)0x01;
601
  }
602
  else
603
  {
604
    HSEStatus = (uint32_t)0x00;
605
  }  
606
607
  if (HSEStatus == (uint32_t)0x01)
608
  {
609
#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL 
610
    /* Enable Prefetch Buffer */
611
    FLASH->ACR |= FLASH_ACR_PRFTBE;
612
613
    /* Flash 0 wait state */
614
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
615
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0;    
616
#endif
617
 
618
    /* HCLK = SYSCLK */
619
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
620
      
621
    /* PCLK2 = HCLK */
622
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
623
    
624
    /* PCLK1 = HCLK */
625
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;
626
    
627
#ifdef STM32F10X_CL
628
    /* Configure PLLs ------------------------------------------------------*/
629
    /* PLL configuration: PLLCLK = PREDIV1 * 6 = 24 MHz */ 
630
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
631
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
632
                            RCC_CFGR_PLLMULL6); 
633
634
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
635
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */       
636
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
637
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
638
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
639
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV10);
640
  
641
    /* Enable PLL2 */
642
    RCC->CR |= RCC_CR_PLL2ON;
643
    /* Wait till PLL2 is ready */
644
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
645
    {
646
    }   
647
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
648
    /*  PLL configuration:  = (HSE / 2) * 6 = 24 MHz */
649
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
650
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLMULL6);
651
#else    
652
    /*  PLL configuration:  = (HSE / 2) * 6 = 24 MHz */
653
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
654
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL6);
655
#endif /* STM32F10X_CL */
656
657
    /* Enable PLL */
658
    RCC->CR |= RCC_CR_PLLON;
659
660
    /* Wait till PLL is ready */
661
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
662
    {
663
    }
664
665
    /* Select PLL as system clock source */
666
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
667
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    
668
669
    /* Wait till PLL is used as system clock source */
670
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
671
    {
672
    }
673
  }
674
  else
675
  { /* If HSE fails to start-up, the application will have wrong clock 
676
         configuration. User can add here some code to deal with this error */
677
  } 
678
}
679
#elif defined SYSCLK_FREQ_36MHz
680
/**
681
  * @brief  Sets System clock frequency to 36MHz and configure HCLK, PCLK2 
682
  *          and PCLK1 prescalers. 
683
  * @note   This function should be used only after reset.
684
  * @param  None
685
  * @retval None
686
  */
687
static void SetSysClockTo36(void)
688
{
689
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
690
  
691
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
692
  /* Enable HSE */    
693
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
694
 
695
  /* Wait till HSE is ready and if Time out is reached exit */
696
  do
697
  {
698
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
699
    StartUpCounter++;  
700
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
701
702
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
703
  {
704
    HSEStatus = (uint32_t)0x01;
705
  }
706
  else
707
  {
708
    HSEStatus = (uint32_t)0x00;
709
  }  
710
711
  if (HSEStatus == (uint32_t)0x01)
712
  {
713
    /* Enable Prefetch Buffer */
714
    FLASH->ACR |= FLASH_ACR_PRFTBE;
715
716
    /* Flash 1 wait state */
717
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
718
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1;    
719
 
720
    /* HCLK = SYSCLK */
721
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
722
      
723
    /* PCLK2 = HCLK */
724
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
725
    
726
    /* PCLK1 = HCLK */
727
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;
728
    
729
#ifdef STM32F10X_CL
730
    /* Configure PLLs ------------------------------------------------------*/
731
    
732
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 36 MHz */ 
733
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
734
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
735
                            RCC_CFGR_PLLMULL9); 
736
737
  /*!< PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
738
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */
739
        
740
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
741
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
742
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
743
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV10);
744
  
745
    /* Enable PLL2 */
746
    RCC->CR |= RCC_CR_PLL2ON;
747
    /* Wait till PLL2 is ready */
748
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
749
    {
750
    }
751
    
752
#else    
753
    /*  PLL configuration: PLLCLK = (HSE / 2) * 9 = 36 MHz */
754
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
755
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL9);
756
#endif /* STM32F10X_CL */
757
758
    /* Enable PLL */
759
    RCC->CR |= RCC_CR_PLLON;
760
761
    /* Wait till PLL is ready */
762
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
763
    {
764
    }
765
766
    /* Select PLL as system clock source */
767
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
768
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    
769
770
    /* Wait till PLL is used as system clock source */
771
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
772
    {
773
    }
774
  }
775
  else
776
  { /* If HSE fails to start-up, the application will have wrong clock 
777
         configuration. User can add here some code to deal with this error */
778
  } 
779
}
780
#elif defined SYSCLK_FREQ_48MHz
781
/**
782
  * @brief  Sets System clock frequency to 48MHz and configure HCLK, PCLK2 
783
  *          and PCLK1 prescalers. 
784
  * @note   This function should be used only after reset.
785
  * @param  None
786
  * @retval None
787
  */
788
static void SetSysClockTo48(void)
789
{
790
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
791
  
792
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
793
  /* Enable HSE */    
794
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
795
 
796
  /* Wait till HSE is ready and if Time out is reached exit */
797
  do
798
  {
799
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
800
    StartUpCounter++;  
801
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
802
803
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
804
  {
805
    HSEStatus = (uint32_t)0x01;
806
  }
807
  else
808
  {
809
    HSEStatus = (uint32_t)0x00;
810
  }  
811
812
  if (HSEStatus == (uint32_t)0x01)
813
  {
814
    /* Enable Prefetch Buffer */
815
    FLASH->ACR |= FLASH_ACR_PRFTBE;
816
817
    /* Flash 1 wait state */
818
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
819
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1;    
820
 
821
    /* HCLK = SYSCLK */
822
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
823
      
824
    /* PCLK2 = HCLK */
825
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
826
    
827
    /* PCLK1 = HCLK */
828
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
829
    
830
#ifdef STM32F10X_CL
831
    /* Configure PLLs ------------------------------------------------------*/
832
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
833
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
834
        
835
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
836
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
837
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
838
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
839
  
840
    /* Enable PLL2 */
841
    RCC->CR |= RCC_CR_PLL2ON;
842
    /* Wait till PLL2 is ready */
843
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
844
    {
845
    }
846
    
847
   
848
    /* PLL configuration: PLLCLK = PREDIV1 * 6 = 48 MHz */ 
849
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
850
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
851
                            RCC_CFGR_PLLMULL6); 
852
#else    
853
    /*  PLL configuration: PLLCLK = HSE * 6 = 48 MHz */
854
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
855
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);
856
#endif /* STM32F10X_CL */
857
858
    /* Enable PLL */
859
    RCC->CR |= RCC_CR_PLLON;
860
861
    /* Wait till PLL is ready */
862
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
863
    {
864
    }
865
866
    /* Select PLL as system clock source */
867
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
868
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    
869
870
    /* Wait till PLL is used as system clock source */
871
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
872
    {
873
    }
874
  }
875
  else
876
  { /* If HSE fails to start-up, the application will have wrong clock 
877
         configuration. User can add here some code to deal with this error */
878
  } 
879
}
880
881
#elif defined SYSCLK_FREQ_56MHz
882
/**
883
  * @brief  Sets System clock frequency to 56MHz and configure HCLK, PCLK2 
884
  *          and PCLK1 prescalers. 
885
  * @note   This function should be used only after reset.
886
  * @param  None
887
  * @retval None
888
  */
889
static void SetSysClockTo56(void)
890
{
891
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
892
  
893
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
894
  /* Enable HSE */    
895
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
896
 
897
  /* Wait till HSE is ready and if Time out is reached exit */
898
  do
899
  {
900
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
901
    StartUpCounter++;  
902
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
903
904
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
905
  {
906
    HSEStatus = (uint32_t)0x01;
907
  }
908
  else
909
  {
910
    HSEStatus = (uint32_t)0x00;
911
  }  
912
913
  if (HSEStatus == (uint32_t)0x01)
914
  {
915
    /* Enable Prefetch Buffer */
916
    FLASH->ACR |= FLASH_ACR_PRFTBE;
917
918
    /* Flash 2 wait state */
919
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
920
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    
921
 
922
    /* HCLK = SYSCLK */
923
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
924
      
925
    /* PCLK2 = HCLK */
926
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
927
    
928
    /* PCLK1 = HCLK */
929
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
930
931
#ifdef STM32F10X_CL
932
    /* Configure PLLs ------------------------------------------------------*/
933
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
934
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
935
        
936
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
937
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
938
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
939
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
940
  
941
    /* Enable PLL2 */
942
    RCC->CR |= RCC_CR_PLL2ON;
943
    /* Wait till PLL2 is ready */
944
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
945
    {
946
    }
947
    
948
   
949
    /* PLL configuration: PLLCLK = PREDIV1 * 7 = 56 MHz */ 
950
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
951
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
952
                            RCC_CFGR_PLLMULL7); 
953
#else     
954
    /* PLL configuration: PLLCLK = HSE * 7 = 56 MHz */
955
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
956
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL7);
957
958
#endif /* STM32F10X_CL */
959
960
    /* Enable PLL */
961
    RCC->CR |= RCC_CR_PLLON;
962
963
    /* Wait till PLL is ready */
964
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
965
    {
966
    }
967
968
    /* Select PLL as system clock source */
969
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
970
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    
971
972
    /* Wait till PLL is used as system clock source */
973
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
974
    {
975
    }
976
  }
977
  else
978
  { /* If HSE fails to start-up, the application will have wrong clock 
979
         configuration. User can add here some code to deal with this error */
980
  } 
981
}
982
983
#elif defined SYSCLK_FREQ_72MHz
984
/**
985
  * @brief  Sets System clock frequency to 72MHz and configure HCLK, PCLK2 
986
  *          and PCLK1 prescalers. 
987
  * @note   This function should be used only after reset.
988
  * @param  None
989
  * @retval None
990
  */
991
static void SetSysClockTo72(void)
992
{
993
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
994
  
995
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
996
  /* Enable HSE */    
997
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
998
 
999
  /* Wait till HSE is ready and if Time out is reached exit */
1000
  do
1001
  {
1002
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
1003
    StartUpCounter++;  
1004
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
1005
1006
  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
1007
  {
1008
    HSEStatus = (uint32_t)0x01;
1009
  }
1010
  else
1011
  {
1012
    HSEStatus = (uint32_t)0x00;
1013
  }  
1014
1015
  if (HSEStatus == (uint32_t)0x01)
1016
  {
1017
    /* Enable Prefetch Buffer */
1018
    FLASH->ACR |= FLASH_ACR_PRFTBE;
1019
1020
    /* Flash 2 wait state */
1021
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
1022
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    
1023
1024
 
1025
    /* HCLK = SYSCLK */
1026
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
1027
      
1028
    /* PCLK2 = HCLK */
1029
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
1030
    
1031
    /* PCLK1 = HCLK */
1032
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
1033
1034
#ifdef STM32F10X_CL
1035
    /* Configure PLLs ------------------------------------------------------*/
1036
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
1037
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
1038
        
1039
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
1040
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
1041
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
1042
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
1043
  
1044
    /* Enable PLL2 */
1045
    RCC->CR |= RCC_CR_PLL2ON;
1046
    /* Wait till PLL2 is ready */
1047
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
1048
    {
1049
    }
1050
    
1051
   
1052
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ 
1053
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
1054
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
1055
                            RCC_CFGR_PLLMULL9); 
1056
#else    
1057
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
1058
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
1059
                                        RCC_CFGR_PLLMULL));
1060
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
1061
#endif /* STM32F10X_CL */
1062
1063
    /* Enable PLL */
1064
    RCC->CR |= RCC_CR_PLLON;
1065
1066
    /* Wait till PLL is ready */
1067
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
1068
    {
1069
    }
1070
    
1071
    /* Select PLL as system clock source */
1072
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
1073
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    
1074
1075
    /* Wait till PLL is used as system clock source */
1076
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
1077
    {
1078
    }
1079
  }
1080
  else
1081
  { /* If HSE fails to start-up, the application will have wrong clock 
1082
         configuration. User can add here some code to deal with this error */
1083
  }
1084
}
1085
#endif
1086
1087
/**
1088
  * @}
1089
  */
1090
1091
/**
1092
  * @}
1093
  */
1094
  
1095
/**
1096
  * @}
1097
  */    
1098
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

von Kristoffer Ullsten (Gast)


Lesenswert?

erfolgreich konfiguriert auf 56MHz
1
void System_Clock_Setup(){
2
  RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_14);
3
  RCC_PLLCmd(ENABLE);
4
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}
5
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
6
7
  /* Set HCLK, PCLK1, and PCLK2 to SCLK (these are default */
8
  RCC_HCLKConfig(RCC_SYSCLK_Div1); // 56 MHz
9
  RCC_PCLK1Config(RCC_HCLK_Div2);  // APB1 28MHz, max 36MHz
10
  RCC_PCLK2Config(RCC_HCLK_Div1);  // APB2 56MHz
11
}

von Forumsversagererstengrades (Gast)


Lesenswert?

Kristoffer Ullsten schrieb:
> ich versuche den Systemtakt von einem STM32F103C Board ohne externen
> Quartz auf 56MHz einzustellen.

Schaffst du es vielleicht wenigstens dich an die Richtlinien
im einstellen/posten von Sourcen zu halten?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.