001

Committer:
ganlikun
Date:
Sun Jun 12 14:02:44 2022 +0000
Revision:
0:13413ea9a877
00

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ganlikun 0:13413ea9a877 1 /**
ganlikun 0:13413ea9a877 2 ******************************************************************************
ganlikun 0:13413ea9a877 3 * @file system_stm32f4xx.c
ganlikun 0:13413ea9a877 4 * @author MCD Application Team
ganlikun 0:13413ea9a877 5 * @version V2.6.1
ganlikun 0:13413ea9a877 6 * @date 14-February-2017
ganlikun 0:13413ea9a877 7 * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File.
ganlikun 0:13413ea9a877 8 *
ganlikun 0:13413ea9a877 9 * This file provides two functions and one global variable to be called from
ganlikun 0:13413ea9a877 10 * user application:
ganlikun 0:13413ea9a877 11 * - SystemInit(): This function is called at startup just after reset and
ganlikun 0:13413ea9a877 12 * before branch to main program. This call is made inside
ganlikun 0:13413ea9a877 13 * the "startup_stm32f4xx.s" file.
ganlikun 0:13413ea9a877 14 *
ganlikun 0:13413ea9a877 15 * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
ganlikun 0:13413ea9a877 16 * by the user application to setup the SysTick
ganlikun 0:13413ea9a877 17 * timer or configure other parameters.
ganlikun 0:13413ea9a877 18 *
ganlikun 0:13413ea9a877 19 * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
ganlikun 0:13413ea9a877 20 * be called whenever the core clock is changed
ganlikun 0:13413ea9a877 21 * during program execution.
ganlikun 0:13413ea9a877 22 *
ganlikun 0:13413ea9a877 23 *
ganlikun 0:13413ea9a877 24 ******************************************************************************
ganlikun 0:13413ea9a877 25 * @attention
ganlikun 0:13413ea9a877 26 *
ganlikun 0:13413ea9a877 27 * <h2><center>&copy; COPYRIGHT 2017 STMicroelectronics</center></h2>
ganlikun 0:13413ea9a877 28 *
ganlikun 0:13413ea9a877 29 * Redistribution and use in source and binary forms, with or without modification,
ganlikun 0:13413ea9a877 30 * are permitted provided that the following conditions are met:
ganlikun 0:13413ea9a877 31 * 1. Redistributions of source code must retain the above copyright notice,
ganlikun 0:13413ea9a877 32 * this list of conditions and the following disclaimer.
ganlikun 0:13413ea9a877 33 * 2. Redistributions in binary form must reproduce the above copyright notice,
ganlikun 0:13413ea9a877 34 * this list of conditions and the following disclaimer in the documentation
ganlikun 0:13413ea9a877 35 * and/or other materials provided with the distribution.
ganlikun 0:13413ea9a877 36 * 3. Neither the name of STMicroelectronics nor the names of its contributors
ganlikun 0:13413ea9a877 37 * may be used to endorse or promote products derived from this software
ganlikun 0:13413ea9a877 38 * without specific prior written permission.
ganlikun 0:13413ea9a877 39 *
ganlikun 0:13413ea9a877 40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
ganlikun 0:13413ea9a877 41 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ganlikun 0:13413ea9a877 42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
ganlikun 0:13413ea9a877 43 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
ganlikun 0:13413ea9a877 44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ganlikun 0:13413ea9a877 45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
ganlikun 0:13413ea9a877 46 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
ganlikun 0:13413ea9a877 47 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
ganlikun 0:13413ea9a877 48 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
ganlikun 0:13413ea9a877 49 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ganlikun 0:13413ea9a877 50 *
ganlikun 0:13413ea9a877 51 ******************************************************************************
ganlikun 0:13413ea9a877 52 */
ganlikun 0:13413ea9a877 53
ganlikun 0:13413ea9a877 54 /** @addtogroup CMSIS
ganlikun 0:13413ea9a877 55 * @{
ganlikun 0:13413ea9a877 56 */
ganlikun 0:13413ea9a877 57
ganlikun 0:13413ea9a877 58 /** @addtogroup stm32f4xx_system
ganlikun 0:13413ea9a877 59 * @{
ganlikun 0:13413ea9a877 60 */
ganlikun 0:13413ea9a877 61
ganlikun 0:13413ea9a877 62 /** @addtogroup STM32F4xx_System_Private_Includes
ganlikun 0:13413ea9a877 63 * @{
ganlikun 0:13413ea9a877 64 */
ganlikun 0:13413ea9a877 65
ganlikun 0:13413ea9a877 66
ganlikun 0:13413ea9a877 67 #include "stm32f4xx.h"
ganlikun 0:13413ea9a877 68
ganlikun 0:13413ea9a877 69 #if !defined (HSE_VALUE)
ganlikun 0:13413ea9a877 70 #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */
ganlikun 0:13413ea9a877 71 #endif /* HSE_VALUE */
ganlikun 0:13413ea9a877 72
ganlikun 0:13413ea9a877 73 #if !defined (HSI_VALUE)
ganlikun 0:13413ea9a877 74 #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
ganlikun 0:13413ea9a877 75 #endif /* HSI_VALUE */
ganlikun 0:13413ea9a877 76
ganlikun 0:13413ea9a877 77 /**
ganlikun 0:13413ea9a877 78 * @}
ganlikun 0:13413ea9a877 79 */
ganlikun 0:13413ea9a877 80
ganlikun 0:13413ea9a877 81 /** @addtogroup STM32F4xx_System_Private_TypesDefinitions
ganlikun 0:13413ea9a877 82 * @{
ganlikun 0:13413ea9a877 83 */
ganlikun 0:13413ea9a877 84
ganlikun 0:13413ea9a877 85 /**
ganlikun 0:13413ea9a877 86 * @}
ganlikun 0:13413ea9a877 87 */
ganlikun 0:13413ea9a877 88
ganlikun 0:13413ea9a877 89 /** @addtogroup STM32F4xx_System_Private_Defines
ganlikun 0:13413ea9a877 90 * @{
ganlikun 0:13413ea9a877 91 */
ganlikun 0:13413ea9a877 92
ganlikun 0:13413ea9a877 93 /************************* Miscellaneous Configuration ************************/
ganlikun 0:13413ea9a877 94 /*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */
ganlikun 0:13413ea9a877 95 #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\
ganlikun 0:13413ea9a877 96 || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
ganlikun 0:13413ea9a877 97 || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx)
ganlikun 0:13413ea9a877 98 /* #define DATA_IN_ExtSRAM */
ganlikun 0:13413ea9a877 99 #endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\
ganlikun 0:13413ea9a877 100 STM32F412Zx || STM32F412Vx */
ganlikun 0:13413ea9a877 101
ganlikun 0:13413ea9a877 102 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
ganlikun 0:13413ea9a877 103 || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx)
ganlikun 0:13413ea9a877 104 /* #define DATA_IN_ExtSDRAM */
ganlikun 0:13413ea9a877 105 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\
ganlikun 0:13413ea9a877 106 STM32F479xx */
ganlikun 0:13413ea9a877 107
ganlikun 0:13413ea9a877 108 /*!< Uncomment the following line if you need to relocate your vector Table in
ganlikun 0:13413ea9a877 109 Internal SRAM. */
ganlikun 0:13413ea9a877 110 /* #define VECT_TAB_SRAM */
ganlikun 0:13413ea9a877 111 #define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field.
ganlikun 0:13413ea9a877 112 This value must be a multiple of 0x200. */
ganlikun 0:13413ea9a877 113 /******************************************************************************/
ganlikun 0:13413ea9a877 114
ganlikun 0:13413ea9a877 115 /**
ganlikun 0:13413ea9a877 116 * @}
ganlikun 0:13413ea9a877 117 */
ganlikun 0:13413ea9a877 118
ganlikun 0:13413ea9a877 119 /** @addtogroup STM32F4xx_System_Private_Macros
ganlikun 0:13413ea9a877 120 * @{
ganlikun 0:13413ea9a877 121 */
ganlikun 0:13413ea9a877 122
ganlikun 0:13413ea9a877 123 /**
ganlikun 0:13413ea9a877 124 * @}
ganlikun 0:13413ea9a877 125 */
ganlikun 0:13413ea9a877 126
ganlikun 0:13413ea9a877 127 /** @addtogroup STM32F4xx_System_Private_Variables
ganlikun 0:13413ea9a877 128 * @{
ganlikun 0:13413ea9a877 129 */
ganlikun 0:13413ea9a877 130 /* This variable is updated in three ways:
ganlikun 0:13413ea9a877 131 1) by calling CMSIS function SystemCoreClockUpdate()
ganlikun 0:13413ea9a877 132 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
ganlikun 0:13413ea9a877 133 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
ganlikun 0:13413ea9a877 134 Note: If you use this function to configure the system clock; then there
ganlikun 0:13413ea9a877 135 is no need to call the 2 first functions listed above, since SystemCoreClock
ganlikun 0:13413ea9a877 136 variable is updated automatically.
ganlikun 0:13413ea9a877 137 */
ganlikun 0:13413ea9a877 138 uint32_t SystemCoreClock = 16000000;
ganlikun 0:13413ea9a877 139 const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
ganlikun 0:13413ea9a877 140 const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4};
ganlikun 0:13413ea9a877 141 /**
ganlikun 0:13413ea9a877 142 * @}
ganlikun 0:13413ea9a877 143 */
ganlikun 0:13413ea9a877 144
ganlikun 0:13413ea9a877 145 /** @addtogroup STM32F4xx_System_Private_FunctionPrototypes
ganlikun 0:13413ea9a877 146 * @{
ganlikun 0:13413ea9a877 147 */
ganlikun 0:13413ea9a877 148
ganlikun 0:13413ea9a877 149 #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
ganlikun 0:13413ea9a877 150 static void SystemInit_ExtMemCtl(void);
ganlikun 0:13413ea9a877 151 #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
ganlikun 0:13413ea9a877 152
ganlikun 0:13413ea9a877 153 /**
ganlikun 0:13413ea9a877 154 * @}
ganlikun 0:13413ea9a877 155 */
ganlikun 0:13413ea9a877 156
ganlikun 0:13413ea9a877 157 /** @addtogroup STM32F4xx_System_Private_Functions
ganlikun 0:13413ea9a877 158 * @{
ganlikun 0:13413ea9a877 159 */
ganlikun 0:13413ea9a877 160
ganlikun 0:13413ea9a877 161 /*+ MBED */
ganlikun 0:13413ea9a877 162 #if 0
ganlikun 0:13413ea9a877 163 /*- MBED */
ganlikun 0:13413ea9a877 164
ganlikun 0:13413ea9a877 165 /**
ganlikun 0:13413ea9a877 166 * @brief Setup the microcontroller system
ganlikun 0:13413ea9a877 167 * Initialize the FPU setting, vector table location and External memory
ganlikun 0:13413ea9a877 168 * configuration.
ganlikun 0:13413ea9a877 169 * @param None
ganlikun 0:13413ea9a877 170 * @retval None
ganlikun 0:13413ea9a877 171 */
ganlikun 0:13413ea9a877 172 void SystemInit(void)
ganlikun 0:13413ea9a877 173 {
ganlikun 0:13413ea9a877 174 /* FPU settings ------------------------------------------------------------*/
ganlikun 0:13413ea9a877 175 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
ganlikun 0:13413ea9a877 176 SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
ganlikun 0:13413ea9a877 177 #endif
ganlikun 0:13413ea9a877 178 /* Reset the RCC clock configuration to the default reset state ------------*/
ganlikun 0:13413ea9a877 179 /* Set HSION bit */
ganlikun 0:13413ea9a877 180 RCC->CR |= (uint32_t)0x00000001;
ganlikun 0:13413ea9a877 181
ganlikun 0:13413ea9a877 182 /* Reset CFGR register */
ganlikun 0:13413ea9a877 183 RCC->CFGR = 0x00000000;
ganlikun 0:13413ea9a877 184
ganlikun 0:13413ea9a877 185 /* Reset HSEON, CSSON and PLLON bits */
ganlikun 0:13413ea9a877 186 RCC->CR &= (uint32_t)0xFEF6FFFF;
ganlikun 0:13413ea9a877 187
ganlikun 0:13413ea9a877 188 /* Reset PLLCFGR register */
ganlikun 0:13413ea9a877 189 RCC->PLLCFGR = 0x24003010;
ganlikun 0:13413ea9a877 190
ganlikun 0:13413ea9a877 191 /* Reset HSEBYP bit */
ganlikun 0:13413ea9a877 192 RCC->CR &= (uint32_t)0xFFFBFFFF;
ganlikun 0:13413ea9a877 193
ganlikun 0:13413ea9a877 194 /* Disable all interrupts */
ganlikun 0:13413ea9a877 195 RCC->CIR = 0x00000000;
ganlikun 0:13413ea9a877 196
ganlikun 0:13413ea9a877 197 #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
ganlikun 0:13413ea9a877 198 SystemInit_ExtMemCtl();
ganlikun 0:13413ea9a877 199 #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
ganlikun 0:13413ea9a877 200
ganlikun 0:13413ea9a877 201 /* Configure the Vector Table location add offset address ------------------*/
ganlikun 0:13413ea9a877 202 #ifdef VECT_TAB_SRAM
ganlikun 0:13413ea9a877 203 SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
ganlikun 0:13413ea9a877 204 #else
ganlikun 0:13413ea9a877 205 SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
ganlikun 0:13413ea9a877 206 #endif
ganlikun 0:13413ea9a877 207 }
ganlikun 0:13413ea9a877 208
ganlikun 0:13413ea9a877 209 /*+ MBED */
ganlikun 0:13413ea9a877 210 #endif
ganlikun 0:13413ea9a877 211 /*- MBED */
ganlikun 0:13413ea9a877 212
ganlikun 0:13413ea9a877 213 /**
ganlikun 0:13413ea9a877 214 * @brief Update SystemCoreClock variable according to Clock Register Values.
ganlikun 0:13413ea9a877 215 * The SystemCoreClock variable contains the core clock (HCLK), it can
ganlikun 0:13413ea9a877 216 * be used by the user application to setup the SysTick timer or configure
ganlikun 0:13413ea9a877 217 * other parameters.
ganlikun 0:13413ea9a877 218 *
ganlikun 0:13413ea9a877 219 * @note Each time the core clock (HCLK) changes, this function must be called
ganlikun 0:13413ea9a877 220 * to update SystemCoreClock variable value. Otherwise, any configuration
ganlikun 0:13413ea9a877 221 * based on this variable will be incorrect.
ganlikun 0:13413ea9a877 222 *
ganlikun 0:13413ea9a877 223 * @note - The system frequency computed by this function is not the real
ganlikun 0:13413ea9a877 224 * frequency in the chip. It is calculated based on the predefined
ganlikun 0:13413ea9a877 225 * constant and the selected clock source:
ganlikun 0:13413ea9a877 226 *
ganlikun 0:13413ea9a877 227 * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
ganlikun 0:13413ea9a877 228 *
ganlikun 0:13413ea9a877 229 * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
ganlikun 0:13413ea9a877 230 *
ganlikun 0:13413ea9a877 231 * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**)
ganlikun 0:13413ea9a877 232 * or HSI_VALUE(*) multiplied/divided by the PLL factors.
ganlikun 0:13413ea9a877 233 *
ganlikun 0:13413ea9a877 234 * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value
ganlikun 0:13413ea9a877 235 * 16 MHz) but the real value may vary depending on the variations
ganlikun 0:13413ea9a877 236 * in voltage and temperature.
ganlikun 0:13413ea9a877 237 *
ganlikun 0:13413ea9a877 238 * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value
ganlikun 0:13413ea9a877 239 * depends on the application requirements), user has to ensure that HSE_VALUE
ganlikun 0:13413ea9a877 240 * is same as the real frequency of the crystal used. Otherwise, this function
ganlikun 0:13413ea9a877 241 * may have wrong result.
ganlikun 0:13413ea9a877 242 *
ganlikun 0:13413ea9a877 243 * - The result of this function could be not correct when using fractional
ganlikun 0:13413ea9a877 244 * value for HSE crystal.
ganlikun 0:13413ea9a877 245 *
ganlikun 0:13413ea9a877 246 * @param None
ganlikun 0:13413ea9a877 247 * @retval None
ganlikun 0:13413ea9a877 248 */
ganlikun 0:13413ea9a877 249 void SystemCoreClockUpdate(void)
ganlikun 0:13413ea9a877 250 {
ganlikun 0:13413ea9a877 251 uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
ganlikun 0:13413ea9a877 252
ganlikun 0:13413ea9a877 253 /* Get SYSCLK source -------------------------------------------------------*/
ganlikun 0:13413ea9a877 254 tmp = RCC->CFGR & RCC_CFGR_SWS;
ganlikun 0:13413ea9a877 255
ganlikun 0:13413ea9a877 256 switch (tmp)
ganlikun 0:13413ea9a877 257 {
ganlikun 0:13413ea9a877 258 case 0x00: /* HSI used as system clock source */
ganlikun 0:13413ea9a877 259 SystemCoreClock = HSI_VALUE;
ganlikun 0:13413ea9a877 260 break;
ganlikun 0:13413ea9a877 261 case 0x04: /* HSE used as system clock source */
ganlikun 0:13413ea9a877 262 SystemCoreClock = HSE_VALUE;
ganlikun 0:13413ea9a877 263 break;
ganlikun 0:13413ea9a877 264 case 0x08: /* PLL used as system clock source */
ganlikun 0:13413ea9a877 265
ganlikun 0:13413ea9a877 266 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
ganlikun 0:13413ea9a877 267 SYSCLK = PLL_VCO / PLL_P
ganlikun 0:13413ea9a877 268 */
ganlikun 0:13413ea9a877 269 pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
ganlikun 0:13413ea9a877 270 pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
ganlikun 0:13413ea9a877 271
ganlikun 0:13413ea9a877 272 if (pllsource != 0)
ganlikun 0:13413ea9a877 273 {
ganlikun 0:13413ea9a877 274 /* HSE used as PLL clock source */
ganlikun 0:13413ea9a877 275 pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
ganlikun 0:13413ea9a877 276 }
ganlikun 0:13413ea9a877 277 else
ganlikun 0:13413ea9a877 278 {
ganlikun 0:13413ea9a877 279 /* HSI used as PLL clock source */
ganlikun 0:13413ea9a877 280 pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
ganlikun 0:13413ea9a877 281 }
ganlikun 0:13413ea9a877 282
ganlikun 0:13413ea9a877 283 pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
ganlikun 0:13413ea9a877 284 SystemCoreClock = pllvco/pllp;
ganlikun 0:13413ea9a877 285 break;
ganlikun 0:13413ea9a877 286 default:
ganlikun 0:13413ea9a877 287 SystemCoreClock = HSI_VALUE;
ganlikun 0:13413ea9a877 288 break;
ganlikun 0:13413ea9a877 289 }
ganlikun 0:13413ea9a877 290 /* Compute HCLK frequency --------------------------------------------------*/
ganlikun 0:13413ea9a877 291 /* Get HCLK prescaler */
ganlikun 0:13413ea9a877 292 tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
ganlikun 0:13413ea9a877 293 /* HCLK frequency */
ganlikun 0:13413ea9a877 294 SystemCoreClock >>= tmp;
ganlikun 0:13413ea9a877 295 }
ganlikun 0:13413ea9a877 296
ganlikun 0:13413ea9a877 297 #if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM)
ganlikun 0:13413ea9a877 298 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
ganlikun 0:13413ea9a877 299 || defined(STM32F469xx) || defined(STM32F479xx)
ganlikun 0:13413ea9a877 300 /**
ganlikun 0:13413ea9a877 301 * @brief Setup the external memory controller.
ganlikun 0:13413ea9a877 302 * Called in startup_stm32f4xx.s before jump to main.
ganlikun 0:13413ea9a877 303 * This function configures the external memories (SRAM/SDRAM)
ganlikun 0:13413ea9a877 304 * This SRAM/SDRAM will be used as program data memory (including heap and stack).
ganlikun 0:13413ea9a877 305 * @param None
ganlikun 0:13413ea9a877 306 * @retval None
ganlikun 0:13413ea9a877 307 */
ganlikun 0:13413ea9a877 308 void SystemInit_ExtMemCtl(void)
ganlikun 0:13413ea9a877 309 {
ganlikun 0:13413ea9a877 310 __IO uint32_t tmp = 0x00;
ganlikun 0:13413ea9a877 311
ganlikun 0:13413ea9a877 312 register uint32_t tmpreg = 0, timeout = 0xFFFF;
ganlikun 0:13413ea9a877 313 register __IO uint32_t index;
ganlikun 0:13413ea9a877 314
ganlikun 0:13413ea9a877 315 /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */
ganlikun 0:13413ea9a877 316 RCC->AHB1ENR |= 0x000001F8;
ganlikun 0:13413ea9a877 317
ganlikun 0:13413ea9a877 318 /* Delay after an RCC peripheral clock enabling */
ganlikun 0:13413ea9a877 319 tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);
ganlikun 0:13413ea9a877 320
ganlikun 0:13413ea9a877 321 /* Connect PDx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 322 GPIOD->AFR[0] = 0x00CCC0CC;
ganlikun 0:13413ea9a877 323 GPIOD->AFR[1] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 324 /* Configure PDx pins in Alternate function mode */
ganlikun 0:13413ea9a877 325 GPIOD->MODER = 0xAAAA0A8A;
ganlikun 0:13413ea9a877 326 /* Configure PDx pins speed to 100 MHz */
ganlikun 0:13413ea9a877 327 GPIOD->OSPEEDR = 0xFFFF0FCF;
ganlikun 0:13413ea9a877 328 /* Configure PDx pins Output type to push-pull */
ganlikun 0:13413ea9a877 329 GPIOD->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 330 /* No pull-up, pull-down for PDx pins */
ganlikun 0:13413ea9a877 331 GPIOD->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 332
ganlikun 0:13413ea9a877 333 /* Connect PEx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 334 GPIOE->AFR[0] = 0xC00CC0CC;
ganlikun 0:13413ea9a877 335 GPIOE->AFR[1] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 336 /* Configure PEx pins in Alternate function mode */
ganlikun 0:13413ea9a877 337 GPIOE->MODER = 0xAAAA828A;
ganlikun 0:13413ea9a877 338 /* Configure PEx pins speed to 100 MHz */
ganlikun 0:13413ea9a877 339 GPIOE->OSPEEDR = 0xFFFFC3CF;
ganlikun 0:13413ea9a877 340 /* Configure PEx pins Output type to push-pull */
ganlikun 0:13413ea9a877 341 GPIOE->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 342 /* No pull-up, pull-down for PEx pins */
ganlikun 0:13413ea9a877 343 GPIOE->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 344
ganlikun 0:13413ea9a877 345 /* Connect PFx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 346 GPIOF->AFR[0] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 347 GPIOF->AFR[1] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 348 /* Configure PFx pins in Alternate function mode */
ganlikun 0:13413ea9a877 349 GPIOF->MODER = 0xAA800AAA;
ganlikun 0:13413ea9a877 350 /* Configure PFx pins speed to 50 MHz */
ganlikun 0:13413ea9a877 351 GPIOF->OSPEEDR = 0xAA800AAA;
ganlikun 0:13413ea9a877 352 /* Configure PFx pins Output type to push-pull */
ganlikun 0:13413ea9a877 353 GPIOF->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 354 /* No pull-up, pull-down for PFx pins */
ganlikun 0:13413ea9a877 355 GPIOF->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 356
ganlikun 0:13413ea9a877 357 /* Connect PGx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 358 GPIOG->AFR[0] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 359 GPIOG->AFR[1] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 360 /* Configure PGx pins in Alternate function mode */
ganlikun 0:13413ea9a877 361 GPIOG->MODER = 0xAAAAAAAA;
ganlikun 0:13413ea9a877 362 /* Configure PGx pins speed to 50 MHz */
ganlikun 0:13413ea9a877 363 GPIOG->OSPEEDR = 0xAAAAAAAA;
ganlikun 0:13413ea9a877 364 /* Configure PGx pins Output type to push-pull */
ganlikun 0:13413ea9a877 365 GPIOG->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 366 /* No pull-up, pull-down for PGx pins */
ganlikun 0:13413ea9a877 367 GPIOG->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 368
ganlikun 0:13413ea9a877 369 /* Connect PHx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 370 GPIOH->AFR[0] = 0x00C0CC00;
ganlikun 0:13413ea9a877 371 GPIOH->AFR[1] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 372 /* Configure PHx pins in Alternate function mode */
ganlikun 0:13413ea9a877 373 GPIOH->MODER = 0xAAAA08A0;
ganlikun 0:13413ea9a877 374 /* Configure PHx pins speed to 50 MHz */
ganlikun 0:13413ea9a877 375 GPIOH->OSPEEDR = 0xAAAA08A0;
ganlikun 0:13413ea9a877 376 /* Configure PHx pins Output type to push-pull */
ganlikun 0:13413ea9a877 377 GPIOH->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 378 /* No pull-up, pull-down for PHx pins */
ganlikun 0:13413ea9a877 379 GPIOH->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 380
ganlikun 0:13413ea9a877 381 /* Connect PIx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 382 GPIOI->AFR[0] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 383 GPIOI->AFR[1] = 0x00000CC0;
ganlikun 0:13413ea9a877 384 /* Configure PIx pins in Alternate function mode */
ganlikun 0:13413ea9a877 385 GPIOI->MODER = 0x0028AAAA;
ganlikun 0:13413ea9a877 386 /* Configure PIx pins speed to 50 MHz */
ganlikun 0:13413ea9a877 387 GPIOI->OSPEEDR = 0x0028AAAA;
ganlikun 0:13413ea9a877 388 /* Configure PIx pins Output type to push-pull */
ganlikun 0:13413ea9a877 389 GPIOI->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 390 /* No pull-up, pull-down for PIx pins */
ganlikun 0:13413ea9a877 391 GPIOI->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 392
ganlikun 0:13413ea9a877 393 /*-- FMC Configuration -------------------------------------------------------*/
ganlikun 0:13413ea9a877 394 /* Enable the FMC interface clock */
ganlikun 0:13413ea9a877 395 RCC->AHB3ENR |= 0x00000001;
ganlikun 0:13413ea9a877 396 /* Delay after an RCC peripheral clock enabling */
ganlikun 0:13413ea9a877 397 tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
ganlikun 0:13413ea9a877 398
ganlikun 0:13413ea9a877 399 FMC_Bank5_6->SDCR[0] = 0x000019E4;
ganlikun 0:13413ea9a877 400 FMC_Bank5_6->SDTR[0] = 0x01115351;
ganlikun 0:13413ea9a877 401
ganlikun 0:13413ea9a877 402 /* SDRAM initialization sequence */
ganlikun 0:13413ea9a877 403 /* Clock enable command */
ganlikun 0:13413ea9a877 404 FMC_Bank5_6->SDCMR = 0x00000011;
ganlikun 0:13413ea9a877 405 tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
ganlikun 0:13413ea9a877 406 while((tmpreg != 0) && (timeout-- > 0))
ganlikun 0:13413ea9a877 407 {
ganlikun 0:13413ea9a877 408 tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
ganlikun 0:13413ea9a877 409 }
ganlikun 0:13413ea9a877 410
ganlikun 0:13413ea9a877 411 /* Delay */
ganlikun 0:13413ea9a877 412 for (index = 0; index<1000; index++);
ganlikun 0:13413ea9a877 413
ganlikun 0:13413ea9a877 414 /* PALL command */
ganlikun 0:13413ea9a877 415 FMC_Bank5_6->SDCMR = 0x00000012;
ganlikun 0:13413ea9a877 416 timeout = 0xFFFF;
ganlikun 0:13413ea9a877 417 while((tmpreg != 0) && (timeout-- > 0))
ganlikun 0:13413ea9a877 418 {
ganlikun 0:13413ea9a877 419 tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
ganlikun 0:13413ea9a877 420 }
ganlikun 0:13413ea9a877 421
ganlikun 0:13413ea9a877 422 /* Auto refresh command */
ganlikun 0:13413ea9a877 423 FMC_Bank5_6->SDCMR = 0x00000073;
ganlikun 0:13413ea9a877 424 timeout = 0xFFFF;
ganlikun 0:13413ea9a877 425 while((tmpreg != 0) && (timeout-- > 0))
ganlikun 0:13413ea9a877 426 {
ganlikun 0:13413ea9a877 427 tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
ganlikun 0:13413ea9a877 428 }
ganlikun 0:13413ea9a877 429
ganlikun 0:13413ea9a877 430 /* MRD register program */
ganlikun 0:13413ea9a877 431 FMC_Bank5_6->SDCMR = 0x00046014;
ganlikun 0:13413ea9a877 432 timeout = 0xFFFF;
ganlikun 0:13413ea9a877 433 while((tmpreg != 0) && (timeout-- > 0))
ganlikun 0:13413ea9a877 434 {
ganlikun 0:13413ea9a877 435 tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
ganlikun 0:13413ea9a877 436 }
ganlikun 0:13413ea9a877 437
ganlikun 0:13413ea9a877 438 /* Set refresh count */
ganlikun 0:13413ea9a877 439 tmpreg = FMC_Bank5_6->SDRTR;
ganlikun 0:13413ea9a877 440 FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1));
ganlikun 0:13413ea9a877 441
ganlikun 0:13413ea9a877 442 /* Disable write protection */
ganlikun 0:13413ea9a877 443 tmpreg = FMC_Bank5_6->SDCR[0];
ganlikun 0:13413ea9a877 444 FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF);
ganlikun 0:13413ea9a877 445
ganlikun 0:13413ea9a877 446 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
ganlikun 0:13413ea9a877 447 /* Configure and enable Bank1_SRAM2 */
ganlikun 0:13413ea9a877 448 FMC_Bank1->BTCR[2] = 0x00001011;
ganlikun 0:13413ea9a877 449 FMC_Bank1->BTCR[3] = 0x00000201;
ganlikun 0:13413ea9a877 450 FMC_Bank1E->BWTR[2] = 0x0fffffff;
ganlikun 0:13413ea9a877 451 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
ganlikun 0:13413ea9a877 452 #if defined(STM32F469xx) || defined(STM32F479xx)
ganlikun 0:13413ea9a877 453 /* Configure and enable Bank1_SRAM2 */
ganlikun 0:13413ea9a877 454 FMC_Bank1->BTCR[2] = 0x00001091;
ganlikun 0:13413ea9a877 455 FMC_Bank1->BTCR[3] = 0x00110212;
ganlikun 0:13413ea9a877 456 FMC_Bank1E->BWTR[2] = 0x0fffffff;
ganlikun 0:13413ea9a877 457 #endif /* STM32F469xx || STM32F479xx */
ganlikun 0:13413ea9a877 458
ganlikun 0:13413ea9a877 459 (void)(tmp);
ganlikun 0:13413ea9a877 460 }
ganlikun 0:13413ea9a877 461 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
ganlikun 0:13413ea9a877 462 #elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
ganlikun 0:13413ea9a877 463 /**
ganlikun 0:13413ea9a877 464 * @brief Setup the external memory controller.
ganlikun 0:13413ea9a877 465 * Called in startup_stm32f4xx.s before jump to main.
ganlikun 0:13413ea9a877 466 * This function configures the external memories (SRAM/SDRAM)
ganlikun 0:13413ea9a877 467 * This SRAM/SDRAM will be used as program data memory (including heap and stack).
ganlikun 0:13413ea9a877 468 * @param None
ganlikun 0:13413ea9a877 469 * @retval None
ganlikun 0:13413ea9a877 470 */
ganlikun 0:13413ea9a877 471 void SystemInit_ExtMemCtl(void)
ganlikun 0:13413ea9a877 472 {
ganlikun 0:13413ea9a877 473 __IO uint32_t tmp = 0x00;
ganlikun 0:13413ea9a877 474 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
ganlikun 0:13413ea9a877 475 || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx)
ganlikun 0:13413ea9a877 476 #if defined (DATA_IN_ExtSDRAM)
ganlikun 0:13413ea9a877 477 register uint32_t tmpreg = 0, timeout = 0xFFFF;
ganlikun 0:13413ea9a877 478 register __IO uint32_t index;
ganlikun 0:13413ea9a877 479
ganlikun 0:13413ea9a877 480 #if defined(STM32F446xx)
ganlikun 0:13413ea9a877 481 /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface
ganlikun 0:13413ea9a877 482 clock */
ganlikun 0:13413ea9a877 483 RCC->AHB1ENR |= 0x0000007D;
ganlikun 0:13413ea9a877 484 #else
ganlikun 0:13413ea9a877 485 /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface
ganlikun 0:13413ea9a877 486 clock */
ganlikun 0:13413ea9a877 487 RCC->AHB1ENR |= 0x000001F8;
ganlikun 0:13413ea9a877 488 #endif /* STM32F446xx */
ganlikun 0:13413ea9a877 489 /* Delay after an RCC peripheral clock enabling */
ganlikun 0:13413ea9a877 490 tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);
ganlikun 0:13413ea9a877 491
ganlikun 0:13413ea9a877 492 #if defined(STM32F446xx)
ganlikun 0:13413ea9a877 493 /* Connect PAx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 494 GPIOA->AFR[0] |= 0xC0000000;
ganlikun 0:13413ea9a877 495 GPIOA->AFR[1] |= 0x00000000;
ganlikun 0:13413ea9a877 496 /* Configure PDx pins in Alternate function mode */
ganlikun 0:13413ea9a877 497 GPIOA->MODER |= 0x00008000;
ganlikun 0:13413ea9a877 498 /* Configure PDx pins speed to 50 MHz */
ganlikun 0:13413ea9a877 499 GPIOA->OSPEEDR |= 0x00008000;
ganlikun 0:13413ea9a877 500 /* Configure PDx pins Output type to push-pull */
ganlikun 0:13413ea9a877 501 GPIOA->OTYPER |= 0x00000000;
ganlikun 0:13413ea9a877 502 /* No pull-up, pull-down for PDx pins */
ganlikun 0:13413ea9a877 503 GPIOA->PUPDR |= 0x00000000;
ganlikun 0:13413ea9a877 504
ganlikun 0:13413ea9a877 505 /* Connect PCx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 506 GPIOC->AFR[0] |= 0x00CC0000;
ganlikun 0:13413ea9a877 507 GPIOC->AFR[1] |= 0x00000000;
ganlikun 0:13413ea9a877 508 /* Configure PDx pins in Alternate function mode */
ganlikun 0:13413ea9a877 509 GPIOC->MODER |= 0x00000A00;
ganlikun 0:13413ea9a877 510 /* Configure PDx pins speed to 50 MHz */
ganlikun 0:13413ea9a877 511 GPIOC->OSPEEDR |= 0x00000A00;
ganlikun 0:13413ea9a877 512 /* Configure PDx pins Output type to push-pull */
ganlikun 0:13413ea9a877 513 GPIOC->OTYPER |= 0x00000000;
ganlikun 0:13413ea9a877 514 /* No pull-up, pull-down for PDx pins */
ganlikun 0:13413ea9a877 515 GPIOC->PUPDR |= 0x00000000;
ganlikun 0:13413ea9a877 516 #endif /* STM32F446xx */
ganlikun 0:13413ea9a877 517
ganlikun 0:13413ea9a877 518 /* Connect PDx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 519 GPIOD->AFR[0] = 0x000000CC;
ganlikun 0:13413ea9a877 520 GPIOD->AFR[1] = 0xCC000CCC;
ganlikun 0:13413ea9a877 521 /* Configure PDx pins in Alternate function mode */
ganlikun 0:13413ea9a877 522 GPIOD->MODER = 0xA02A000A;
ganlikun 0:13413ea9a877 523 /* Configure PDx pins speed to 50 MHz */
ganlikun 0:13413ea9a877 524 GPIOD->OSPEEDR = 0xA02A000A;
ganlikun 0:13413ea9a877 525 /* Configure PDx pins Output type to push-pull */
ganlikun 0:13413ea9a877 526 GPIOD->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 527 /* No pull-up, pull-down for PDx pins */
ganlikun 0:13413ea9a877 528 GPIOD->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 529
ganlikun 0:13413ea9a877 530 /* Connect PEx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 531 GPIOE->AFR[0] = 0xC00000CC;
ganlikun 0:13413ea9a877 532 GPIOE->AFR[1] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 533 /* Configure PEx pins in Alternate function mode */
ganlikun 0:13413ea9a877 534 GPIOE->MODER = 0xAAAA800A;
ganlikun 0:13413ea9a877 535 /* Configure PEx pins speed to 50 MHz */
ganlikun 0:13413ea9a877 536 GPIOE->OSPEEDR = 0xAAAA800A;
ganlikun 0:13413ea9a877 537 /* Configure PEx pins Output type to push-pull */
ganlikun 0:13413ea9a877 538 GPIOE->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 539 /* No pull-up, pull-down for PEx pins */
ganlikun 0:13413ea9a877 540 GPIOE->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 541
ganlikun 0:13413ea9a877 542 /* Connect PFx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 543 GPIOF->AFR[0] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 544 GPIOF->AFR[1] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 545 /* Configure PFx pins in Alternate function mode */
ganlikun 0:13413ea9a877 546 GPIOF->MODER = 0xAA800AAA;
ganlikun 0:13413ea9a877 547 /* Configure PFx pins speed to 50 MHz */
ganlikun 0:13413ea9a877 548 GPIOF->OSPEEDR = 0xAA800AAA;
ganlikun 0:13413ea9a877 549 /* Configure PFx pins Output type to push-pull */
ganlikun 0:13413ea9a877 550 GPIOF->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 551 /* No pull-up, pull-down for PFx pins */
ganlikun 0:13413ea9a877 552 GPIOF->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 553
ganlikun 0:13413ea9a877 554 /* Connect PGx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 555 GPIOG->AFR[0] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 556 GPIOG->AFR[1] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 557 /* Configure PGx pins in Alternate function mode */
ganlikun 0:13413ea9a877 558 GPIOG->MODER = 0xAAAAAAAA;
ganlikun 0:13413ea9a877 559 /* Configure PGx pins speed to 50 MHz */
ganlikun 0:13413ea9a877 560 GPIOG->OSPEEDR = 0xAAAAAAAA;
ganlikun 0:13413ea9a877 561 /* Configure PGx pins Output type to push-pull */
ganlikun 0:13413ea9a877 562 GPIOG->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 563 /* No pull-up, pull-down for PGx pins */
ganlikun 0:13413ea9a877 564 GPIOG->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 565
ganlikun 0:13413ea9a877 566 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
ganlikun 0:13413ea9a877 567 || defined(STM32F469xx) || defined(STM32F479xx)
ganlikun 0:13413ea9a877 568 /* Connect PHx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 569 GPIOH->AFR[0] = 0x00C0CC00;
ganlikun 0:13413ea9a877 570 GPIOH->AFR[1] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 571 /* Configure PHx pins in Alternate function mode */
ganlikun 0:13413ea9a877 572 GPIOH->MODER = 0xAAAA08A0;
ganlikun 0:13413ea9a877 573 /* Configure PHx pins speed to 50 MHz */
ganlikun 0:13413ea9a877 574 GPIOH->OSPEEDR = 0xAAAA08A0;
ganlikun 0:13413ea9a877 575 /* Configure PHx pins Output type to push-pull */
ganlikun 0:13413ea9a877 576 GPIOH->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 577 /* No pull-up, pull-down for PHx pins */
ganlikun 0:13413ea9a877 578 GPIOH->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 579
ganlikun 0:13413ea9a877 580 /* Connect PIx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 581 GPIOI->AFR[0] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 582 GPIOI->AFR[1] = 0x00000CC0;
ganlikun 0:13413ea9a877 583 /* Configure PIx pins in Alternate function mode */
ganlikun 0:13413ea9a877 584 GPIOI->MODER = 0x0028AAAA;
ganlikun 0:13413ea9a877 585 /* Configure PIx pins speed to 50 MHz */
ganlikun 0:13413ea9a877 586 GPIOI->OSPEEDR = 0x0028AAAA;
ganlikun 0:13413ea9a877 587 /* Configure PIx pins Output type to push-pull */
ganlikun 0:13413ea9a877 588 GPIOI->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 589 /* No pull-up, pull-down for PIx pins */
ganlikun 0:13413ea9a877 590 GPIOI->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 591 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
ganlikun 0:13413ea9a877 592
ganlikun 0:13413ea9a877 593 /*-- FMC Configuration -------------------------------------------------------*/
ganlikun 0:13413ea9a877 594 /* Enable the FMC interface clock */
ganlikun 0:13413ea9a877 595 RCC->AHB3ENR |= 0x00000001;
ganlikun 0:13413ea9a877 596 /* Delay after an RCC peripheral clock enabling */
ganlikun 0:13413ea9a877 597 tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
ganlikun 0:13413ea9a877 598
ganlikun 0:13413ea9a877 599 /* Configure and enable SDRAM bank1 */
ganlikun 0:13413ea9a877 600 #if defined(STM32F446xx)
ganlikun 0:13413ea9a877 601 FMC_Bank5_6->SDCR[0] = 0x00001954;
ganlikun 0:13413ea9a877 602 #else
ganlikun 0:13413ea9a877 603 FMC_Bank5_6->SDCR[0] = 0x000019E4;
ganlikun 0:13413ea9a877 604 #endif /* STM32F446xx */
ganlikun 0:13413ea9a877 605 FMC_Bank5_6->SDTR[0] = 0x01115351;
ganlikun 0:13413ea9a877 606
ganlikun 0:13413ea9a877 607 /* SDRAM initialization sequence */
ganlikun 0:13413ea9a877 608 /* Clock enable command */
ganlikun 0:13413ea9a877 609 FMC_Bank5_6->SDCMR = 0x00000011;
ganlikun 0:13413ea9a877 610 tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
ganlikun 0:13413ea9a877 611 while((tmpreg != 0) && (timeout-- > 0))
ganlikun 0:13413ea9a877 612 {
ganlikun 0:13413ea9a877 613 tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
ganlikun 0:13413ea9a877 614 }
ganlikun 0:13413ea9a877 615
ganlikun 0:13413ea9a877 616 /* Delay */
ganlikun 0:13413ea9a877 617 for (index = 0; index<1000; index++);
ganlikun 0:13413ea9a877 618
ganlikun 0:13413ea9a877 619 /* PALL command */
ganlikun 0:13413ea9a877 620 FMC_Bank5_6->SDCMR = 0x00000012;
ganlikun 0:13413ea9a877 621 timeout = 0xFFFF;
ganlikun 0:13413ea9a877 622 while((tmpreg != 0) && (timeout-- > 0))
ganlikun 0:13413ea9a877 623 {
ganlikun 0:13413ea9a877 624 tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
ganlikun 0:13413ea9a877 625 }
ganlikun 0:13413ea9a877 626
ganlikun 0:13413ea9a877 627 /* Auto refresh command */
ganlikun 0:13413ea9a877 628 #if defined(STM32F446xx)
ganlikun 0:13413ea9a877 629 FMC_Bank5_6->SDCMR = 0x000000F3;
ganlikun 0:13413ea9a877 630 #else
ganlikun 0:13413ea9a877 631 FMC_Bank5_6->SDCMR = 0x00000073;
ganlikun 0:13413ea9a877 632 #endif /* STM32F446xx */
ganlikun 0:13413ea9a877 633 timeout = 0xFFFF;
ganlikun 0:13413ea9a877 634 while((tmpreg != 0) && (timeout-- > 0))
ganlikun 0:13413ea9a877 635 {
ganlikun 0:13413ea9a877 636 tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
ganlikun 0:13413ea9a877 637 }
ganlikun 0:13413ea9a877 638
ganlikun 0:13413ea9a877 639 /* MRD register program */
ganlikun 0:13413ea9a877 640 #if defined(STM32F446xx)
ganlikun 0:13413ea9a877 641 FMC_Bank5_6->SDCMR = 0x00044014;
ganlikun 0:13413ea9a877 642 #else
ganlikun 0:13413ea9a877 643 FMC_Bank5_6->SDCMR = 0x00046014;
ganlikun 0:13413ea9a877 644 #endif /* STM32F446xx */
ganlikun 0:13413ea9a877 645 timeout = 0xFFFF;
ganlikun 0:13413ea9a877 646 while((tmpreg != 0) && (timeout-- > 0))
ganlikun 0:13413ea9a877 647 {
ganlikun 0:13413ea9a877 648 tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
ganlikun 0:13413ea9a877 649 }
ganlikun 0:13413ea9a877 650
ganlikun 0:13413ea9a877 651 /* Set refresh count */
ganlikun 0:13413ea9a877 652 tmpreg = FMC_Bank5_6->SDRTR;
ganlikun 0:13413ea9a877 653 #if defined(STM32F446xx)
ganlikun 0:13413ea9a877 654 FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1));
ganlikun 0:13413ea9a877 655 #else
ganlikun 0:13413ea9a877 656 FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1));
ganlikun 0:13413ea9a877 657 #endif /* STM32F446xx */
ganlikun 0:13413ea9a877 658
ganlikun 0:13413ea9a877 659 /* Disable write protection */
ganlikun 0:13413ea9a877 660 tmpreg = FMC_Bank5_6->SDCR[0];
ganlikun 0:13413ea9a877 661 FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF);
ganlikun 0:13413ea9a877 662 #endif /* DATA_IN_ExtSDRAM */
ganlikun 0:13413ea9a877 663 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */
ganlikun 0:13413ea9a877 664
ganlikun 0:13413ea9a877 665 #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\
ganlikun 0:13413ea9a877 666 || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
ganlikun 0:13413ea9a877 667 || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx)
ganlikun 0:13413ea9a877 668
ganlikun 0:13413ea9a877 669 #if defined(DATA_IN_ExtSRAM)
ganlikun 0:13413ea9a877 670 /*-- GPIOs Configuration -----------------------------------------------------*/
ganlikun 0:13413ea9a877 671 /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */
ganlikun 0:13413ea9a877 672 RCC->AHB1ENR |= 0x00000078;
ganlikun 0:13413ea9a877 673 /* Delay after an RCC peripheral clock enabling */
ganlikun 0:13413ea9a877 674 tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);
ganlikun 0:13413ea9a877 675
ganlikun 0:13413ea9a877 676 /* Connect PDx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 677 GPIOD->AFR[0] = 0x00CCC0CC;
ganlikun 0:13413ea9a877 678 GPIOD->AFR[1] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 679 /* Configure PDx pins in Alternate function mode */
ganlikun 0:13413ea9a877 680 GPIOD->MODER = 0xAAAA0A8A;
ganlikun 0:13413ea9a877 681 /* Configure PDx pins speed to 100 MHz */
ganlikun 0:13413ea9a877 682 GPIOD->OSPEEDR = 0xFFFF0FCF;
ganlikun 0:13413ea9a877 683 /* Configure PDx pins Output type to push-pull */
ganlikun 0:13413ea9a877 684 GPIOD->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 685 /* No pull-up, pull-down for PDx pins */
ganlikun 0:13413ea9a877 686 GPIOD->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 687
ganlikun 0:13413ea9a877 688 /* Connect PEx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 689 GPIOE->AFR[0] = 0xC00CC0CC;
ganlikun 0:13413ea9a877 690 GPIOE->AFR[1] = 0xCCCCCCCC;
ganlikun 0:13413ea9a877 691 /* Configure PEx pins in Alternate function mode */
ganlikun 0:13413ea9a877 692 GPIOE->MODER = 0xAAAA828A;
ganlikun 0:13413ea9a877 693 /* Configure PEx pins speed to 100 MHz */
ganlikun 0:13413ea9a877 694 GPIOE->OSPEEDR = 0xFFFFC3CF;
ganlikun 0:13413ea9a877 695 /* Configure PEx pins Output type to push-pull */
ganlikun 0:13413ea9a877 696 GPIOE->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 697 /* No pull-up, pull-down for PEx pins */
ganlikun 0:13413ea9a877 698 GPIOE->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 699
ganlikun 0:13413ea9a877 700 /* Connect PFx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 701 GPIOF->AFR[0] = 0x00CCCCCC;
ganlikun 0:13413ea9a877 702 GPIOF->AFR[1] = 0xCCCC0000;
ganlikun 0:13413ea9a877 703 /* Configure PFx pins in Alternate function mode */
ganlikun 0:13413ea9a877 704 GPIOF->MODER = 0xAA000AAA;
ganlikun 0:13413ea9a877 705 /* Configure PFx pins speed to 100 MHz */
ganlikun 0:13413ea9a877 706 GPIOF->OSPEEDR = 0xFF000FFF;
ganlikun 0:13413ea9a877 707 /* Configure PFx pins Output type to push-pull */
ganlikun 0:13413ea9a877 708 GPIOF->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 709 /* No pull-up, pull-down for PFx pins */
ganlikun 0:13413ea9a877 710 GPIOF->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 711
ganlikun 0:13413ea9a877 712 /* Connect PGx pins to FMC Alternate function */
ganlikun 0:13413ea9a877 713 GPIOG->AFR[0] = 0x00CCCCCC;
ganlikun 0:13413ea9a877 714 GPIOG->AFR[1] = 0x000000C0;
ganlikun 0:13413ea9a877 715 /* Configure PGx pins in Alternate function mode */
ganlikun 0:13413ea9a877 716 GPIOG->MODER = 0x00085AAA;
ganlikun 0:13413ea9a877 717 /* Configure PGx pins speed to 100 MHz */
ganlikun 0:13413ea9a877 718 GPIOG->OSPEEDR = 0x000CAFFF;
ganlikun 0:13413ea9a877 719 /* Configure PGx pins Output type to push-pull */
ganlikun 0:13413ea9a877 720 GPIOG->OTYPER = 0x00000000;
ganlikun 0:13413ea9a877 721 /* No pull-up, pull-down for PGx pins */
ganlikun 0:13413ea9a877 722 GPIOG->PUPDR = 0x00000000;
ganlikun 0:13413ea9a877 723
ganlikun 0:13413ea9a877 724 /*-- FMC/FSMC Configuration --------------------------------------------------*/
ganlikun 0:13413ea9a877 725 /* Enable the FMC/FSMC interface clock */
ganlikun 0:13413ea9a877 726 RCC->AHB3ENR |= 0x00000001;
ganlikun 0:13413ea9a877 727
ganlikun 0:13413ea9a877 728 #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
ganlikun 0:13413ea9a877 729 /* Delay after an RCC peripheral clock enabling */
ganlikun 0:13413ea9a877 730 tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
ganlikun 0:13413ea9a877 731 /* Configure and enable Bank1_SRAM2 */
ganlikun 0:13413ea9a877 732 FMC_Bank1->BTCR[2] = 0x00001011;
ganlikun 0:13413ea9a877 733 FMC_Bank1->BTCR[3] = 0x00000201;
ganlikun 0:13413ea9a877 734 FMC_Bank1E->BWTR[2] = 0x0fffffff;
ganlikun 0:13413ea9a877 735 #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
ganlikun 0:13413ea9a877 736 #if defined(STM32F469xx) || defined(STM32F479xx)
ganlikun 0:13413ea9a877 737 /* Delay after an RCC peripheral clock enabling */
ganlikun 0:13413ea9a877 738 tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
ganlikun 0:13413ea9a877 739 /* Configure and enable Bank1_SRAM2 */
ganlikun 0:13413ea9a877 740 FMC_Bank1->BTCR[2] = 0x00001091;
ganlikun 0:13413ea9a877 741 FMC_Bank1->BTCR[3] = 0x00110212;
ganlikun 0:13413ea9a877 742 FMC_Bank1E->BWTR[2] = 0x0fffffff;
ganlikun 0:13413ea9a877 743 #endif /* STM32F469xx || STM32F479xx */
ganlikun 0:13413ea9a877 744 #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\
ganlikun 0:13413ea9a877 745 || defined(STM32F412Zx) || defined(STM32F412Vx)
ganlikun 0:13413ea9a877 746 /* Delay after an RCC peripheral clock enabling */
ganlikun 0:13413ea9a877 747 tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);
ganlikun 0:13413ea9a877 748 /* Configure and enable Bank1_SRAM2 */
ganlikun 0:13413ea9a877 749 FSMC_Bank1->BTCR[2] = 0x00001011;
ganlikun 0:13413ea9a877 750 FSMC_Bank1->BTCR[3] = 0x00000201;
ganlikun 0:13413ea9a877 751 FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF;
ganlikun 0:13413ea9a877 752 #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */
ganlikun 0:13413ea9a877 753
ganlikun 0:13413ea9a877 754 #endif /* DATA_IN_ExtSRAM */
ganlikun 0:13413ea9a877 755 #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\
ganlikun 0:13413ea9a877 756 STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */
ganlikun 0:13413ea9a877 757 (void)(tmp);
ganlikun 0:13413ea9a877 758 }
ganlikun 0:13413ea9a877 759 #endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */
ganlikun 0:13413ea9a877 760 /**
ganlikun 0:13413ea9a877 761 * @}
ganlikun 0:13413ea9a877 762 */
ganlikun 0:13413ea9a877 763
ganlikun 0:13413ea9a877 764 /**
ganlikun 0:13413ea9a877 765 * @}
ganlikun 0:13413ea9a877 766 */
ganlikun 0:13413ea9a877 767
ganlikun 0:13413ea9a877 768 /**
ganlikun 0:13413ea9a877 769 * @}
ganlikun 0:13413ea9a877 770 */
ganlikun 0:13413ea9a877 771 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
ganlikun 0:13413ea9a877 772