mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Thu Sep 17 08:45:09 2015 +0100
Revision:
623:c9b73cd93427
Parent:
520:7182721120da
Synchronized with git revision 37ae865a61f3a923446d20dd4046fd79deb07f85

Full URL: https://github.com/mbedmicro/mbed/commit/37ae865a61f3a923446d20dd4046fd79deb07f85/

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 20:4263a77256ae 1 /**
bogdanm 20:4263a77256ae 2 ******************************************************************************
bogdanm 20:4263a77256ae 3 * @file system_stm32f4xx.c
bogdanm 20:4263a77256ae 4 * @author MCD Application Team
bogdanm 20:4263a77256ae 5 * @version V1.1.0
bogdanm 20:4263a77256ae 6 * @date 11-January-2013
bogdanm 20:4263a77256ae 7 * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File.
bogdanm 20:4263a77256ae 8 * This file contains the system clock configuration for STM32F4xx devices,
bogdanm 20:4263a77256ae 9 * and is generated by the clock configuration tool
bogdanm 20:4263a77256ae 10 * stm32f4xx_Clock_Configuration_V1.1.0.xls
bogdanm 20:4263a77256ae 11 *
bogdanm 20:4263a77256ae 12 * 1. This file provides two functions and one global variable to be called from
bogdanm 20:4263a77256ae 13 * user application:
bogdanm 20:4263a77256ae 14 * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier
bogdanm 20:4263a77256ae 15 * and Divider factors, AHB/APBx prescalers and Flash settings),
bogdanm 20:4263a77256ae 16 * depending on the configuration made in the clock xls tool.
bogdanm 20:4263a77256ae 17 * This function is called at startup just after reset and
bogdanm 20:4263a77256ae 18 * before branch to main program. This call is made inside
bogdanm 20:4263a77256ae 19 * the "startup_stm32f4xx.s" file.
bogdanm 20:4263a77256ae 20 *
bogdanm 20:4263a77256ae 21 * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
bogdanm 20:4263a77256ae 22 * by the user application to setup the SysTick
bogdanm 20:4263a77256ae 23 * timer or configure other parameters.
bogdanm 20:4263a77256ae 24 *
bogdanm 20:4263a77256ae 25 * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
bogdanm 20:4263a77256ae 26 * be called whenever the core clock is changed
bogdanm 20:4263a77256ae 27 * during program execution.
bogdanm 20:4263a77256ae 28 *
bogdanm 20:4263a77256ae 29 * 2. After each device reset the HSI (16 MHz) is used as system clock source.
bogdanm 20:4263a77256ae 30 * Then SystemInit() function is called, in "startup_stm32f4xx.s" file, to
bogdanm 20:4263a77256ae 31 * configure the system clock before to branch to main program.
bogdanm 20:4263a77256ae 32 *
bogdanm 20:4263a77256ae 33 * 3. If the system clock source selected by user fails to startup, the SystemInit()
bogdanm 20:4263a77256ae 34 * function will do nothing and HSI still used as system clock source. User can
bogdanm 20:4263a77256ae 35 * add some code to deal with this issue inside the SetSysClock() function.
bogdanm 20:4263a77256ae 36 *
bogdanm 20:4263a77256ae 37 * 4. The default value of HSE crystal is set to 25MHz, refer to "HSE_VALUE" define
bogdanm 20:4263a77256ae 38 * in "stm32f4xx.h" file. When HSE is used as system clock source, directly or
bogdanm 20:4263a77256ae 39 * through PLL, and you are using different crystal you have to adapt the HSE
bogdanm 20:4263a77256ae 40 * value to your own configuration.
bogdanm 20:4263a77256ae 41 *
bogdanm 20:4263a77256ae 42 * 5. This file configures the system clock as follows:
bogdanm 20:4263a77256ae 43 *=============================================================================
bogdanm 20:4263a77256ae 44 *=============================================================================
bogdanm 20:4263a77256ae 45 * Supported STM32F40xx/41xx/427x/437x devices
bogdanm 20:4263a77256ae 46 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 47 * System Clock source | PLL (HSE)
bogdanm 20:4263a77256ae 48 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 49 * SYSCLK(Hz) | 168000000
bogdanm 20:4263a77256ae 50 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 51 * HCLK(Hz) | 168000000
bogdanm 20:4263a77256ae 52 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 53 * AHB Prescaler | 1
bogdanm 20:4263a77256ae 54 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 55 * APB1 Prescaler | 4
bogdanm 20:4263a77256ae 56 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 57 * APB2 Prescaler | 2
bogdanm 20:4263a77256ae 58 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 59 * HSE Frequency(Hz) | 8000000
bogdanm 20:4263a77256ae 60 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 61 * PLL_M | 8
bogdanm 20:4263a77256ae 62 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 63 * PLL_N | 336
bogdanm 20:4263a77256ae 64 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 65 * PLL_P | 2
bogdanm 20:4263a77256ae 66 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 67 * PLL_Q | 7
bogdanm 20:4263a77256ae 68 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 69 * PLLI2S_N | 271
bogdanm 20:4263a77256ae 70 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 71 * PLLI2S_R | 2
bogdanm 20:4263a77256ae 72 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 73 * I2S input clock | NA
bogdanm 20:4263a77256ae 74 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 75 * VDD(V) | 3.3
bogdanm 20:4263a77256ae 76 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 77 * Main regulator output voltage | Scale1 mode
bogdanm 20:4263a77256ae 78 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 79 * Flash Latency(WS) | 5
bogdanm 20:4263a77256ae 80 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 81 * Prefetch Buffer | ON
bogdanm 20:4263a77256ae 82 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 83 * Instruction cache | ON
bogdanm 20:4263a77256ae 84 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 85 * Data cache | ON
bogdanm 20:4263a77256ae 86 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 87 * Require 48MHz for USB OTG FS, | Disabled
bogdanm 20:4263a77256ae 88 * SDIO and RNG clock |
bogdanm 20:4263a77256ae 89 *-----------------------------------------------------------------------------
bogdanm 20:4263a77256ae 90 *=============================================================================
bogdanm 20:4263a77256ae 91 ******************************************************************************
bogdanm 20:4263a77256ae 92 * @attention
bogdanm 20:4263a77256ae 93 *
bogdanm 20:4263a77256ae 94 * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
bogdanm 20:4263a77256ae 95 *
bogdanm 20:4263a77256ae 96 * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
bogdanm 20:4263a77256ae 97 * You may not use this file except in compliance with the License.
bogdanm 20:4263a77256ae 98 * You may obtain a copy of the License at:
bogdanm 20:4263a77256ae 99 *
bogdanm 20:4263a77256ae 100 * http://www.st.com/software_license_agreement_liberty_v2
bogdanm 20:4263a77256ae 101 *
bogdanm 20:4263a77256ae 102 * Unless required by applicable law or agreed to in writing, software
bogdanm 20:4263a77256ae 103 * distributed under the License is distributed on an "AS IS" BASIS,
bogdanm 20:4263a77256ae 104 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
bogdanm 20:4263a77256ae 105 * See the License for the specific language governing permissions and
bogdanm 20:4263a77256ae 106 * limitations under the License.
bogdanm 20:4263a77256ae 107 *
bogdanm 20:4263a77256ae 108 ******************************************************************************
bogdanm 20:4263a77256ae 109 */
bogdanm 20:4263a77256ae 110
bogdanm 20:4263a77256ae 111 /** @addtogroup CMSIS
bogdanm 20:4263a77256ae 112 * @{
bogdanm 20:4263a77256ae 113 */
bogdanm 20:4263a77256ae 114
bogdanm 20:4263a77256ae 115 /** @addtogroup stm32f4xx_system
bogdanm 20:4263a77256ae 116 * @{
bogdanm 20:4263a77256ae 117 */
bogdanm 20:4263a77256ae 118
bogdanm 20:4263a77256ae 119 /** @addtogroup STM32F4xx_System_Private_Includes
bogdanm 20:4263a77256ae 120 * @{
bogdanm 20:4263a77256ae 121 */
bogdanm 20:4263a77256ae 122
bogdanm 20:4263a77256ae 123 #include "stm32f4xx.h"
bogdanm 20:4263a77256ae 124
bogdanm 20:4263a77256ae 125 /**
bogdanm 20:4263a77256ae 126 * @}
bogdanm 20:4263a77256ae 127 */
bogdanm 20:4263a77256ae 128
bogdanm 20:4263a77256ae 129 /** @addtogroup STM32F4xx_System_Private_TypesDefinitions
bogdanm 20:4263a77256ae 130 * @{
bogdanm 20:4263a77256ae 131 */
bogdanm 20:4263a77256ae 132
bogdanm 20:4263a77256ae 133 /**
bogdanm 20:4263a77256ae 134 * @}
bogdanm 20:4263a77256ae 135 */
bogdanm 20:4263a77256ae 136
bogdanm 20:4263a77256ae 137 /** @addtogroup STM32F4xx_System_Private_Defines
bogdanm 20:4263a77256ae 138 * @{
bogdanm 20:4263a77256ae 139 */
bogdanm 20:4263a77256ae 140
bogdanm 20:4263a77256ae 141 /************************* Miscellaneous Configuration ************************/
bogdanm 20:4263a77256ae 142 /*!< Uncomment the following line if you need to use external SRAM mounted
bogdanm 20:4263a77256ae 143 on STM324xG_EVAL/STM324x7I_EVAL boards as data memory */
bogdanm 20:4263a77256ae 144 /* #define DATA_IN_ExtSRAM */
bogdanm 20:4263a77256ae 145
bogdanm 20:4263a77256ae 146 /*!< Uncomment the following line if you need to relocate your vector Table in
bogdanm 20:4263a77256ae 147 Internal SRAM. */
bogdanm 20:4263a77256ae 148 /* #define VECT_TAB_SRAM */
bogdanm 20:4263a77256ae 149 #define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field.
bogdanm 20:4263a77256ae 150 This value must be a multiple of 0x200. */
bogdanm 20:4263a77256ae 151 /******************************************************************************/
bogdanm 20:4263a77256ae 152
bogdanm 20:4263a77256ae 153 /************************* PLL Parameters *************************************/
bogdanm 20:4263a77256ae 154 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
bogdanm 20:4263a77256ae 155 #define PLL_M 8
bogdanm 20:4263a77256ae 156 #define PLL_N 336
bogdanm 20:4263a77256ae 157
bogdanm 20:4263a77256ae 158 /* SYSCLK = PLL_VCO / PLL_P */
bogdanm 20:4263a77256ae 159 #define PLL_P 2
bogdanm 20:4263a77256ae 160
bogdanm 20:4263a77256ae 161 /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
bogdanm 20:4263a77256ae 162 #define PLL_Q 7
bogdanm 20:4263a77256ae 163
bogdanm 20:4263a77256ae 164 #define PLLI2S_N 271
bogdanm 20:4263a77256ae 165 #define PLLI2S_R 2
bogdanm 20:4263a77256ae 166
bogdanm 20:4263a77256ae 167 /******************************************************************************/
bogdanm 20:4263a77256ae 168
bogdanm 20:4263a77256ae 169 /**
bogdanm 20:4263a77256ae 170 * @}
bogdanm 20:4263a77256ae 171 */
bogdanm 20:4263a77256ae 172
bogdanm 20:4263a77256ae 173 /** @addtogroup STM32F4xx_System_Private_Macros
bogdanm 20:4263a77256ae 174 * @{
bogdanm 20:4263a77256ae 175 */
bogdanm 20:4263a77256ae 176
bogdanm 20:4263a77256ae 177 /**
bogdanm 20:4263a77256ae 178 * @}
bogdanm 20:4263a77256ae 179 */
bogdanm 20:4263a77256ae 180
bogdanm 20:4263a77256ae 181 /** @addtogroup STM32F4xx_System_Private_Variables
bogdanm 20:4263a77256ae 182 * @{
bogdanm 20:4263a77256ae 183 */
bogdanm 20:4263a77256ae 184
bogdanm 20:4263a77256ae 185 uint32_t SystemCoreClock = 168000000;
bogdanm 20:4263a77256ae 186
mbed_official 520:7182721120da 187 const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
bogdanm 20:4263a77256ae 188
bogdanm 20:4263a77256ae 189 /**
bogdanm 20:4263a77256ae 190 * @}
bogdanm 20:4263a77256ae 191 */
bogdanm 20:4263a77256ae 192
bogdanm 20:4263a77256ae 193 /** @addtogroup STM32F4xx_System_Private_FunctionPrototypes
bogdanm 20:4263a77256ae 194 * @{
bogdanm 20:4263a77256ae 195 */
bogdanm 20:4263a77256ae 196
bogdanm 20:4263a77256ae 197 static void SetSysClock(void);
bogdanm 20:4263a77256ae 198 #ifdef DATA_IN_ExtSRAM
bogdanm 20:4263a77256ae 199 static void SystemInit_ExtMemCtl(void);
bogdanm 20:4263a77256ae 200 #endif /* DATA_IN_ExtSRAM */
bogdanm 20:4263a77256ae 201
bogdanm 20:4263a77256ae 202 /**
bogdanm 20:4263a77256ae 203 * @}
bogdanm 20:4263a77256ae 204 */
bogdanm 20:4263a77256ae 205
bogdanm 20:4263a77256ae 206 /** @addtogroup STM32F4xx_System_Private_Functions
bogdanm 20:4263a77256ae 207 * @{
bogdanm 20:4263a77256ae 208 */
bogdanm 20:4263a77256ae 209
bogdanm 20:4263a77256ae 210 /**
bogdanm 20:4263a77256ae 211 * @brief Setup the microcontroller system
bogdanm 20:4263a77256ae 212 * Initialize the Embedded Flash Interface, the PLL and update the
bogdanm 20:4263a77256ae 213 * SystemFrequency variable.
bogdanm 20:4263a77256ae 214 * @param None
bogdanm 20:4263a77256ae 215 * @retval None
bogdanm 20:4263a77256ae 216 */
bogdanm 20:4263a77256ae 217 void SystemInit(void)
bogdanm 20:4263a77256ae 218 {
bogdanm 20:4263a77256ae 219 /* FPU settings ------------------------------------------------------------*/
bogdanm 20:4263a77256ae 220 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
bogdanm 20:4263a77256ae 221 SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
bogdanm 20:4263a77256ae 222 #endif
bogdanm 20:4263a77256ae 223 /* Reset the RCC clock configuration to the default reset state ------------*/
bogdanm 20:4263a77256ae 224 /* Set HSION bit */
bogdanm 20:4263a77256ae 225 RCC->CR |= (uint32_t)0x00000001;
bogdanm 20:4263a77256ae 226
bogdanm 20:4263a77256ae 227 /* Reset CFGR register */
bogdanm 20:4263a77256ae 228 RCC->CFGR = 0x00000000;
bogdanm 20:4263a77256ae 229
bogdanm 20:4263a77256ae 230 /* Reset HSEON, CSSON and PLLON bits */
bogdanm 20:4263a77256ae 231 RCC->CR &= (uint32_t)0xFEF6FFFF;
bogdanm 20:4263a77256ae 232
bogdanm 20:4263a77256ae 233 /* Reset PLLCFGR register */
bogdanm 20:4263a77256ae 234 RCC->PLLCFGR = 0x24003010;
bogdanm 20:4263a77256ae 235
bogdanm 20:4263a77256ae 236 /* Reset HSEBYP bit */
bogdanm 20:4263a77256ae 237 RCC->CR &= (uint32_t)0xFFFBFFFF;
bogdanm 20:4263a77256ae 238
bogdanm 20:4263a77256ae 239 /* Disable all interrupts */
bogdanm 20:4263a77256ae 240 RCC->CIR = 0x00000000;
bogdanm 20:4263a77256ae 241
bogdanm 20:4263a77256ae 242 #ifdef DATA_IN_ExtSRAM
bogdanm 20:4263a77256ae 243 SystemInit_ExtMemCtl();
bogdanm 20:4263a77256ae 244 #endif /* DATA_IN_ExtSRAM */
bogdanm 20:4263a77256ae 245
bogdanm 20:4263a77256ae 246 /* Configure the System clock source, PLL Multiplier and Divider factors,
bogdanm 20:4263a77256ae 247 AHB/APBx prescalers and Flash settings ----------------------------------*/
bogdanm 20:4263a77256ae 248 SetSysClock();
bogdanm 20:4263a77256ae 249
bogdanm 20:4263a77256ae 250 /* Configure the Vector Table location add offset address ------------------*/
bogdanm 20:4263a77256ae 251 #ifdef VECT_TAB_SRAM
bogdanm 20:4263a77256ae 252 SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
bogdanm 20:4263a77256ae 253 #else
bogdanm 20:4263a77256ae 254 SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
bogdanm 20:4263a77256ae 255 #endif
bogdanm 20:4263a77256ae 256 }
bogdanm 20:4263a77256ae 257
bogdanm 20:4263a77256ae 258 /**
bogdanm 20:4263a77256ae 259 * @brief Update SystemCoreClock variable according to Clock Register Values.
bogdanm 20:4263a77256ae 260 * The SystemCoreClock variable contains the core clock (HCLK), it can
bogdanm 20:4263a77256ae 261 * be used by the user application to setup the SysTick timer or configure
bogdanm 20:4263a77256ae 262 * other parameters.
bogdanm 20:4263a77256ae 263 *
bogdanm 20:4263a77256ae 264 * @note Each time the core clock (HCLK) changes, this function must be called
bogdanm 20:4263a77256ae 265 * to update SystemCoreClock variable value. Otherwise, any configuration
bogdanm 20:4263a77256ae 266 * based on this variable will be incorrect.
bogdanm 20:4263a77256ae 267 *
bogdanm 20:4263a77256ae 268 * @note - The system frequency computed by this function is not the real
bogdanm 20:4263a77256ae 269 * frequency in the chip. It is calculated based on the predefined
bogdanm 20:4263a77256ae 270 * constant and the selected clock source:
bogdanm 20:4263a77256ae 271 *
bogdanm 20:4263a77256ae 272 * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
bogdanm 20:4263a77256ae 273 *
bogdanm 20:4263a77256ae 274 * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
bogdanm 20:4263a77256ae 275 *
bogdanm 20:4263a77256ae 276 * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**)
bogdanm 20:4263a77256ae 277 * or HSI_VALUE(*) multiplied/divided by the PLL factors.
bogdanm 20:4263a77256ae 278 *
bogdanm 20:4263a77256ae 279 * (*) HSI_VALUE is a constant defined in stm32f4xx.h file (default value
bogdanm 20:4263a77256ae 280 * 16 MHz) but the real value may vary depending on the variations
bogdanm 20:4263a77256ae 281 * in voltage and temperature.
bogdanm 20:4263a77256ae 282 *
bogdanm 20:4263a77256ae 283 * (**) HSE_VALUE is a constant defined in stm32f4xx.h file (default value
bogdanm 20:4263a77256ae 284 * 25 MHz), user has to ensure that HSE_VALUE is same as the real
bogdanm 20:4263a77256ae 285 * frequency of the crystal used. Otherwise, this function may
bogdanm 20:4263a77256ae 286 * have wrong result.
bogdanm 20:4263a77256ae 287 *
bogdanm 20:4263a77256ae 288 * - The result of this function could be not correct when using fractional
bogdanm 20:4263a77256ae 289 * value for HSE crystal.
bogdanm 20:4263a77256ae 290 *
bogdanm 20:4263a77256ae 291 * @param None
bogdanm 20:4263a77256ae 292 * @retval None
bogdanm 20:4263a77256ae 293 */
bogdanm 20:4263a77256ae 294 void SystemCoreClockUpdate(void)
bogdanm 20:4263a77256ae 295 {
bogdanm 20:4263a77256ae 296 uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
bogdanm 20:4263a77256ae 297
bogdanm 20:4263a77256ae 298 /* Get SYSCLK source -------------------------------------------------------*/
bogdanm 20:4263a77256ae 299 tmp = RCC->CFGR & RCC_CFGR_SWS;
bogdanm 20:4263a77256ae 300
bogdanm 20:4263a77256ae 301 switch (tmp)
bogdanm 20:4263a77256ae 302 {
bogdanm 20:4263a77256ae 303 case 0x00: /* HSI used as system clock source */
bogdanm 20:4263a77256ae 304 SystemCoreClock = HSI_VALUE;
bogdanm 20:4263a77256ae 305 break;
bogdanm 20:4263a77256ae 306 case 0x04: /* HSE used as system clock source */
bogdanm 20:4263a77256ae 307 SystemCoreClock = HSE_VALUE;
bogdanm 20:4263a77256ae 308 break;
bogdanm 20:4263a77256ae 309 case 0x08: /* PLL used as system clock source */
bogdanm 20:4263a77256ae 310
bogdanm 20:4263a77256ae 311 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
bogdanm 20:4263a77256ae 312 SYSCLK = PLL_VCO / PLL_P
bogdanm 20:4263a77256ae 313 */
bogdanm 20:4263a77256ae 314 pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
bogdanm 20:4263a77256ae 315 pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
bogdanm 20:4263a77256ae 316
bogdanm 20:4263a77256ae 317 if (pllsource != 0)
bogdanm 20:4263a77256ae 318 {
bogdanm 20:4263a77256ae 319 /* HSE used as PLL clock source */
bogdanm 20:4263a77256ae 320 pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
bogdanm 20:4263a77256ae 321 }
bogdanm 20:4263a77256ae 322 else
bogdanm 20:4263a77256ae 323 {
bogdanm 20:4263a77256ae 324 /* HSI used as PLL clock source */
bogdanm 20:4263a77256ae 325 pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
bogdanm 20:4263a77256ae 326 }
bogdanm 20:4263a77256ae 327
bogdanm 20:4263a77256ae 328 pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
bogdanm 20:4263a77256ae 329 SystemCoreClock = pllvco/pllp;
bogdanm 20:4263a77256ae 330 break;
bogdanm 20:4263a77256ae 331 default:
bogdanm 20:4263a77256ae 332 SystemCoreClock = HSI_VALUE;
bogdanm 20:4263a77256ae 333 break;
bogdanm 20:4263a77256ae 334 }
bogdanm 20:4263a77256ae 335 /* Compute HCLK frequency --------------------------------------------------*/
bogdanm 20:4263a77256ae 336 /* Get HCLK prescaler */
bogdanm 20:4263a77256ae 337 tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
bogdanm 20:4263a77256ae 338 /* HCLK frequency */
bogdanm 20:4263a77256ae 339 SystemCoreClock >>= tmp;
bogdanm 20:4263a77256ae 340 }
bogdanm 20:4263a77256ae 341
bogdanm 20:4263a77256ae 342 /**
bogdanm 20:4263a77256ae 343 * @brief Configures the System clock source, PLL Multiplier and Divider factors,
bogdanm 20:4263a77256ae 344 * AHB/APBx prescalers and Flash settings
bogdanm 20:4263a77256ae 345 * @Note This function should be called only once the RCC clock configuration
bogdanm 20:4263a77256ae 346 * is reset to the default reset state (done in SystemInit() function).
bogdanm 20:4263a77256ae 347 * @param None
bogdanm 20:4263a77256ae 348 * @retval None
bogdanm 20:4263a77256ae 349 */
bogdanm 20:4263a77256ae 350 static void SetSysClock(void)
bogdanm 20:4263a77256ae 351 {
bogdanm 20:4263a77256ae 352 /******************************************************************************/
bogdanm 20:4263a77256ae 353 /* PLL (clocked by HSE) used as System clock source */
bogdanm 20:4263a77256ae 354 /******************************************************************************/
bogdanm 20:4263a77256ae 355 __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
bogdanm 20:4263a77256ae 356
bogdanm 20:4263a77256ae 357 /* Enable HSE */
bogdanm 20:4263a77256ae 358 RCC->CR |= ((uint32_t)RCC_CR_HSEON);
bogdanm 20:4263a77256ae 359
bogdanm 20:4263a77256ae 360 /* Wait till HSE is ready and if Time out is reached exit */
bogdanm 20:4263a77256ae 361 do
bogdanm 20:4263a77256ae 362 {
bogdanm 20:4263a77256ae 363 HSEStatus = RCC->CR & RCC_CR_HSERDY;
bogdanm 20:4263a77256ae 364 StartUpCounter++;
bogdanm 20:4263a77256ae 365 } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
bogdanm 20:4263a77256ae 366
bogdanm 20:4263a77256ae 367 if ((RCC->CR & RCC_CR_HSERDY) != RESET)
bogdanm 20:4263a77256ae 368 {
bogdanm 20:4263a77256ae 369 HSEStatus = (uint32_t)0x01;
bogdanm 20:4263a77256ae 370 }
bogdanm 20:4263a77256ae 371 else
bogdanm 20:4263a77256ae 372 {
bogdanm 20:4263a77256ae 373 HSEStatus = (uint32_t)0x00;
bogdanm 20:4263a77256ae 374 }
bogdanm 20:4263a77256ae 375
bogdanm 20:4263a77256ae 376 if (HSEStatus == (uint32_t)0x01)
bogdanm 20:4263a77256ae 377 {
bogdanm 20:4263a77256ae 378 /* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */
bogdanm 20:4263a77256ae 379 RCC->APB1ENR |= RCC_APB1ENR_PWREN;
bogdanm 20:4263a77256ae 380 PWR->CR |= PWR_CR_VOS;
bogdanm 20:4263a77256ae 381
bogdanm 20:4263a77256ae 382 /* HCLK = SYSCLK / 1*/
bogdanm 20:4263a77256ae 383 RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
bogdanm 20:4263a77256ae 384
bogdanm 20:4263a77256ae 385 /* PCLK2 = HCLK / 2*/
bogdanm 20:4263a77256ae 386 RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
bogdanm 20:4263a77256ae 387
bogdanm 20:4263a77256ae 388 /* PCLK1 = HCLK / 4*/
bogdanm 20:4263a77256ae 389 RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
bogdanm 20:4263a77256ae 390
bogdanm 20:4263a77256ae 391 /* Configure the main PLL */
bogdanm 20:4263a77256ae 392 RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
bogdanm 20:4263a77256ae 393 (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
bogdanm 20:4263a77256ae 394
bogdanm 20:4263a77256ae 395 /* Enable the main PLL */
bogdanm 20:4263a77256ae 396 RCC->CR |= RCC_CR_PLLON;
bogdanm 20:4263a77256ae 397
bogdanm 20:4263a77256ae 398 /* Wait till the main PLL is ready */
bogdanm 20:4263a77256ae 399 while((RCC->CR & RCC_CR_PLLRDY) == 0)
bogdanm 20:4263a77256ae 400 {
bogdanm 20:4263a77256ae 401 }
bogdanm 20:4263a77256ae 402
bogdanm 20:4263a77256ae 403 /* Configure the I2S PLL */
bogdanm 20:4263a77256ae 404 RCC->PLLI2SCFGR = (PLLI2S_N << 6) | (PLLI2S_R << 28);
bogdanm 20:4263a77256ae 405
bogdanm 20:4263a77256ae 406 /* Enable the I2S PLL */
bogdanm 20:4263a77256ae 407 RCC->CR |= RCC_CR_PLLI2SON;
bogdanm 20:4263a77256ae 408
bogdanm 20:4263a77256ae 409 /* Wait until the I2S PLL is ready */
bogdanm 20:4263a77256ae 410 while (!(RCC->CR & RCC_CR_PLLI2SRDY));
bogdanm 20:4263a77256ae 411
bogdanm 20:4263a77256ae 412 /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
bogdanm 20:4263a77256ae 413 FLASH->ACR = FLASH_ACR_PRFTEN |FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
bogdanm 20:4263a77256ae 414
bogdanm 20:4263a77256ae 415 /* Select the main PLL as system clock source */
bogdanm 20:4263a77256ae 416 RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
bogdanm 20:4263a77256ae 417 RCC->CFGR |= RCC_CFGR_SW_PLL;
bogdanm 20:4263a77256ae 418
bogdanm 20:4263a77256ae 419 /* Wait till the main PLL is used as system clock source */
bogdanm 20:4263a77256ae 420 while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
bogdanm 20:4263a77256ae 421 {
bogdanm 20:4263a77256ae 422 }
bogdanm 20:4263a77256ae 423 }
bogdanm 20:4263a77256ae 424 else
bogdanm 20:4263a77256ae 425 { /* If HSE fails to start-up, the application will have wrong clock
bogdanm 20:4263a77256ae 426 configuration. User can add here some code to deal with this error */
bogdanm 20:4263a77256ae 427 }
bogdanm 20:4263a77256ae 428
bogdanm 20:4263a77256ae 429 }
bogdanm 20:4263a77256ae 430
bogdanm 20:4263a77256ae 431 /**
bogdanm 20:4263a77256ae 432 * @brief Setup the external memory controller. Called in startup_stm32f4xx.s
bogdanm 20:4263a77256ae 433 * before jump to __main
bogdanm 20:4263a77256ae 434 * @param None
bogdanm 20:4263a77256ae 435 * @retval None
bogdanm 20:4263a77256ae 436 */
bogdanm 20:4263a77256ae 437 #ifdef DATA_IN_ExtSRAM
bogdanm 20:4263a77256ae 438 /**
bogdanm 20:4263a77256ae 439 * @brief Setup the external memory controller.
bogdanm 20:4263a77256ae 440 * Called in startup_stm32f4xx.s before jump to main.
bogdanm 20:4263a77256ae 441 * This function configures the external SRAM mounted on STM324xG_EVAL/STM324x7I boards
bogdanm 20:4263a77256ae 442 * This SRAM will be used as program data memory (including heap and stack).
bogdanm 20:4263a77256ae 443 * @param None
bogdanm 20:4263a77256ae 444 * @retval None
bogdanm 20:4263a77256ae 445 */
bogdanm 20:4263a77256ae 446 void SystemInit_ExtMemCtl(void)
bogdanm 20:4263a77256ae 447 {
bogdanm 20:4263a77256ae 448 /*-- GPIOs Configuration -----------------------------------------------------*/
bogdanm 20:4263a77256ae 449 /*
bogdanm 20:4263a77256ae 450 +-------------------+--------------------+------------------+------------------+
bogdanm 20:4263a77256ae 451 + SRAM pins assignment +
bogdanm 20:4263a77256ae 452 +-------------------+--------------------+------------------+------------------+
bogdanm 20:4263a77256ae 453 | PD0 <-> FSMC_D2 | PE0 <-> FSMC_NBL0 | PF0 <-> FSMC_A0 | PG0 <-> FSMC_A10 |
bogdanm 20:4263a77256ae 454 | PD1 <-> FSMC_D3 | PE1 <-> FSMC_NBL1 | PF1 <-> FSMC_A1 | PG1 <-> FSMC_A11 |
bogdanm 20:4263a77256ae 455 | PD4 <-> FSMC_NOE | PE2 <-> FSMC_A23 | PF2 <-> FSMC_A2 | PG2 <-> FSMC_A12 |
bogdanm 20:4263a77256ae 456 | PD5 <-> FSMC_NWE | PE3 <-> FSMC_A19 | PF3 <-> FSMC_A3 | PG3 <-> FSMC_A13 |
bogdanm 20:4263a77256ae 457 | PD8 <-> FSMC_D13 | PE4 <-> FSMC_A20 | PF4 <-> FSMC_A4 | PG4 <-> FSMC_A14 |
bogdanm 20:4263a77256ae 458 | PD9 <-> FSMC_D14 | PE5 <-> FSMC_A21 | PF5 <-> FSMC_A5 | PG5 <-> FSMC_A15 |
bogdanm 20:4263a77256ae 459 | PD10 <-> FSMC_D15 | PE6 <-> FSMC_A22 | PF12 <-> FSMC_A6 | PG9 <-> FSMC_NE2 |
bogdanm 20:4263a77256ae 460 | PD11 <-> FSMC_A16 | PE7 <-> FSMC_D4 | PF13 <-> FSMC_A7 |------------------+
bogdanm 20:4263a77256ae 461 | PD12 <-> FSMC_A17 | PE8 <-> FSMC_D5 | PF14 <-> FSMC_A8 |
bogdanm 20:4263a77256ae 462 | PD13 <-> FSMC_A18 | PE9 <-> FSMC_D6 | PF15 <-> FSMC_A9 |
bogdanm 20:4263a77256ae 463 | PD14 <-> FSMC_D0 | PE10 <-> FSMC_D7 |------------------+
bogdanm 20:4263a77256ae 464 | PD15 <-> FSMC_D1 | PE11 <-> FSMC_D8 |
bogdanm 20:4263a77256ae 465 +-------------------| PE12 <-> FSMC_D9 |
bogdanm 20:4263a77256ae 466 | PE13 <-> FSMC_D10 |
bogdanm 20:4263a77256ae 467 | PE14 <-> FSMC_D11 |
bogdanm 20:4263a77256ae 468 | PE15 <-> FSMC_D12 |
bogdanm 20:4263a77256ae 469 +--------------------+
bogdanm 20:4263a77256ae 470 */
bogdanm 20:4263a77256ae 471 /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */
bogdanm 20:4263a77256ae 472 RCC->AHB1ENR |= 0x00000078;
bogdanm 20:4263a77256ae 473
bogdanm 20:4263a77256ae 474 /* Connect PDx pins to FSMC Alternate function */
bogdanm 20:4263a77256ae 475 GPIOD->AFR[0] = 0x00cc00cc;
bogdanm 20:4263a77256ae 476 GPIOD->AFR[1] = 0xcccccccc;
bogdanm 20:4263a77256ae 477 /* Configure PDx pins in Alternate function mode */
bogdanm 20:4263a77256ae 478 GPIOD->MODER = 0xaaaa0a0a;
bogdanm 20:4263a77256ae 479 /* Configure PDx pins speed to 100 MHz */
bogdanm 20:4263a77256ae 480 GPIOD->OSPEEDR = 0xffff0f0f;
bogdanm 20:4263a77256ae 481 /* Configure PDx pins Output type to push-pull */
bogdanm 20:4263a77256ae 482 GPIOD->OTYPER = 0x00000000;
bogdanm 20:4263a77256ae 483 /* No pull-up, pull-down for PDx pins */
bogdanm 20:4263a77256ae 484 GPIOD->PUPDR = 0x00000000;
bogdanm 20:4263a77256ae 485
bogdanm 20:4263a77256ae 486 /* Connect PEx pins to FSMC Alternate function */
bogdanm 20:4263a77256ae 487 GPIOE->AFR[0] = 0xcccccccc;
bogdanm 20:4263a77256ae 488 GPIOE->AFR[1] = 0xcccccccc;
bogdanm 20:4263a77256ae 489 /* Configure PEx pins in Alternate function mode */
bogdanm 20:4263a77256ae 490 GPIOE->MODER = 0xaaaaaaaa;
bogdanm 20:4263a77256ae 491 /* Configure PEx pins speed to 100 MHz */
bogdanm 20:4263a77256ae 492 GPIOE->OSPEEDR = 0xffffffff;
bogdanm 20:4263a77256ae 493 /* Configure PEx pins Output type to push-pull */
bogdanm 20:4263a77256ae 494 GPIOE->OTYPER = 0x00000000;
bogdanm 20:4263a77256ae 495 /* No pull-up, pull-down for PEx pins */
bogdanm 20:4263a77256ae 496 GPIOE->PUPDR = 0x00000000;
bogdanm 20:4263a77256ae 497
bogdanm 20:4263a77256ae 498 /* Connect PFx pins to FSMC Alternate function */
bogdanm 20:4263a77256ae 499 GPIOF->AFR[0] = 0x00cccccc;
bogdanm 20:4263a77256ae 500 GPIOF->AFR[1] = 0xcccc0000;
bogdanm 20:4263a77256ae 501 /* Configure PFx pins in Alternate function mode */
bogdanm 20:4263a77256ae 502 GPIOF->MODER = 0xaa000aaa;
bogdanm 20:4263a77256ae 503 /* Configure PFx pins speed to 100 MHz */
bogdanm 20:4263a77256ae 504 GPIOF->OSPEEDR = 0xff000fff;
bogdanm 20:4263a77256ae 505 /* Configure PFx pins Output type to push-pull */
bogdanm 20:4263a77256ae 506 GPIOF->OTYPER = 0x00000000;
bogdanm 20:4263a77256ae 507 /* No pull-up, pull-down for PFx pins */
bogdanm 20:4263a77256ae 508 GPIOF->PUPDR = 0x00000000;
bogdanm 20:4263a77256ae 509
bogdanm 20:4263a77256ae 510 /* Connect PGx pins to FSMC Alternate function */
bogdanm 20:4263a77256ae 511 GPIOG->AFR[0] = 0x00cccccc;
bogdanm 20:4263a77256ae 512 GPIOG->AFR[1] = 0x000000c0;
bogdanm 20:4263a77256ae 513 /* Configure PGx pins in Alternate function mode */
bogdanm 20:4263a77256ae 514 GPIOG->MODER = 0x00080aaa;
bogdanm 20:4263a77256ae 515 /* Configure PGx pins speed to 100 MHz */
bogdanm 20:4263a77256ae 516 GPIOG->OSPEEDR = 0x000c0fff;
bogdanm 20:4263a77256ae 517 /* Configure PGx pins Output type to push-pull */
bogdanm 20:4263a77256ae 518 GPIOG->OTYPER = 0x00000000;
bogdanm 20:4263a77256ae 519 /* No pull-up, pull-down for PGx pins */
bogdanm 20:4263a77256ae 520 GPIOG->PUPDR = 0x00000000;
bogdanm 20:4263a77256ae 521
bogdanm 20:4263a77256ae 522 /*-- FSMC Configuration ------------------------------------------------------*/
bogdanm 20:4263a77256ae 523 /* Enable the FSMC interface clock */
bogdanm 20:4263a77256ae 524 RCC->AHB3ENR |= 0x00000001;
bogdanm 20:4263a77256ae 525
bogdanm 20:4263a77256ae 526 /* Configure and enable Bank1_SRAM2 */
bogdanm 20:4263a77256ae 527 FSMC_Bank1->BTCR[2] = 0x00001011;
bogdanm 20:4263a77256ae 528 FSMC_Bank1->BTCR[3] = 0x00000201;
bogdanm 20:4263a77256ae 529 FSMC_Bank1E->BWTR[2] = 0x0fffffff;
bogdanm 20:4263a77256ae 530 /*
bogdanm 20:4263a77256ae 531 Bank1_SRAM2 is configured as follow:
bogdanm 20:4263a77256ae 532
bogdanm 20:4263a77256ae 533 p.FSMC_AddressSetupTime = 1;
bogdanm 20:4263a77256ae 534 p.FSMC_AddressHoldTime = 0;
bogdanm 20:4263a77256ae 535 p.FSMC_DataSetupTime = 2;
bogdanm 20:4263a77256ae 536 p.FSMC_BusTurnAroundDuration = 0;
bogdanm 20:4263a77256ae 537 p.FSMC_CLKDivision = 0;
bogdanm 20:4263a77256ae 538 p.FSMC_DataLatency = 0;
bogdanm 20:4263a77256ae 539 p.FSMC_AccessMode = FSMC_AccessMode_A;
bogdanm 20:4263a77256ae 540
bogdanm 20:4263a77256ae 541 FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2;
bogdanm 20:4263a77256ae 542 FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
bogdanm 20:4263a77256ae 543 FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
bogdanm 20:4263a77256ae 544 FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
bogdanm 20:4263a77256ae 545 FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
bogdanm 20:4263a77256ae 546 FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
bogdanm 20:4263a77256ae 547 FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
bogdanm 20:4263a77256ae 548 FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
bogdanm 20:4263a77256ae 549 FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
bogdanm 20:4263a77256ae 550 FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
bogdanm 20:4263a77256ae 551 FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
bogdanm 20:4263a77256ae 552 FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
bogdanm 20:4263a77256ae 553 FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
bogdanm 20:4263a77256ae 554 FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
bogdanm 20:4263a77256ae 555 FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
bogdanm 20:4263a77256ae 556 */
bogdanm 20:4263a77256ae 557 }
bogdanm 20:4263a77256ae 558 #endif /* DATA_IN_ExtSRAM */
bogdanm 20:4263a77256ae 559
bogdanm 20:4263a77256ae 560
bogdanm 20:4263a77256ae 561 /**
bogdanm 20:4263a77256ae 562 * @}
bogdanm 20:4263a77256ae 563 */
bogdanm 20:4263a77256ae 564
bogdanm 20:4263a77256ae 565 /**
bogdanm 20:4263a77256ae 566 * @}
bogdanm 20:4263a77256ae 567 */
bogdanm 20:4263a77256ae 568
bogdanm 20:4263a77256ae 569 /**
bogdanm 20:4263a77256ae 570 * @}
bogdanm 20:4263a77256ae 571 */
bogdanm 20:4263a77256ae 572 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
bogdanm 20:4263a77256ae 573