- 硬件:神舟王STM32F439开发板,3.2寸320*240LCD液晶芯片ID8989.
- 接口为 16位数据,指令、数据切换A0。对于初始化如下:
void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_FMC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
GPIO_InitStruct.Pin = 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_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4
|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
}
- FMC配置如下,初始化需要慢速写入指令读取读取ID号:
GPIO_InitTypeDef GPIO_Initure;
FMC_NORSRAM_TimingTypeDef FMC_ReadWriteTim;
FMC_NORSRAM_TimingTypeDef FMC_WriteTim;
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_7;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Pull=GPIO_PULLDOWN;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
SRAM_Handler.Instance=FMC_NORSRAM_DEVICE;
SRAM_Handler.Extended=FMC_NORSRAM_EXTENDED_DEVICE;
SRAM_Handler.Init.NSBank=FMC_NORSRAM_BANK4;
SRAM_Handler.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE;
SRAM_Handler.Init.MemoryType=FMC_MEMORY_TYPE_SRAM;
SRAM_Handler.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_16;
SRAM_Handler.Init.BurstAccessMode=FMC_BURST_ACCESS_MODE_DISABLE;
SRAM_Handler.Init.WaitSignalPolarity=FMC_WAIT_SIGNAL_POLARITY_LOW;
SRAM_Handler.Init.WaitSignalActive=FMC_WAIT_TIMING_BEFORE_WS;
SRAM_Handler.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE;
SRAM_Handler.Init.WaitSignal=FMC_WAIT_SIGNAL_DISABLE;
SRAM_Handler.Init.ExtendedMode=FMC_EXTENDED_MODE_ENABLE;
SRAM_Handler.Init.AsynchronousWait=FMC_ASYNCHRONOUS_WAIT_DISABLE;
SRAM_Handler.Init.WriteBurst=FMC_WRITE_BURST_DISABLE;
SRAM_Handler.Init.ContinuousClock=FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
FMC_ReadWriteTim.AddressSetupTime=0xFF;
FMC_ReadWriteTim.AddressHoldTime=0xFF;
FMC_ReadWriteTim.DataSetupTime=0xFF;
FMC_ReadWriteTim.CLKDivision = 0;
FMC_ReadWriteTim.DataLatency = 0;
FMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A;
FMC_WriteTim.AddressSetupTime=0xFF;
FMC_WriteTim.AddressHoldTime=0xFF;
FMC_WriteTim.DataSetupTime=0xFF;
FMC_WriteTim.CLKDivision = 0x0;
FMC_WriteTim.DataLatency = 0x0;
FMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A;
HAL_SRAM_Init(&SRAM_Handler,&FMC_ReadWriteTim,&FMC_WriteTim);
- 完成配置后重新写入时序控制寄存器数据:
FMC_ReadWriteTim.AddressSetupTime=0x09;
FMC_ReadWriteTim.AddressHoldTime=0x0;
FMC_ReadWriteTim.DataSetupTime=0x08;
FMC_ReadWriteTim.CLKDivision = 0;
FMC_ReadWriteTim.DataLatency = 0;
FMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A;
FMC_WriteTim.AddressSetupTime=0x09;
FMC_WriteTim.AddressHoldTime=0x00;
FMC_WriteTim.DataSetupTime=0x08;
FMC_WriteTim.CLKDivision = 0x0;
FMC_WriteTim.DataLatency = 0x0;
FMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A;
FMC_NORSRAM_Timing_Init(SRAM_Handler.Instance, &FMC_ReadWriteTim, SRAM_Handler.Init.NSBank);
FMC_NORSRAM_Extended_Timing_Init(SRAM_Handler.Extended, &FMC_WriteTim, SRAM_Handler.Init.NSBank, SRAM_Handler.Init.ExtendedMode);
- 完成。
重点:读取ID需要慢速,负责读取为空。