一、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/zh-tw/n/295118.html