STM32 FSMC讀寫SRAM – How to Control SRAM with FSMC

Outline

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
Functional Block Diagram

在Functional Block Diagram中,分成5個區塊分別來看:

  1. DECODER
    • 負責定位當前輸入/輸出的記憶體位置
    • 圖中Block 512K表示擁有的定址範圍=> 512K = 219(A0-A18)
  2. I/O DATA CIRCUIT
    • 負責將當前輸入/輸出資料進行輸入/輸出的電路
    • 圖中”512K x 16″的16是指,I/O0-I/O7與I/O8-I/O15一共16-bits(頻寬)
  3. CONTROL CIRCUIT
    • 負責判斷是否選擇當前Device/輸入模式/輸出模式/高、低位元的輸入與輸出
  4. COLUMN I/O
    • 根據UB和LB判斷是否將資料進行輸入或輸出
  5. 512K x 16 MEMORY ARRAY
    • 512K x 16-bits表示一共能夠存取最大8M-bits的資料量
Pin Descriptions
Pin Descriptions
Truth Table
Truth Table

根據Functional Block Diagram、Pin Descriptions、Truth Table快速整理出幾點:

  1. 未被選擇(當前SRAM沒有被控制)
    • CS1=> High
    • CS2 => Low
    • LB=> High, UB=> High
  2. 關閉輸出
    • OE=> High, WE=> High
  3. 讀取模式
    • OE=> Low, WE=> High
  4. 寫入模式
    • OE=> X, WE=> Low

PS: CS2 腳位通常拉High,可忽略

SRAM Control – Read Cycle AC Waveforms

Read Cycle Switching Characteristics
Read Cycle Switching Characteristics
Read Cycle No.1
Read Cycle No.1

根據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. 2

在圖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

Write Cycle Switching Characteristics
Write Cycle Switching Characteristics
Write Cycle No.1
Write Cycle No.1
Write Cycle No.2
Write Cycle No.2
Write Cycle No.3
Write Cycle No.3

以我的理解,在寫入資料過程中能夠分成以下2個重點:

  1. Address Setup Time, 在SRAM中Setup地址所花費的時間
  2. 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.1Write Cycle No.2Write Cycle No.3都能以我上述方式理解。

Write Cycle No.4
Write Cycle No.4

在圖Write Cycle No. 4中,在連續寫入程序當中,控制UB和LB來分別進行寫入操作,其每次的寫入控制都至少需要tWC時間才能夠完成。

STM32F407 Flexible Static Memory Controller Introduction

Flexible static memory controller (FSMC),中譯為”靈活的”靜態記憶體控制器,接下來介紹在STM32F407的FSMC的功能及如何使用。

以下只介紹關於SRAM控制部分:

Outline

Features

FSMC接口是一個靜態記憶體控制器,能夠存儲如SRAM、ROM、NOR Flash、PSRAM等,也可以接口動態存儲器,如NAND Flash和PC Card等。FSMC的優點有以下幾點:

  • 可以通過配置寄存器來設置不同類型和規格的存儲器,支持多種時序和協議,適應各種存儲器的特性和要求。
  • 可以通過地址映射將外部存儲器映射到STM32的內部地址空間,方便讀寫操作,不需要關心控制線和數據線的時序邏輯
  • 可以支持突發模式訪問同步存儲器,提高數據傳輸效率。
  • 可以通過外部異步等待信號來控制存儲器的訪問速度,適應不同速度的存儲器。
  • 可以通過寫緩衝區來緩衝AHB寫突發事務,加快AHB釋放速度,提高系統性能。

STM32的FSMC功能是一種強大而靈活的外部存儲器擴展方案,可以幫助開發者實現更多的功能和性能。

Block Diagram

FSMC能夠分成4類,分別為:

  1. AHB介面(包含Configuration Register)
  2. NOR/PSRAM介面控制器
  3. NAND/PC Card介面控制器
  4. 外部設備介面
FSMC Block Diagram

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 Banks
FSMC Memory Banks

在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
NOR/PSRAM bank selection
NOR/PSRAM bank selection
NOR/PSRAM bank selection

根據圖NOR/PSRAM bank selection,HADDR[27:26]是內部AHB地址傳輸線位置,能夠轉換成外部Memory位置。

External memory address
External memory address

根據圖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

Programmable NOR/PSRAM access parameters
Programmable NOR/PSRAM access parameters

Device 所用參數:

  • Address Setup:設定地址過程中的時間
  • Address Hold:地址需要持續的時間
  • Data Setup:設定資料過程中的時間
  • Bust Turn:讀寫狀態改變所需的時間

PSRAM controller asynchronous transactions

Asynchronous static memories

Mode 1 – SRAM/PSRAM (CRAM)
Mode 1 read accesses
Mode 1 read accesses
Mode 1 write accesses
Mode 1 write accesses

注意在Mode1 寫入模式中,當NWE訊號上拉時,Address和Data能夠維持至少1 HCLK的時間,以確保資料能夠正確寫入。


Mode A – SRAM/PSRAM (CRAM) OE toggling
ModeA read accesses
ModeA read accesses
ModeA write accesses
ModeA write accesses

在ModeA寫入模式中,與Mode 1不同之處在於ModeA的讀取和寫入能夠將時序分別設置。

Mode D – asynchronous access with extended address
Mode D read accesses
Mode D read accesses
ModeD write accesses
ModeD write accesses

在ModeD寫入模式中,與Mode 1不同之處在於ModeD的NADV訊號結束號,能夠設置一段時間,之後再進行資料寫入。(本篇使用SRAM用不到NADV訊號)

STM32F407 FSMC Control SRAM Experiment

在了解FSMC和SRAM之後,接下來要透過實驗使用FSMC來讀寫SRAM,來更加理解FSMC的使用方式。

Outline

  • 實驗目的
  • 實驗順序
  • 實作&結果
  • 結論

實驗目的

透過STM32F407ZGT6利用FSMC控制SRAM,再透過調整內部時序相關參數,查看讀寫是否成功。

實驗順序

  1. 利用STM32 CubeMX設置與說明
  2. 測試實驗組與對照組
    • 對照組測試與結果
    • 實驗組
      • Address setup time 3 clock cycle測試與結果
      • Address setup time 2 clock cycle測試與結果
      • Address setup time 1 clock cycle測試與結果

實作&結果

SRAM-IS62WV51216BLL-55TLI電路圖

根據圖SRAM-IS62WV51216BLL-55TLI電路圖,相關控制方式可至文章上方SRAM Control(IS62WV51216BLL-55TLI)查看。

System Core
RCC Mode and Configuration
Clock Configuration

選擇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)

Connectivity
FSMC Mode-1
FSMC Mode-2
FSMC Configuration

選擇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,說明可能存取失敗的原因如下:

  1. 根據圖Read Cycle Switching Characteristics,Max tAA(Address Access Time) is 55 ns,意思是地址存取時間最多為55ns,小於55ns則不保證存取能夠成功。
  2. 根據圖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

以上圖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控制過程的訊號透過邏輯分析儀量測出來,與目前推論失敗的原因做個比對和糾正。

Reference

發表迴響

返回頂端