介绍
- FSMC分四个块,适合不同的接口。
- 其中块一内部又分为四个存储块,通过HADDR[27:26]位用于选择四个存储块之一
HADDR[27:26] | 选择的存储块 |
---|---|
00 存储块1 | NOR/PSRAM 1 |
01 存储块1 | NOR/PSRAM 2 |
10 存储块1 | NOR/PSRAM 3 |
11 存储块1 | NOR/PSRAM 4 |
- HADDR内部地址线和外部地址引脚的对应关系
数据宽度 | 连到存储器的地址线 | 最大访问存储器空间(位) |
---|---|---|
8位 | HADDR[25:0]与FSMC_A[25:0]对应相连 | 64M字节 x 8 = 512 M位 |
16位 | HADDR[25:1]与FSMC_A[24:0]对应相连, | HADDR[0]未接 64M字节/2 x 16 = 512 M位 |
在使用16宽度时需注意内部地址线与外部地址线的对应关系
FSMC的配置
/**
* @brief LCD FSMC 模式配置
* @param 无
* @retval 无
*/
void LCD_FSMC_Config(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
//时间的设置需要根据外部设备来设置
p.FSMC_AddressSetupTime = 0x02; //地址建立时间
p.FSMC_AddressHoldTime = 0x00; //地址保持时间
p.FSMC_DataSetupTime = 0x05; //数据建立时间
p.FSMC_BusTurnAroundDuration = 0x00;
p.FSMC_CLKDivision = 0x00;
p.FSMC_DataLatency = 0x00;
p.FSMC_AccessMode = FSMC_AccessMode_B; // 一般使用模式B来控制LCD
//模式A与模式B的区别是什么?主要是读时序的时候A模式OE引脚会有翻转的动作
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//选择块
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
//FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;//内存类型
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;//内存类型 因为选择了模式B,所以内存类型选择NOR
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//数据宽度
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;//连续读写功能
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* 使能 FSMC Bank1_SRAM Bank */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
}