Flexible static memory controller(FSMC)靈活的靜態存儲控制器。FSMC能夠鏈接異步或同步存儲器或16位PC存儲卡,主要用途有:編程
將 AHB 數據通訊事務轉換爲適當的外部器件協議app
知足外部器件的訪問時序要求異步
全部外部存儲器共享地址、數據和控制信號,但有各自的片選信號。FSMC 一次只能訪問一個外部器件。spa
FSMC,即靈活的靜態存儲控制器,可以與同步或異步存儲器和16位PC存儲器卡鏈接,STM32的FSMC接口支持包括SRAM、NANDFLASH、NORFLASH和PSRAM等存儲器。指針
△FSMC框圖示意code
AHB設備接口可使內部CPU和其餘主總線外設去訪問外部存儲器。AHB事務能夠傳輸外部設備協議。特別是當外部存儲器被選擇位8位或16位,32位的AHB傳輸傳輸事務會被劃分爲多個連續的8位或16的傳輸事務。片選會在每次訪問時切換。blog
通用事務規則要求AHB傳輸數據寬度必須是8位、16位或32位。可是訪問外部數據必須有個固定的數據寬度。這可能致使不同的傳輸。教程
所以必須遵循一些簡單的事務規則:接口
AHB事務數據寬度必須和存儲器數據寬度相同。在這種狀況下不會出問題;事務
AHB事務數據寬度大於存儲器數據寬度,在這種狀況下,FSMC會將AHB事務分爲多個連續的存儲器訪問,這樣符合外部存儲器訪問數據寬度;
AHB事務數據小存儲器寬度,在這種狀況下,異步傳輸可能一致,也可能不一致,這取決於外部設備的類型。
對設備的異步訪問要具備字節選擇功能(SRAM,ROM,PSRAM),①FSMC 容許寫入事務經過其字節選擇通道 NBL[1:0] 訪問恰當的數據,②容許讀取事務。會讀取全部存儲器字節,並將丟棄無用的存儲器字節。 NBL[1:0]在讀取事務期間保持爲低電平。
對不具備字節選擇功能的器件( 16 位 NOR 和 NAND Flash)進行異步訪問,當請求對 16 位寬的 Flash 存儲器進行字節訪問時會發生此情形。
顯然,不能在字節模式下訪問此器件(只能針對 Flash 存儲器讀取或寫入 16 位字),所以①不容許寫入事務,②容許讀取事務。會讀取全部存儲器字節,並將丟棄無用的存儲器字節。 NBL[1:0]在讀取事務期間保持低電平。
FSMC的外部設備地址映像,STM32的FSMC將外部存儲器劃分爲固定大小爲256M字節的四個存儲塊:
塊1被用於4個NORflash或者PSRAM內存設備。塊1被劃分爲4塊NORflash/PSRAM帶有獨立的片選信號。
塊2和塊3用於鏈接NANDflash(一個塊驅動一個設備)
塊4用於鏈接PC塊設備
對於每一個存儲區域,所要使用的存儲器類型由用戶在配置寄存器中定義
NOR/PSRAM地址映射
Bank1的256M字節空間由28根地址線(HADDR[27:0])尋址。這裏HADDR,是內部AHB地址總線,但也會參與對外部存儲器的尋址,其中,HADDR[25:0]來自外部存儲器地址FSMC_A[25:0],而HADDR[26:27]對4個區進行尋址。以下表所示:
HADDR[25:0] 包含外部存儲器地址。因爲HADDR爲字節地址,而存儲器按字尋址,因此根據存儲器數據寬度不一樣,實際向存儲器發送的地址也將有所不一樣,以下表所示:
當Bank1接的是16位寬度存儲器的時候:HADDR[25:1]->FSMC_A[24:0];
當Bank1接的是8位寬度存儲器的時候:HADDR[25:0]->FSMC_A[25:0];
不論外部接8位/16位寬設備,FSMC_A[0]永遠接在外部設備地址A[0]。
FSMC 會生成適當的信號時序,以驅動如下類型的存儲器
異步 SRAM 和 ROM,8位、16位或者32位
PSRAM,異步模式,突發模式,複用或非複用
NOR Flash,異步模式或突發模式,複用或非複用
FSMC每一個塊輸出獨立的片選信號NE[4:1]。其餘信號(讀,數據和控制)是共享的;
對於同步訪問,FSMC僅僅在讀寫事務時給選擇的外部設備發出時鐘。HCLK時鐘頻率是該時鐘的整數倍。每一個塊的大小固定64M字節。
存儲器的可編程參數包括訪問時序(詳見下圖)和對等待管理的支持(用於在突發模式下訪問NOR Flash 和PSRAM)。
NOR/PSRAM 的可編程訪問參數
非複用 I/OPSRAM/SRAM
注意:前綴「N」表示相關的信號爲低電平有效
異步靜態存儲器(NOR Flash、PSRAM、SRAM)
信號經過內部時鐘 HCLK 進行同步,不會將此時鐘發送到存儲器;
FSMC 老是會先對數據進行採樣,然後再禁止片選信號 NE。這樣能夠確保符合存儲器數據保持時序的要求(數據轉換的芯片使能高電平,一般最低爲 0 ns。);
若是使能擴展模式(FSMC_BCRx 寄存器中的 EXTMOD 位置 1),則最多可提供四種擴展模式( A、 B、 C 和 D)。能夠混合使用 A、 B、 C 和 D 模式來進行讀取和寫入操做。例如,能夠在模式 A 下執行讀取操做,而在模式 B 下執行寫入操做;
若是禁用擴展模式(FSMC_BCRx 寄存器中的 EXTMOD 位復位),則 FSMC 能夠在模式 1 或模式 2 下運行,以下所述①當選擇 SRAM/CRAM 存儲器類型時,模式 1 爲默認模式( FSMC_BCRx 寄存器中MTYP = 0x0 或 0x01)②當選擇 NOR 存儲器類型時,模式 2 爲默認模式( FSMC_BCRx 寄存器中 MTYP =0x10)
對於這5種模式,總結以下:
模式1/A:SRAM/PSRAM(CRAM)OE翻轉,模式A與模式1的區別是NOE的變化和相互獨立的讀寫時序。
模式2/B:NOR閃存,模式2/B與模式1相比較,不一樣的是NADV的變化,且在擴展模式下(模式B)讀寫時序相互獨立。(只有當設置了擴展模式時(模式B),FSMC_BWTRx纔有效,不然該寄存器的內容不起做用。)
模式C :NOR閃存- OE翻轉,模式C與模式1不一樣的是,NOE和NADV的翻轉變化,以及獨立的讀寫時序;
模式D:帶地址擴展的異步操做,模式D與模式1不一樣的是NADV的翻轉變化,NOE的翻轉出如今NADV翻轉以後,而且具備獨立的讀寫時序。
模式 1 -SRAM/PSRAM (CRAM)
下圖顯示了所遵循的受支持模式的讀寫事務經過配置FSMC_BCRx, and FSMC_BTRx/FSMC_BWTRx寄存器
▽模式1讀訪問
▽模式1寫訪問
位於寫入事務末尾的一個HCLK 週期有助於確保NWE 上升沿以後的地址和數據保持時間。因爲存在此HCLK 週期,DATAST 值必須大於零(DATAST > 0)。
模式 A -SRAM/PSRAM (CRAM) OE 切換
▽模式A讀訪問
▽模式A寫訪問
與模式1的不一樣之處在於NOE 的切換與獨立的讀取和寫入時序
對於模式A,
ADDSET就是NWE的高電平時間,也就是地址創建時間
DATAST就是NWE的低電平時間,也就是數據保持時間
readWriteTiming.FSMC_AddressSetupTime = 0x02; //地址創建時間(ADDSET)爲2個HCLK 2*1/120M=16ns readWriteTiming.FSMC_AddressHoldTime = 0x02; //地址保持時間(ADDHLD),16ns readWriteTiming.FSMC_DataSetupTime = 0x06; //數據創建時間,50ns readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;//總線恢復時間 readWriteTiming.FSMC_CLKDivision = 0x00;// 時鐘分頻因子 readWriteTiming.FSMC_DataLatency = 0x00;//數據產生時間 readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
FSMC_AddressSetupTime:這些位定義地址的創建時間,適用於SRAM、ROM和異步總線複用模式的NOR閃存操做。
FSMC_AddressHoldTime :這些位定義地址的保持時間,適用於SRAM、ROM和異步總線複用模式的NOR閃存操做。
FSMC_DataSetupTime:這些位定義數據的保持時間,適用於SRAM、ROM和異步總線複用模式的NOR閃存操做。
FSMC_BusTurnAroundDuration:這些位用於定義一次讀操做以後在總線上的延遲(僅適用於總線複用模式的NOR閃存操做),一次讀操做以後控制器須要在數據總線上爲下次操做送出地址,這個延遲就是爲了防止總線衝突。若是擴展的存儲器系統不包含總線複用模式的存儲器,或最慢的存儲器能夠在6個HCLK時鐘週期內將數據總線恢復到高阻狀態,能夠設置這個參數爲其最小值。
FSMC_CLKDivision :定義CLK時鐘輸出信號的週期,以HCLK週期數表示。
FSMC_DataLatency:處於同步成組模式的NOR閃存,須要定義在讀取第一個數據以前等待的存儲器週期數目。這個時間參數不是以HCLK表示,而是以閃存時鐘(CLK)表示。在訪問異步NOR閃存、SRAM或ROM時,這個參數不起做用。操做CRAM時,這個參數必須爲0
FSMC_AccessMode :訪問模式
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;// 這裏咱們使用NE1 ,也就對應BTCR[6],[7]。 FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;// 不復用數據地址 FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;//存儲器數據寬度爲8bit FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_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 = &readWriteTiming;//讀寫時序 FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming;//寫時序
FSMC_Bank:nor被分爲四塊,其中這個參數是說明對那個塊編程
FSMC_DataAddressMux:地址\數據是否複用
FSMC_MemoryType:存儲器類型
FSMC_MemoryDataWidth:數據總線寬度8位/16位
FSMC_BurstAccessMode:是否進行成組模式訪問
FSMC_WaitSignalPolarity:等待信號有效級性
FSMC_WrapMode:該位決定控制器是否支持把非對齊的AHB成組操做分割成2次線性操做;該位僅在存儲器的成組模式下有效。
FSMC_WaitSignalActive:當閃存存儲器處於成組傳輸模式時,NWAIT信號指示從閃存存儲器出來的數據是否有效或是否須要插入等待週期。該位決定存儲器是在等待狀態以前的一個時鐘週期產生NWAIT信號,仍是在等待狀態期間產生NWAIT信號。
FSMC_WriteOperation:該位指示FSMC是否容許/禁止對存儲器的寫操做。
FSMC_WaitSignal:當閃存存儲器處於成組傳輸模式時,這一位容許/禁止經過NWAIT信號插入等待狀態。
FSMC_ExtendedMode:該位容許FSMC使用FSMC_BWTR寄存器,即容許讀和寫使用不一樣的時序。
FSMC_WriteBurst:對於處於成組傳輸模式的閃存存儲器,這一位容許/禁止經過NWAIT信號插入等待狀態。讀操做的同步成組傳輸協議使能位是FSMC_BCRx寄存器的BURSTEN位。
FSMC_ReadWriteTimingStruct:讀時序配置指針
FSMC_WriteTimingStruct:寫時序配置指針
點擊查看本文所在的專輯,STM32F207教程