一、FSMC介绍
外部存储器控制器(FSMC)是一个嵌入式微控制器的外设,它能够与不同类型的存储器连接,比如SRAM,NOR Flash,NAND Flash,SDRAM等等。FSMC接口提供了微控制器与存储器之间的高速数据传输手段,实现了存储器的读写和访问。FSMC是STM32系列微控制器的一个重要外设,特别在大容量存储器的应用场合中发挥着重要作用。
二、FSMC接口工作原理
FSMC接口采用总线结构,分为地址总线、数据总线和控制总线。总共使用22个引脚,包括16个地址线、16个数据线、3个控制线和3个后备线(用于扩展和故障排除)。
在读取存储器数据时,FSMC根据所指定的地址发出请求信号,存储器捕获请求信号后,生成响应,并将数据放到数据总线上传输给FSMC。FSMC接口根据响应信号获取并存储数据,从而实现了数据的读取。
在写入存储器数据时,FSMC会将要写入的数据发送到数据总线上,同时发出写入信号。存储器接受到写入信号后,向数据总线写入数据,完成数据的存储。
三、FSMC接口的应用
1、SRAM应用:在使用SRAM时,FSMC接口需要进行初始化配置,设置地址线、数据线与SRAM的对应关系,以及对读写以及时序等参数的设置。下面是SRAM的初始化代码示例:
FSMC_NORSRAM_TimingTypeDef Timing = {0}; Timing.AddressSetupTime = 1; Timing.AddressHoldTime = 0; Timing.DataSetupTime = 5; Timing.BusTurnAroundDuration = 0; Timing.CLKDivision = 2; Timing.DataLatency = 0; Timing.AccessMode = FSMC_ACCESS_MODE_A; FSMC_NORSRAM_InitTypeDef SRAM_InitStruct = {0}; SRAM_InitStruct.NSBank = FSMC_NORSRAM_BANK1; SRAM_InitStruct.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; SRAM_InitStruct.MemoryType = FSMC_MEMORY_TYPE_SRAM; SRAM_InitStruct.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16; SRAM_InitStruct.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE; SRAM_InitStruct.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW; SRAM_InitStruct.WrapMode = FSMC_WRAP_MODE_DISABLE; SRAM_InitStruct.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS; SRAM_InitStruct.WriteOperation = FSMC_WRITE_OPERATION_ENABLE; SRAM_InitStruct.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE; SRAM_InitStruct.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE; SRAM_InitStruct.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE; SRAM_InitStruct.WriteBurst = FSMC_WRITE_BURST_DISABLE; SRAM_InitStruct.PageSize = FSMC_PAGE_SIZE_NONE; SRAM_InitStruct.TimingStruct = &Timing; FSMC_NORSRAM_Init(FSMC_NORSRAM_DEVICE, &SRAM_InitStruct); FSMC_NORSRAM_Enable(FSMC_NORSRAM_DEVICE);
2、NAND Flash应用:在使用NAND Flash时,需要对FSMC进行各种时序参数的设置,以确保数据能够被正确地读写,在读写NAND Flash时,还应该考虑到NAND Flash操作的特殊性质,比如页写操作和擦除操作等。下面是NAND Flash的初始化代码示例:
FSMC_NAND_PCCARD_TimingTypeDef Timing = {0}; Timing.SetupTime = 0x01; Timing.WaitSetupTime = 0x03; Timing.HoldSetupTime = 0x02; Timing.HiZSetupTime = 0x01; FSMC_NAND_InitTypeDef NAND_InitStruct = {0}; NAND_InitStruct.NAND_Bank = FSMC_NAND_BANK2; NAND_InitStruct.Waitfeature = FSMC_NAND_PCC_WAIT_FEATURE_ENABLE; NAND_InitStruct.MemoryDataWidth = FSMC_NAND_PCC_MEM_BUS_WIDTH_8; NAND_InitStruct.ECC = FSMC_NAND_ECC_ENABLE; NAND_InitStruct.ECCPage_Size = FSMC_NAND_ECC_PAGE_SIZE_2048BYTE; NAND_InitStruct.TCLRSetupTime = 0x00; NAND_InitStruct.TARSetupTime = 0x00; NAND_InitStruct.CommonSpace_TimingStruct = &Timing; NAND_InitStruct.AttributeSpace_TimingStruct = &Timing; FSMC_NAND_Init(FSMC_NAND_DEVICE, &NAND_InitStruct); FSMC_NAND_ReadID(FSMC_NAND_DEVICE, &NAND_ID);
四、FSMC接口的优势和不足
1、优势:FSMC连接各种存储器的灵活性很高,可用于各种存储器应用场合,简化了程序的开发。FSMC能够对外部存储器进行高速读写,从而满足应用对数据处理速度的要求。
2、不足:FSMC接口与存储器的时序关系很复杂,需要根据不同应用场合进行细致、精确的时序参数设置,同时,使用FSMC接口也需要消耗一定的CPU时间和资源,从而影响微控制器的性能。
五、总结
FSMC接口是STM32系列微控制器的一个重要外设,它能够与各种存储器进行高速数据传输,满足应用对数据处理速度的要求。在使用FSMC接口时,需要根据不同的存储器类型和应用场合进行各种时序参数的设置,并对存储器进行初始化配置,从而实现外部存储器与微控制器之间的高速数据传输。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/295118.html