Lib to change the clock speed of the ST Nucleo L152RE board to 32 MHz.

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

         #include "ST_L152_32MHZ.h"
        L152_init32 myinit(0);   // use the internal oscillator 

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. The PLL is switched to 96MHz to enable the use of the USB interface.

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 have to be short with a small piece of wire.

         #include "ST_L152_32MHZ.h"
        L152_init32 myinit(1);   // use external crystal oscillator 
Revision:
0:84e23a19e37d
Child:
1:bdeac50afe1a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ST_L152_32MHZ.cpp	Tue Mar 11 20:34:57 2014 +0000
@@ -0,0 +1,46 @@
+
+
+#include "stm32l1xx.h"
+#include "stm32l1xx_flash.h"
+#include "stm32l1xx_rcc.h"
+#include "ST_L152_32MHZ.h"
+
+// set cpu clock to 32MHz
+
+
+
+L152_init32::L152_init32(unsigned int external){
+    clk_err = setup_clock_32MHZ(external);
+    }
+
+#define PLL_STARTUP_TIMEOUT 0x5000
+
+int L152_init32::setup_clock_32MHZ(int external)
+{
+    uint32_t PLLStartUpCounter = 0,PLLStatus = 0,error;
+
+    if(external == 0) {                                               // internal Oscillator
+        RCC_PLLConfig(RCC_PLLSource_HSI,RCC_PLLMul_6,RCC_PLLDiv_3);   // setup pll to 96MHz to use USB
+    } else {
+        RCC_HSEConfig(RCC_HSE_ON);                                    // start external crystal osc.
+        error = RCC_WaitForHSEStartUp();
+        if(error == ERROR ) { // no external crystal
+            return(0);
+        }
+        RCC_PLLConfig(RCC_PLLSource_HSE,RCC_PLLMul_12,RCC_PLLDiv_3);   // setup pll to 96MHz to use USB
+    }
+    RCC_PLLCmd(ENABLE);                                                // switch on pll
+    do {
+        PLLStatus = RCC->CR & RCC_CR_PLLRDY;
+    } while((PLLStatus == 0) && (PLLStartUpCounter < PLL_STARTUP_TIMEOUT)); // wait for pll
+    if(PLLStatus == 0) {
+        return(0);
+    }
+    FLASH_SetLatency(FLASH_Latency_1);
+    FLASH_PrefetchBufferCmd(ENABLE);
+    FLASH_ReadAccess64Cmd(ENABLE);
+    RCC_HCLKConfig(RCC_SYSCLK_Div2);
+    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  // switch to 32 MHz clock
+    SystemCoreClockUpdate();                    // update SystemCoreClock var
+    return(1);
+}
\ No newline at end of file