Lib to switch the clock speed of the ST Nucleo to 84MHz. The internal RC oscillator is multiplied with the PLL.

Dependents:   Nucleo_spi_master_20MHz Nucleo_vs_Arduino_Speed_Test DMA_I2S_Test MPU9150AHRS ... more

Not needed with actual mbed lib

You don't need this lib to speed up the cpu clock. The actual mbed lib is using 84 MHz cpu speed out of the box.

The ST Nucleo board is running on 16 MHz out of the box. To speed up the cpu to the maximum speed we have to change the clock setting. Simply add

          #include "ST_F401_84MHZ.h" 
          F401_init84 myinit(0); 

in front of your program. This should be the first line in main to ensure the frequency is changed before other objects are initialised.

This frequency is generated out of the internal RC oscillator. The frequency is not so stable like a crystal ! My board is fluctuate +- 40KHz at 84MHz at room temperature.

/media/uploads/dreschpe/cubemx1.png

If you need a more precise timing source, you have to add a external crystal. /media/uploads/dreschpe/oszillator.jpg

You need : X3 8MHz crystal , C33 and C34 18pF 0603 , R35 and R37 0R 0603 or you can simply use wire to short this two resistor pads. A call of SystemClock_Config_84MHz_external(); will config the pll to generate 84MHz out of the 8MHz crystal oscillator.

/media/uploads/dreschpe/cubemx2.png

Add

          #include "ST_F401_84MHZ.h" 
          F401_init84 myinit(1); 

in front of your code to use the external 8MHz crystal.

If you want to use a different crystal or frequency : the STM32CubeMX tool is your friend :-)

external crystal value

The mbed lib is using HSE_VALUE defined in the file stm32f4xx_hal_config.h to calculate SystemCoreClock, which is used for all timings : baudrate or wait() ... This value is the frequency of the external crystal. It is defined to 25MHz at the moment I have asked to change it to 8MHz default. You can set the variable SystemCoreClock to 84000000 to patch this . If you use the internal oscillator the calculated value is ok The value was changed to 8 MHz.

Committer:
dreschpe
Date:
Sat Mar 08 15:03:38 2014 +0000
Revision:
5:f44655076466
Parent:
4:0834e0e36a1e
Child:
6:b9343c8b85ec
- change from function to c++ object to ensure early startup  ; - add docu

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreschpe 0:e54167eaccc6 1 // use the STM32CubeMX Tool to calculate the register settings
dreschpe 0:e54167eaccc6 2 // www.st.com/stm32cube‎
dreschpe 0:e54167eaccc6 3 //
dreschpe 0:e54167eaccc6 4
dreschpe 0:e54167eaccc6 5 #include "stm32f4xx_hal.h"
dreschpe 5:f44655076466 6 #include "ST_F401_84MHZ.h"
dreschpe 0:e54167eaccc6 7
dreschpe 5:f44655076466 8 F401_init84::F401_init84(unsigned int external){
dreschpe 5:f44655076466 9 if(external == 1){
dreschpe 5:f44655076466 10 SystemClock_Config_84MHz_external();
dreschpe 5:f44655076466 11 }
dreschpe 5:f44655076466 12 else {
dreschpe 5:f44655076466 13 SystemClock_Config_84MHz_internal();
dreschpe 5:f44655076466 14 }
dreschpe 5:f44655076466 15 }
dreschpe 5:f44655076466 16
dreschpe 5:f44655076466 17 void F401_init84::SystemClock_Config_84MHz_internal(void)
dreschpe 0:e54167eaccc6 18 {
dreschpe 0:e54167eaccc6 19 RCC_ClkInitTypeDef RCC_ClkInitStruct;
dreschpe 0:e54167eaccc6 20 RCC_OscInitTypeDef RCC_OscInitStruct;
dreschpe 0:e54167eaccc6 21
dreschpe 0:e54167eaccc6 22 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // internal 16MHz RC
dreschpe 0:e54167eaccc6 23 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
dreschpe 0:e54167eaccc6 24 RCC_OscInitStruct.HSICalibrationValue = 6;
dreschpe 0:e54167eaccc6 25 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // PLL on
dreschpe 0:e54167eaccc6 26 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
dreschpe 0:e54167eaccc6 27 RCC_OscInitStruct.PLL.PLLM = 16; // setup PLL divider
dreschpe 0:e54167eaccc6 28 RCC_OscInitStruct.PLL.PLLN = 336;
dreschpe 0:e54167eaccc6 29 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
dreschpe 0:e54167eaccc6 30 RCC_OscInitStruct.PLL.PLLQ = 4;
dreschpe 0:e54167eaccc6 31 HAL_RCC_OscConfig(&RCC_OscInitStruct);
dreschpe 0:e54167eaccc6 32
dreschpe 0:e54167eaccc6 33 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
dreschpe 0:e54167eaccc6 34 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
dreschpe 0:e54167eaccc6 35 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
dreschpe 0:e54167eaccc6 36 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
dreschpe 3:1d8106fcb4c5 37 SystemCoreClockUpdate(); // update SystemCoreClock var
dreschpe 2:e5c1060ec62d 38 }
dreschpe 2:e5c1060ec62d 39
dreschpe 2:e5c1060ec62d 40
dreschpe 2:e5c1060ec62d 41 // use a external 8 MHz crystal to generate the CPU clock
dreschpe 2:e5c1060ec62d 42 // You have to add X3 8MHz
dreschpe 2:e5c1060ec62d 43 // C33,C34 18pF 0603
dreschpe 2:e5c1060ec62d 44 // R35,R37 0R 0603 or use wire
dreschpe 4:0834e0e36a1e 45
dreschpe 4:0834e0e36a1e 46
dreschpe 5:f44655076466 47 void F401_init84::SystemClock_Config_84MHz_external(void)
dreschpe 2:e5c1060ec62d 48 {
dreschpe 2:e5c1060ec62d 49 RCC_ClkInitTypeDef RCC_ClkInitStruct;
dreschpe 2:e5c1060ec62d 50 RCC_OscInitTypeDef RCC_OscInitStruct;
dreschpe 2:e5c1060ec62d 51
dreschpe 2:e5c1060ec62d 52 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
dreschpe 2:e5c1060ec62d 53 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
dreschpe 2:e5c1060ec62d 54 RCC_OscInitStruct.LSIState = RCC_LSI_ON;
dreschpe 2:e5c1060ec62d 55 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
dreschpe 2:e5c1060ec62d 56 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
dreschpe 2:e5c1060ec62d 57 RCC_OscInitStruct.PLL.PLLM = 8;
dreschpe 2:e5c1060ec62d 58 RCC_OscInitStruct.PLL.PLLN = 336;
dreschpe 2:e5c1060ec62d 59 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
dreschpe 2:e5c1060ec62d 60 RCC_OscInitStruct.PLL.PLLQ = 4;
dreschpe 2:e5c1060ec62d 61 HAL_RCC_OscConfig(&RCC_OscInitStruct);
dreschpe 2:e5c1060ec62d 62
dreschpe 2:e5c1060ec62d 63 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
dreschpe 2:e5c1060ec62d 64 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
dreschpe 2:e5c1060ec62d 65 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
dreschpe 2:e5c1060ec62d 66 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
dreschpe 3:1d8106fcb4c5 67 SystemCoreClockUpdate(); // update SystemCoreClock var
dreschpe 2:e5c1060ec62d 68
dreschpe 2:e5c1060ec62d 69 }