Fixed with HAL.

Fork of ST_L152_32MHZ by Peter Drescher

Not finish yet. External crystal doesn't work.

ST_L152_32MHZ.cpp

Committer:
dreschpe
Date:
2014-03-11
Revision:
1:bdeac50afe1a
Parent:
0:84e23a19e37d
Child:
2:9e2ba1d93567

File content as of revision 1:bdeac50afe1a:

/* mbed library for the ST NUCLEO board L152RE 
 * to change the CPU clock to 32 MHz
 * A pll clock of 96 MHz is used to enable USB  
 *
 * Copyright (c) 2014 Peter Drescher - DC2PD
 * Released under the MIT License: http://mbed.org/license/mit
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
 
#include "stm32l1xx.h"
#include "stm32l1xx_flash.h"
#include "stm32l1xx_rcc.h"
#include "ST_L152_32MHZ.h"

// only the constructor  
L152_init32::L152_init32(unsigned int external){
    Status = setup_clock_32MHZ(external);
    }

#define PLL_STARTUP_TIMEOUT 0x5000

ClockStatus 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(EXT_ERR);
        }
        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(PLL_ERR);
    }
    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(OK);
}