/** * @brief Configures the FMC and GPIOs to interface with the NOR flash memory. * This function must be called before any read/write operation * on the NOR flash. * @param None * @retval None */ void NOR_Init(void) { FMC_NORSRAMInitTypeDef FMC_NORSRAMInitStructure; FMC_NORSRAMTimingInitTypeDef FMC_NORSRAMTimingStructure; /* GPIO configuration for FMC NOR bank */ NOR_GPIOConfig(); /* Enable FMC Clock */ RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE); /* FMC Configuration ---------------------------------------------------------*/ /* NOR memory timing configuration */ FMC_NORSRAMTimingStructure.FMC_AddressSetupTime = 4; FMC_NORSRAMTimingStructure.FMC_AddressHoldTime = 3; FMC_NORSRAMTimingStructure.FMC_DataSetupTime = 7; FMC_NORSRAMTimingStructure.FMC_BusTurnAroundDuration = 1; FMC_NORSRAMTimingStructure.FMC_CLKDivision = 1; FMC_NORSRAMTimingStructure.FMC_DataLatency = 0; FMC_NORSRAMTimingStructure.FMC_AccessMode = FMC_AccessMode_A; /* NOR memory control configuration */ FMC_NORSRAMInitStructure.FMC_Bank = FMC_Bank1_NORSRAM1; FMC_NORSRAMInitStructure.FMC_DataAddressMux = FMC_DataAddressMux_Disable; FMC_NORSRAMInitStructure.FMC_MemoryType = FMC_MemoryType_NOR; FMC_NORSRAMInitStructure.FMC_MemoryDataWidth = FMC_NORSRAM_MemoryDataWidth_16b; FMC_NORSRAMInitStructure.FMC_BurstAccessMode = NOR_BURSTACCESS; FMC_NORSRAMInitStructure.FMC_WaitSignalPolarity = FMC_WaitSignalPolarity_Low; FMC_NORSRAMInitStructure.FMC_WrapMode = FMC_WrapMode_Disable; FMC_NORSRAMInitStructure.FMC_WaitSignalActive = FMC_WaitSignalActive_BeforeWaitState; FMC_NORSRAMInitStructure.FMC_WriteOperation = FMC_WriteOperation_Enable; FMC_NORSRAMInitStructure.FMC_WaitSignal = FMC_WaitSignal_Disable; FMC_NORSRAMInitStructure.FMC_ExtendedMode = FMC_ExtendedMode_Disable; FMC_NORSRAMInitStructure.FMC_AsynchronousWait = FMC_AsynchronousWait_Disable; FMC_NORSRAMInitStructure.FMC_WriteBurst = NOR_WRITEBURST; FMC_NORSRAMInitStructure.FMC_ContinousClock = CONTINUOUSCLOCK_FEATURE; FMC_NORSRAMInitStructure.FMC_ReadWriteTimingStruct = &FMC_NORSRAMTimingStructure; FMC_NORSRAMInitStructure.FMC_WriteTimingStruct = &FMC_NORSRAMTimingStructure; /* FMC NOR memory de-initializtion */ FMC_NORSRAMDeInit(FMC_Bank1_NORSRAM1); /* FMC NOR bank initialization */ FMC_NORSRAMInit(&FMC_NORSRAMInitStructure); /* Enable the NOR memory bank */ FMC_NORSRAMCmd(FMC_Bank1_NORSRAM1, ENABLE); }
/** * @brief Configures the FMC and GPIOs to interface with the SRAM memory. * This function must be called before any write/read operation * on the SRAM. * @param None * @retval None */ void SRAM_Init(void) { FMC_NORSRAMInitTypeDef FMC_NORSRAMInitStructure; FMC_NORSRAMTimingInitTypeDef NORSRAMTimingStructure; /* GPIO configuration for FMC SRAM bank */ SRAM_GPIOConfig(); /* Enable FMC clock */ RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE); /* FMC Configuration ---------------------------------------------------------*/ /* SRAM Timing configuration */ NORSRAMTimingStructure.FMC_AddressSetupTime = 2; NORSRAMTimingStructure.FMC_AddressHoldTime = 1; NORSRAMTimingStructure.FMC_DataSetupTime = 2; NORSRAMTimingStructure.FMC_BusTurnAroundDuration = 1; NORSRAMTimingStructure.FMC_CLKDivision = 1; NORSRAMTimingStructure.FMC_DataLatency = 0; NORSRAMTimingStructure.FMC_AccessMode = FMC_AccessMode_A; /* FMC SRAM control configuration */ FMC_NORSRAMInitStructure.FMC_Bank = FMC_Bank1_NORSRAM2; FMC_NORSRAMInitStructure.FMC_DataAddressMux = FMC_DataAddressMux_Disable; FMC_NORSRAMInitStructure.FMC_MemoryType = FMC_MemoryType_SRAM; FMC_NORSRAMInitStructure.FMC_MemoryDataWidth = SRAM_MEMORY_WIDTH; FMC_NORSRAMInitStructure.FMC_BurstAccessMode = SRAM_BURSTACCESS; FMC_NORSRAMInitStructure.FMC_AsynchronousWait = FMC_AsynchronousWait_Disable; FMC_NORSRAMInitStructure.FMC_WaitSignalPolarity = FMC_WaitSignalPolarity_Low; FMC_NORSRAMInitStructure.FMC_WrapMode = FMC_WrapMode_Disable; FMC_NORSRAMInitStructure.FMC_WaitSignalActive = FMC_WaitSignalActive_BeforeWaitState; FMC_NORSRAMInitStructure.FMC_WriteOperation = FMC_WriteOperation_Enable; FMC_NORSRAMInitStructure.FMC_WaitSignal = FMC_WaitSignal_Disable; FMC_NORSRAMInitStructure.FMC_ExtendedMode = FMC_ExtendedMode_Disable; FMC_NORSRAMInitStructure.FMC_WriteBurst = SRAM_WRITEBURST; FMC_NORSRAMInitStructure.FMC_ContinousClock = CONTINUOUSCLOCK_FEATURE; FMC_NORSRAMInitStructure.FMC_ReadWriteTimingStruct = &NORSRAMTimingStructure; FMC_NORSRAMInitStructure.FMC_WriteTimingStruct = &NORSRAMTimingStructure; /* SRAM configuration */ FMC_NORSRAMInit(&FMC_NORSRAMInitStructure); /* Enable FMC Bank1_SRAM2 Bank */ FMC_NORSRAMCmd(FMC_Bank1_NORSRAM2, ENABLE); }
/* ********************************************************************************************************* * 函 数 名: bsp_InitNorFlash * 功能说明: 配置连接外部NOR Flash的GPIO和FSMC * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_InitNorFlash(void) { FMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FMC_NORSRAMTimingInitTypeDef p; GPIO_InitTypeDef GPIO_InitStructure; /* 使能GPIO时钟 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE); /* 使能 FSMC 时钟 */ RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE); /* NOR Flash 的 GPIO : PD0/FSMC_D2 PD1/FSMC_D3 PD4/FSMC_NOE PD5/FSMC_NWE PD6/FSMC_NWAIT - 忙信号,配置为GPIO,输入模式,通过软件查询方式判忙 PD8/FSMC_D13 PD9/FSMC_D14 PD10/FSMC_D15 PD11/FSMC_CLE/FSMC_A16 PD12/FSMC_ALE/FSMC_A17 PD13/FSMC_A18 PD14/FSMC_D0 PD15/FSMC_D1 PE3/FSMC_A19 PE4/FSMC_A20 PE5/FSMC_A21 PE6/FSMC_A22 PE7/FSMC_D4 PE8/FSMC_D5 PE9/FSMC_D6 PE10/FSMC_D7 PE11/FSMC_D8 PE12/FSMC_D9 PE13/FSMC_D10 PE14/FSMC_D11 PE15/FSMC_D12 PF0/FSMC_A0 PF1/FSMC_A1 PF2/FSMC_A2 PF3/FSMC_A3 PF4/FSMC_A4 PF5/FSMC_A5 PF12/FSMC_A6 PF13/FSMC_A7 PF14/FSMC_A8 PF15/FSMC_A9 PG0/FSMC_A10 PG1/FSMC_A11 PG2/FSMC_A12 PG3/FSMC_A13 PG4/FSMC_A14 PG5/FSMC_A15 PG9/FSMC_NE2 - 片选信号 */ /* GPIOD configuration */ GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_FMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FMC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FMC); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); /* GPIOE configuration */ GPIO_PinAFConfig(GPIOE, GPIO_PinSource3 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource4 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource5 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource6 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FMC); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOE, &GPIO_InitStructure); /* GPIOF configuration */ GPIO_PinAFConfig(GPIOF, GPIO_PinSource0 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOF, GPIO_PinSource1 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOF, GPIO_PinSource2 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOF, GPIO_PinSource3 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOF, GPIO_PinSource4 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOF, GPIO_PinSource5 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOF, GPIO_PinSource12 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOF, GPIO_PinSource13 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOF, GPIO_PinSource14 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOF, GPIO_PinSource15 , GPIO_AF_FMC); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOF, &GPIO_InitStructure); /* GPIOG configuration */ GPIO_PinAFConfig(GPIOG, GPIO_PinSource0 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOG, GPIO_PinSource1 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOG, GPIO_PinSource2 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOG, GPIO_PinSource3 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOG, GPIO_PinSource4 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOG, GPIO_PinSource5 , GPIO_AF_FMC); GPIO_PinAFConfig(GPIOG, GPIO_PinSource9 , GPIO_AF_FMC); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_9; GPIO_Init(GPIOG, &GPIO_InitStructure); /* PD6 作为忙信号, 配置为GPIO输入模式,软件查询 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; /* 输入模式 */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); /*-- FSMC Configuration ------------------------------------------------------*/ p.FMC_AddressSetupTime = 0x07; /* 0x05正常, 0x04 出错 2014-12-06 由6修改为 7 */ p.FMC_AddressHoldTime = 0x01; p.FMC_DataSetupTime = 0x0D; /* 0x0B正常, 0x0A 出错 2014-12-06 由C修改为 D*/ p.FMC_BusTurnAroundDuration = 0x00; p.FMC_CLKDivision = 0x00; p.FMC_DataLatency = 0x00; p.FMC_AccessMode = FMC_AccessMode_B; FSMC_NORSRAMInitStructure.FMC_Bank = FMC_Bank1_NORSRAM2; FSMC_NORSRAMInitStructure.FMC_DataAddressMux = FMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FMC_MemoryType = FMC_MemoryType_NOR; FSMC_NORSRAMInitStructure.FMC_MemoryDataWidth = FMC_NORSRAM_MemoryDataWidth_16b; FSMC_NORSRAMInitStructure.FMC_BurstAccessMode = FMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FMC_AsynchronousWait = FMC_AsynchronousWait_Disable; FSMC_NORSRAMInitStructure.FMC_WaitSignalPolarity = FMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStructure.FMC_WrapMode = FMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FMC_WaitSignalActive = FMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FMC_WriteOperation = FMC_WriteOperation_Enable; FSMC_NORSRAMInitStructure.FMC_WaitSignal = FMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FMC_ExtendedMode = FMC_ExtendedMode_Disable; FSMC_NORSRAMInitStructure.FMC_WriteBurst = FMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FMC_ReadWriteTimingStruct = &p; FSMC_NORSRAMInitStructure.FMC_WriteTimingStruct = &p; FMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); /*!< Enable FSMC Bank1_SRAM2 Bank */ FMC_NORSRAMCmd(FMC_Bank1_NORSRAM2, ENABLE); }