Outline
- What is SRAM?
- SRAM Control (IS62WV51216BLL-55TLI)
- STM32F407 Flexible Static Memory Controller Introduction
- STM32F407 FSMC Read/Write SRAM Experiment
- Manage External SRAM
- Conclusion
- Reference
What is SRAM?
SRAM(靜態隨機存取記憶體)是一種高速、低功耗、容量較小的存儲器。與DRAM(動態隨機存取記憶體)不同,SRAM使用靜態電路來保持存儲數據的狀態,因此不需要定期進行刷新操作,可以實現高速的讀寫操作。
SRAM通常用於需要高速讀寫的應用中,例如CPU的高速緩存、實時數據處理、嵌入式系統等。SRAM的速度通常比DRAM快,因為SRAM使用靜態電路存儲數據,並且不需要刷新操作。
SRAM的容量通常比DRAM小,因為SRAM需要使用較多的晶體管來實現靜態電路,而DRAM則可以使用較少的電路實現更大的存儲容量。SRAM通常採用單端口或雙端口設計,具有快速的讀寫速度和低功耗的特點。
總體而言,SRAM是一種高速、低功耗、容量較小的存儲器,通常用於需要高速讀寫的應用中。在嵌入式系統和CPU高速緩存等應用中,SRAM具有重要的地位。
SRAM Control(IS62WV51216BLL-55TLI)
在此篇文章中,會以IS62WV51216BLL-55TLI作為實驗範例,詳細可參考Datasheet
接下來會以4個部分來講解如何控制這顆SRAM,分別為Features-大致描述這顆特別之處,Functional-參考Datasheet並透過圖文方式說明和整理列出要注意的部分,Read/Write Cycle AC Waveforms-以圖文方式說明存取資料時要如何控制Timing。
Outline
SRAM Control – Features
大概描述一下這顆擁有的功能
- 高速的存取時間最快55ns
- CMOS 低功耗運作
- 異步運行(非同步操作)
- 高、低字節的資料(16-bits)
SRAM Control – Functional
說明關於SRAM的控制訊號
在Functional Block Diagram中,分成5個區塊分別來看:
- DECODER
- 負責定位當前輸入/輸出的記憶體位置
- 圖中Block 512K表示擁有的定址範圍=> 512K = 219(A0-A18)
- I/O DATA CIRCUIT
- 負責將當前輸入/輸出資料進行輸入/輸出的電路
- 圖中”512K x 16″的16是指,I/O0-I/O7與I/O8-I/O15一共16-bits(頻寬)
- CONTROL CIRCUIT
- 負責判斷是否選擇當前Device/輸入模式/輸出模式/高、低位元的輸入與輸出
- COLUMN I/O
- 根據UB‘和LB‘判斷是否將資料進行輸入或輸出
- 512K x 16 MEMORY ARRAY
- 512K x 16-bits表示一共能夠存取最大8M-bits的資料量
根據Functional Block Diagram、Pin Descriptions、Truth Table快速整理出幾點:
- 未被選擇(當前SRAM沒有被控制)
- CS1‘=> High
- CS2 => Low
- LB‘=> High, UB‘=> High
- 關閉輸出
- OE‘=> High, WE‘=> High
- 讀取模式
- OE‘=> Low, WE‘=> High
- 寫入模式
- OE‘=> X, WE‘=> Low
PS: CS2 腳位通常拉High,可忽略
SRAM Control – Read Cycle AC Waveforms
根據Read Cycle No. 1,以我個人理解此圖想表達,由於讀取資料過程中tRC 必須包含了Address Access Time (tAA, 地址存取時間),也就是這顆SRAM需要tAA時間才能夠將Address 存取進SRAM內,並執行後續動作。
接下來從tAA末端至整體tRC時間內,必須是tRC大於等於tAA的時間(依據Read Cycle Switching Characteristics 的tRC和tAA),其中tAA最多不超過55ns以及tRC至少需要55 ns,如果在55 ns之後輸入了下一個存取資料的地址還有tOHA(10 ns)的時間,能夠取得資料。
但是,通常本人設計會將tRC多保留1個Clock,來保證資料確實被MCU/CPU (or Others)存取成功。(後續說明此用意)
在圖Read Cycle No. 2中,仔細看能夠觀察出,其實與Read Cycle No. 1無太大的區別,在tRC時間內必須完成Address Access所花費tAA的時間(max 55 ns) ,其中要注意的是過程當中CS1’存取花費時間(tACE1)與tAA是一致的。
再來要注意的部分是,哪一個動作是最後一個執行的,就得以他可能花費最長時間( + 1 Clock) ,才能夠將資料取出來。
假設OE’、LB’和UB’在上個存取週期(n – 1)持續保持Low到當前存取週期(n),只有Chip Select腳位為High(CS1′ => High) ,這時想讀取這SRAM,就得根據Truth Table和Read Cycle Switching Characteristics進行腳位設置與時間上的等待,也就是得將CS1’拉Low之後再等上tACE1 (+ 1 Clock) 時間(55 ns up) ,就能夠將DOUT資料取出來。
SRAM Control – Write Cycle AC Waveforms
以我的理解,在寫入資料過程中能夠分成以下2個重點:
- Address Setup Time, 在SRAM中Setup地址所花費的時間
- Data Hold Time,將資料寫入到I/O Data後,所持續的時間
Address Setup Time包含了tSA、tHZWE,其中tSA得花費0 ns以上、tHZWE最多可花20 ns;接下來是Data Hold Time包含了tSD、tLZWE,其中tSD得花費25 ns up以確保資料能夠確實寫入進SRAM、tLZWE得花至少5 ns up,確保這次寫入Cycle以結束。
但是因為是異步控制,所以還是整體寫入時序必須等待至少55 ns(tWC),以完成這次的寫入週期,才能夠確保進入到下一個寫入或讀取週期。
圖Write Cycle No.1、Write Cycle No.2、Write Cycle No.3都能以我上述方式理解。
在圖Write Cycle No. 4中,在連續寫入程序當中,控制UB‘和LB‘來分別進行寫入操作,其每次的寫入控制都至少需要tWC時間才能夠完成。
STM32F407 Flexible Static Memory Controller Introduction
Flexible static memory controller (FSMC),中譯為”靈活的”靜態記憶體控制器,接下來介紹在STM32F407的FSMC的功能及如何使用。
以下只介紹關於SRAM控制部分:
Outline
- Features
- Block Diagram
- AHB Interface
- Device Memory Mapping
- Programmable Access Parameters
- PSRAM controller asynchronous transactions
Features
FSMC接口是一個靜態記憶體控制器,能夠存儲如SRAM、ROM、NOR Flash、PSRAM等,也可以接口動態存儲器,如NAND Flash和PC Card等。FSMC的優點有以下幾點:
- 可以通過配置寄存器來設置不同類型和規格的存儲器,支持多種時序和協議,適應各種存儲器的特性和要求。
- 可以通過地址映射將外部存儲器映射到STM32的內部地址空間,方便讀寫操作,不需要關心控制線和數據線的時序邏輯。
- 可以支持突發模式訪問同步存儲器,提高數據傳輸效率。
- 可以通過外部異步等待信號來控制存儲器的訪問速度,適應不同速度的存儲器。
- 可以通過寫緩衝區來緩衝AHB寫突發事務,加快AHB釋放速度,提高系統性能。
STM32的FSMC功能是一種強大而靈活的外部存儲器擴展方案,可以幫助開發者實現更多的功能和性能。
Block Diagram
FSMC能夠分成4類,分別為:
- AHB介面(包含Configuration Register)
- NOR/PSRAM介面控制器
- NAND/PC Card介面控制器
- 外部設備介面
AHB Interface
根據Reference手冊:
AHB 介面能夠使內部 CPU 和其他總線主外設能夠訪問外部Static Memories。
透過FSMC能夠將AHB所傳送的資料轉換成外設可以使用的協議。比較特殊的是,當外部所接Memory是16或8位元的,AHB傳輸位元寬是32位元且能夠分割成16或8位元來存取。
FSMC Chip Select (FSMC_NEx)不會在連續訪問之間切換,除非啟用了擴展模式的D模式情況下才會發生。
FSMC的參考Clock與AHB Clock(HCLK)相同。
Device Memory Mapping
在FSMC中,連接至外部Memory的空間分割成4組固定大小Banks,每組Bank大小為256Mbyte。(可參考FSMC Memory Banks)
其中Bank 1分割成四組可用來控制NOR Flash或是PSRAM的Memory。選擇致其中一組的方式是用Chip Select(NEx)腳位決定。
四組分別為:
- Bank 1 – NOR/PSRAM 1 (0x6000_0000 ~ 0x63FFF_FFFF, 64MB)
- Bank 1 – NOR/PSRAM 2 (0x6400_0000 ~ 0x67FFF_FFFF, 64MB)
- Bank 1 – NOR/PSRAM 3 (0x6800_0000 ~ 0x6BFFF_FFFF, 64MB)
- Bank 1 – NOR/PSRAM 4 (0x6C00_0000 ~ 0x6FFFF_FFFF, 64MB)
根據圖NOR/PSRAM bank selection,HADDR[27:26]是內部AHB地址傳輸線位置,能夠轉換成外部Memory位置。
根據圖External memory address,以我理解來表達,當外部Memory數據位元寬為8-bit,內部AHB HADDR[25:0]剛好能夠對應至外部Memory的地址位置,所以最大存取資料量為64 Mbyte x 8=512 Mbit;當外部Memory數據位元寬為16-bit,如過透過內部一對一地址來存取資料,會造成UB’或LB’無法取得,所以內部HADDR[25:0]會在要存取16-bit資料位元寬的時候,將內部HADDR[25:1]對應至外部Memory[24:0]地址位置(HADDR[0]不接),接下來當上層存取資料(16-bit)時,這樣做就能夠使一個位置能夠存取到16-bit位元寬的資料。
Programmable Access Parameters
Device 所用參數:
- Address Setup:設定地址過程中的時間
- Address Hold:地址需要持續的時間
- Data Setup:設定資料過程中的時間
- Bust Turn:讀寫狀態改變所需的時間
PSRAM controller asynchronous transactions
Asynchronous static memories
Mode 1 – SRAM/PSRAM (CRAM)
注意在Mode1 寫入模式中,當NWE訊號上拉時,Address和Data能夠維持至少1 HCLK的時間,以確保資料能夠正確寫入。
Mode A – SRAM/PSRAM (CRAM) OE toggling
在ModeA寫入模式中,與Mode 1不同之處在於ModeA的讀取和寫入能夠將時序分別設置。
Mode D – asynchronous access with extended address
在ModeD寫入模式中,與Mode 1不同之處在於ModeD的NADV訊號結束號,能夠設置一段時間,之後再進行資料寫入。(本篇使用SRAM用不到NADV訊號)
STM32F407 FSMC Control SRAM Experiment
在了解FSMC和SRAM之後,接下來要透過實驗使用FSMC來讀寫SRAM,來更加理解FSMC的使用方式。
Outline
- 實驗目的
- 實驗順序
- 實作&結果
- 結論
實驗目的
透過STM32F407ZGT6利用FSMC控制SRAM,再透過調整內部時序相關參數,查看讀寫是否成功。
實驗順序
- 利用STM32 CubeMX設置與說明
- 測試實驗組與對照組
- 對照組測試與結果
- 實驗組
- Address setup time 3 clock cycle測試與結果
- Address setup time 2 clock cycle測試與結果
- Address setup time 1 clock cycle測試與結果
實作&結果
根據圖SRAM-IS62WV51216BLL-55TLI電路圖,相關控制方式可至文章上方SRAM Control(IS62WV51216BLL-55TLI)查看。
選擇System Code – RCC,設置RCC Mode – High Speed Clock (HSE)為Crystal/Ceramic Resonator,接下來到Clock Configuration畫面,設置Input Frequency為8 MHz,PLL Source Mux選擇HSE,設置System Clock Mux為PLLCLK,這樣Clock就設定完成了。
這裡HCLK我選擇設置成64 MHz,換算成週期為15.625 ns。 (其實還能夠更快,只是目前我的邏輯分析儀Sample rate只能夠支持到100M)
選擇FSMC並在Mode進行設定:
- Chip Select選擇NE3
- Memory Type選擇SRAM
- Address選擇19bit
- 啟用Byte enable.
Configuration – Control:
- Memory Type選擇SRAM
- Bank選擇Bank 1 NOR/PSRAM 3
- 啟用Write operation
- 禁用Extended mode
Configuration – timing:
- 將Address setup time in HCLK clock cycles設置4
- 將Data setup time in HCLK clock cycles設置1
- 將Bus turnaround time in HCLK clock cycles設置0
- 預設Access mode會為ModeA
測試實驗組與對照組
不變條件: Address Hold Time、Data Setup Time
控制變因: Address Setup Time
下面為測試結果
對照組測試與結果
將數值”0x1234″寫入至SRAM_Stream + 0位置以及”0x5678″寫入至SRAM_Stream + 0位置,與讀取數值一致。
實驗組
Address setup time 3 clock cycle測試與結果
將數值”0x1234″寫入至SRAM_Stream + 0位置以及”0x5678″寫入至SRAM_Stream + 0位置,與讀取數值一致。
Address setup time 2 clock cycle測試與結果
將數值”0x1234″寫入至SRAM_Stream + 0位置以及”0x5678″寫入至SRAM_Stream + 0位置,與讀取數值一致。
Address setup time 1 clock cycle測試與結果
將數值”0x1234″寫入至SRAM_Stream + 0位置以及”0x5678″寫入至SRAM_Stream + 0位置,讀取數值皆為0,測試失敗。
結論
討論當Address Setup Time設置1,Address Hold Time設置1,存取時間為Timing.AddressSetupTime + Timing.AddressHoldTime = 2 clock cycle = 15.625 ns * 2 = 31.25 ns。接下來需要參考圖FSMC ModeA read accesses和圖FSMC ModeA write accesses,說明可能存取失敗的原因如下:
- 根據圖Read Cycle Switching Characteristics,Max tAA(Address Access Time) is 55 ns,意思是地址存取時間最多為55ns,小於55ns則不保證存取能夠成功。
- 根據圖Write Cycle Switching Characteristics,Min tPWE(WE’ Pulse Width) is 40 ns,但是Timing.AddressHoldTime is 1 clock cycle is 15.625 ns,15.625 ns無法確保這麼短的時間內,能夠將資料正確寫入。
目前先以Datasheet和Reference Manual推測失敗的原因,未來找時間以邏輯分析儀來分析存取失敗的原因。
Manage External SRAM
在外部SRAM存取實驗中,發現如果每次要針對位置進行存取資料,是相當麻煩的事情,於是要用到C語言高階語言的特性,來進行有效的SRAM管理,不必再因為得想地址位置而感到煩惱。
以上圖Manager SRAM Address Example為例,首先建立一個結構SRAM_Data,接著利用Mapping的方式將Address映射成SRAM_Data結構(sram_data指標),在存取sram_data指標進行讀寫資料時也能夠存取到外部的SRAM了,且每次存取不用再透過地址轉換讀取資料,大幅增加可讀性與操作性。
Conclusion
最後總結,對於FSMC還有許多需要學習的部分,像是對於NOR/NAND Flash的存取、LCD TFT控制、PC Card等等,或是對於不同模式A、B、C和模式D的實際應用,未來一定給自我學習的機會,把這些功能學習起來。
再來對於實驗部分希望再嚴謹一些,有時間把FSMC控制過程的訊號透過邏輯分析儀量測出來,與目前推論失敗的原因做個比對和糾正。