From c7807517dab52769630c7427c7b5c2fbf317094b Mon Sep 17 00:00:00 2001 From: Hauke Petersen <mail@haukepetersen.de> Date: Mon, 29 Sep 2014 14:53:59 +0200 Subject: [PATCH] cpu/stm32f1: added clock config to cpu.c --- cpu/cortex-m3_common/include/cmsis_system.h | 44 --------------- cpu/stm32f1/cpu.c | 59 +++++++++++++++++++++ 2 files changed, 59 insertions(+), 44 deletions(-) delete mode 100644 cpu/cortex-m3_common/include/cmsis_system.h diff --git a/cpu/cortex-m3_common/include/cmsis_system.h b/cpu/cortex-m3_common/include/cmsis_system.h deleted file mode 100644 index c1e0abd592..0000000000 --- a/cpu/cortex-m3_common/include/cmsis_system.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2014 Freie Universität Berlin - * - * This file is subject to the terms and conditions of the GNU Lesser General - * Public License v2.1. See the file LICENSE in the top level directory for more - * details. - */ - -/** - * @ingroup cpu_cortexm3_common - * @{ - * - * @file - * @brief CMSIS system header definitions for the Cortex-M3 - * - * @author Hauke Petersen <hauke.petersen@fu-berlin.de> - */ - -#ifndef __CMSIS_SYSTEM_H -#define __CMSIS_SYSTEM_H - -#include <stdint.h> - -/** - * @brief This variable holds the current CPU core clock frequency in Hz - */ -extern uint32_t SystemCoreClock; - -/** - * @brief Initialize the system's clock system - * - * This function sets up the system's clock tree, concerning all options - * regarding PLL setup, external clock source configuration and prescaler - * setup for peripheral buses. - */ -void SystemInit(void); - -/** - * @brief Update the `SystemCoreClock` variable with the current core clock value - */ -void SystemCoreClockUpdate(void); - - -#endif /* __CMSIS_SYSTEM_H */ diff --git a/cpu/stm32f1/cpu.c b/cpu/stm32f1/cpu.c index 7db00cd3c7..e1e32912db 100644 --- a/cpu/stm32f1/cpu.c +++ b/cpu/stm32f1/cpu.c @@ -17,14 +17,73 @@ * @author Stefan Pfeiffer <stefan.pfeiffer@fu-berlin.de> * @author Alaeddine Weslati <alaeddine.weslati@inria.fr> * @author Thomas Eichinger <thomas.eichinger@fu-berlin.de> + * @author Hauke Petersen <hauke.petersen@fu-berlin.de> * * @} */ #include "cpu.h" +#include "periph_conf.h" + +static void clk_init(void); void cpu_init(void) { /* set PendSV priority to the lowest possible priority */ NVIC_SetPriority(PendSV_IRQn, 0xff); + /* configure the vector table location to internal flash */ + SCB->VTOR = FLASH_BASE; + /* initialize system clocks */ + clk_init(); +} + +/** + * @brief Configure the clock system of the stm32f1 + * + */ +static void clk_init(void) +{ + /* Reset the RCC clock configuration to the default reset state(for debug purpose) */ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ + RCC->CFGR &= (uint32_t)0xF0FF0000; + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ + RCC->CFGR &= (uint32_t)0xFF80FFFF; + /* Disable all interrupts and clear pending bits */ + RCC->CIR = (uint32_t)0x009F0000; + + /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration */ + /* Enable HSE */ + RCC->CR |= ((uint32_t)RCC_CR_HSEON); + /* Wait till HSE is ready, + * NOTE: the MCU will stay here forever if no HSE clock is connected */ + while ((RCC->CR & RCC_CR_HSERDY) == 0); + /* Enable Prefetch Buffer */ + FLASH->ACR |= FLASH_ACR_PRFTBE; + /* Flash 2 wait state */ + FLASH->ACR &= ~((uint32_t)FLASH_ACR_LATENCY); + FLASH->ACR |= (uint32_t)CLOCK_FLASH_LATENCY; + /* HCLK = SYSCLK */ + RCC->CFGR |= (uint32_t)CLOCK_AHB_DIV; + /* PCLK2 = HCLK */ + RCC->CFGR |= (uint32_t)CLOCK_APB2_DIV; + /* PCLK1 = HCLK */ + RCC->CFGR |= (uint32_t)CLOCK_APB1_DIV; + /* PLL configuration: PLLCLK = HSE / HSE_DIV * HSE_MUL */ + RCC->CFGR &= ~((uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | CLOCK_PLL_HSE_DIV | CLOCK_PLL_HSE_MUL); + /* Enable PLL */ + RCC->CR |= RCC_CR_PLLON; + /* Wait till PLL is ready */ + while ((RCC->CR & RCC_CR_PLLRDY) == 0); + /* Select PLL as system clock source */ + RCC->CFGR &= ~((uint32_t)(RCC_CFGR_SW)); + RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); } -- GitLab