天天看點

STM32F7--->SDRAMSDRAMFMC接口驅動SDRAM附錄

文章目錄

  • SDRAM
    • SDRAM信号線
    • 存儲單元
    • 存儲結構
    • 資料傳輸
    • 控制指令
      • 空操作指令
      • 激活指令
      • 讀寫指令
      • 預充電指令
      • 重新整理指令
      • 設定模式寄存器指令
    • 初始化
    • 寫操作
    • 讀操作
  • FMC接口驅動SDRAM
    • SDRAM相關寄存器
      • 控制寄存器FMC_SDCR1/FMC_SDCR2
      • 的時序寄存器FMC_SDTR1/FMC_SDTR2
      • 的指令模式寄存器 FMC_SDCMR
      • 重新整理定時器寄存器: FMC_SDRTR
  • 附錄
    • 交代
    • 聲明

SDRAM

  • SDRAM英文名是 Synchronous Dynamic Random Access Memory ,即同步動态随機存儲器,相較于 SRAM(靜态存儲器) SDRAM 具有:容量大和價格便宜的特點。
  • STM32F767 支援 SDRAM ,我們可以外挂 SDRAM ,進而大大降低外擴記憶體的成本,如下SDRAM 型号為: W9825G6KH 的結構框圖。
    STM32F7--->SDRAMSDRAMFMC接口驅動SDRAM附錄
  • 一個SDRAM 晶片内部,一般又有4 個存儲單元(BANK),是以,在SDRAM 内部尋址的時候,先指定BANK 号和行位址,然後再指定列位址,就可以查找到目标位址。

SDRAM信号線

  • 尋址的時候,首先RAS 信号為低電平,選通行位址,位址線A0~A12 所表示的位址,會被傳輸并鎖存到行位址譯碼器裡面,最為行位址,同時BANK位址線上面的BS0,BS1 所表示的BANK位址,也會被鎖存,選中對應的BANK,然後,CAS 信号為低電平,選通列位址,位址線A0~A12 所表示的位址,會被傳輸并鎖存到列位址譯碼器裡面,作為列位址,這樣,就完成了一次尋址。
    STM32F7--->SDRAMSDRAMFMC接口驅動SDRAM附錄

存儲單元

STM32F7--->SDRAMSDRAMFMC接口驅動SDRAM附錄

存儲結構

  • W9825G6KH 的存儲結構為:行位址:8192 個;列位址:512 個;BANK 數:4 個;位寬:16 位;這樣,整個晶片的容量為:81925124*16=32M 位元組。
    STM32F7--->SDRAMSDRAMFMC接口驅動SDRAM附錄

資料傳輸

  • 在完成尋址以後,資料線DQ0~DQ15 上面的資料會通過資料控制邏輯寫入(或讀出)存儲陣列。
  • 特别注意:因為SDRAM 的位寬,可以達到32 位,也就是最多有32 條資料線,在實際使用的時候,我們可能會以:8 位、16 位、24 位和32 位等寬度來讀寫資料,這樣的話,并不是每條資料線,都會被使用到,未被用到的資料線上面的資料,必須被忽略,這個時候就需要用到資料掩碼DQM 線來控制了,每一個資料掩碼線,對應8 個位的資料,低電平表示對應資料位有效,高電平表示對應資料位無效。
  • W9825G6KH中,假設以8 位資料通路,我們隻需要DQ0 ~DQ7 的資料,而DQ8~DQ15的資料需要忽略,此時,我們隻需要設定LDQM 為低電平,UDQM 為高電平,就可以了。

控制指令

STM32F7--->SDRAMSDRAMFMC接口驅動SDRAM附錄

空操作指令

  • NO-Operation,空操作指令,用于選中SDRAM,防止SDRAM接受錯誤的指令,為接下來的指令發送做準備。

激活指令

  • Active,激活指令,該指令必須在讀寫操作之前被發送,用于設定所需要的Bank和行位址(同時設定這2個位址),Bank位址由BS0,BS1(也寫作BA0,BA1,下同)指定,行位址由A0~A12指定

讀寫指令

  • Read/Write,讀/寫指令,在發送完激活指令後,再發送列位址就可以完成對SDRAM的尋址,并進行讀寫操作了,讀/寫指令和列位址的發送,是通過一次傳輸完成的。列位址由 A0~A9 指定, WE 信号控制讀 寫指令,高電平表示讀指令,低電平表示寫指令。

預充電指令

  • Precharge,預充電指令,用于關閉Bank中所打開的行位址。由于SDRAM的尋址具體獨占性,是以在進行完讀寫操作後,如果要對同一Bank的另一行進行尋址,就要将原來有效(打開)的行關閉,重新發送行/列位址。Bank關閉現有行,準備打開新行的操作就叫做預充電(Precharge)。

    預充電指令可以通過獨立的指令發送,也可以在每次發送讀 寫指令的時候,使用位址線A10 ,來設定自動預充電。在發送讀 寫指令的時候,當 A10=1 ,則使能所有 Bank 的預充電,在讀 寫操作完成後,自動進行預充電。這樣,下次讀 寫操作之前,就不需要再發預充電指令了,進而提高讀 寫速度。

重新整理指令

  • Refresh,重新整理指令,用于重新整理一行資料。SDRAM裡面存儲的資料,需要不斷的進行重新整理操作才能保留住,是以重新整理指令對于SDRAM來說,尤為重要。預充電指令和重新整理指令,都可以實作對 SDRAM 資料的重新整理,不過預充電僅對目前打開的行有效(僅重新整理目前行),而重新整理指令,則可以依次對所有的行進行重新整理操作。

    總共有兩種重新整理操作:自動重新整理(Auto Refresh )和自我重新整理 (Self Refresh ),在發送 Refresh

    指令時,如果 CKE 有效(高電平),則使用自動重新整理模式,否則使用自我重新整理模式。不論是何

    種重新整理方式,都不需要外部提供行位址資訊,因為這是一個内部的自動操作。

    自動重新整理:SDRAM 内部有一個行位址生成器(也稱重新整理計數器)用來自動 的依次生成要

    重新整理的行位址。由于重新整理是針對一行中的所有存儲體進行,是以無需列尋址。重新整理涉及到所有

    Bank ,是以在重新整理過程中,所有 Bank 都停止工作,而每次重新整理所占用的時間為 9 個時鐘周期

    PC133 标準),之後就可進入正常的工作狀态,也就是說在這 9 個時鐘期間内,所有工作指

    令隻能等待而無法執行。重新整理操作必須不停的執行,完成一次所有行的重新整理所需要的時間,稱

    為重新整理周期,一般為 64ms 。顯然,重新整理操作肯定會對 SDRAM 的性能造成影響,但這是沒辦法

    的事情,也是 DRAM 相對于 SRAM (靜态記憶體,無需重新整理仍能保留資料)取得 成本優勢的同

    時所付出的代價。

    自我重新整理:主要用于休眠模式低功耗狀态下的資料儲存,在發出自動重新整理指令時,将CKE置于無效狀态(低電平),就進入了自我重新整理模式,此時不再依靠系統時鐘工作,而是根據内部的時鐘進行重新整理操作。在自我重新整理期間除了CKE 之外的所有外部信号都是無效的(無需外部提供重新整理指令),隻有重新使 CKE 有效(高電平)才能退出自重新整理模式并進入正常操作狀态。

設定模式寄存器指令

  • Mode Register Set,設定模式寄存器指令。SDRAM晶片内部有一個邏輯控制單元,控制單元的相關參數由模式寄存器提供,我們通過設定模式寄存器指令,來完成對模式寄存器的設定,這個指令在每次對SDRAM進行初始化的時候,都需要用到。
    STM32F7--->SDRAMSDRAMFMC接口驅動SDRAM附錄

    Burst Length突發長度模式(簡稱 BL ),通過 A0~A2 設定, 是指在同一行中相鄰的存儲單元連 續進行資料傳輸的方式,連續傳輸所涉及到存儲單元(列)的數量就是突發長度。

    前面我們說的讀寫操作,都是一次對一個存儲單元進行尋址,如果要連續讀 寫就還要對目前存儲單元的下一個單元進行尋址,也就是要不斷的發送列位址與讀 寫指令(行位址不變,是以不用再對行尋址)。雖然由于讀 寫延遲相同可以讓資料的傳輸在 I/O 端是連續的,但它占用了大量的記憶體控制資源,在資料進行連續傳輸時無法輸入新的指令,效率很低 。

    為此,人們開發了突發傳輸技術,隻要指定起始列位址與突發長度,記憶體就會依次地自動對後面相應數量的存儲單元進行讀 寫操作而不再需要控制器連續地提供列位址。 這樣,除了第一個資料的傳輸需要若幹個周期外,其後每個資料隻需一個周期的即可獲得。

    非突發連續讀取模式:不采用突發傳輸而是依次單獨尋址,此時可等效于BL=1 。雖然可以讓資料是連續的傳輸,但每次都要發送列位址與指令資訊,控制資源占用極大。

    突發連續讀取模式:隻要指定起始列位址與突發長度,尋址與資料的讀取自動進行,而隻要控制好兩段突發讀取指令的間隔周期(與 BL 相同)即可做到連續的突發傳輸。 至于 BL 的數值,也是不能随便設或在資料進行傳輸前臨時決定,而是在初始化的時候,通過模式 寄存器設定指令,進行設定。

    目前可用的選項是 1 、 2 、 4 、 8 、全頁( Full Page ),常見的設定是 4 和 8 。 若傳輸長度小于突發長度,則需要發送 Burst Stop(停止突發)指令,結束突發傳輸。

    Addressing Mode,突發通路的位址模式,通過 A3 設定,可以設定為: Sequential (順序

    或 Interleave (交錯)。順序方式,位址連續通路,而交錯模式則位址是亂序的,一般選擇連續模式。

  • CAS Latency列位址選通延遲(簡稱 CL )。在讀指令(同時發送列位址)發送完之後需要等待幾個時鐘周期, DQ 資料線上的資料,才會有效,這個延遲時間,就叫 CL ,一般設定為 2/3 個時鐘周期。

    特别注意:列位址選通延遲(CL ),僅在讀指令的時候有效果,在寫指令的時候,并不需要這個延遲。

  • Write Mode即寫模式,用于設定單次寫的模式,可以選擇突發寫入或者單次寫入。

初始化

初始化分為五個步驟

1.上電

給SDRAM供電,是能CLK,并發送NOP(No Operation指令),上電後至少要等待200us,再發送其他指令。

2.發送預充電指令

發送預充電指令,給所用BANK預充電

3.發送自動重新整理指令

至少要放松8次自動重新整理指令,每一次自動重新整理指令之間的時間間隔為tRC

4.設定寄存器模式

發送模式寄存器的值,配置SDRAM的工作參數,配置完成後,需要等待tMRD(也叫tRSC),使模式寄存器的配置生效,才能發送其他指令

5.完成

經過前面四個步驟,SDRAM的初始化就完成了,接下來就可以發送激活指令和讀寫指令進行資料的讀寫了。

寫操作

1.發送激活指令

此指令同時設定行位址和BANK位址,發送該指令後,需要等待tRCD時間,才可以發送寫指令

2.發送寫指令

在發送完激活指令,并等待tRCD後,發送寫指令,該指令同時設定列位址,完成對SDRAM的尋址。同時,将資料通過DQ資料線,存入SDRAM

3.使能自動預充電

在發送寫指令的同時,拉高A10位址線,使能自動預充電,以提高讀寫效率

4.執行預充電

預充電在發送激活指令的tRAS時間後啟動,并且需要等待tRP時間

5.完成一次資料寫入

至此完成了一次資料寫入操作,發送第二個激活指令,啟動下一次資料傳輸。

讀操作

1.發送激活指令

此指令同時設定行位址和BANK位址,發送該指令後,需要等待tRCD時間,才可以發送寫指令

2.發送讀指令

在發送完激活指令,并等待tRCD 後,發送讀指令,該指令同時設定列位址,完成對 SDRAM的尋址。讀操作還有一個 CL 延遲( CAS Latency ),是以需要等待給定的 CL 延遲( 2 個或 3 個CLK )後,再從 DQ 資料線上讀取資料。

3.使能自動預充電

在發送寫指令的同時,拉高A10位址線,使能自動預充電,以提高讀寫效率

4.執行預充電

預充電在發送激活指令的tRAS時間後啟動,并且需要等待tRP時間來完成

5.完成一次資料寫入

至此完成了一次資料寫入操作,發送第二個激活指令,啟動下一次資料傳輸。

FMC接口驅動SDRAM

SDRAM相關寄存器

控制寄存器FMC_SDCR1/FMC_SDCR2

STM32F7--->SDRAMSDRAMFMC接口驅動SDRAM附錄

該寄存器隻有低15 位有效,且都需要進行配置:

NC 這兩個位定義列位址的位數 00 ~11 ,表示 8 ~11 位) W9825G6KH 有 9 位列位址,這裡應該設定為 01 。
NR 這 兩個位 定義 行位址的位數 00 ~10 ,表示 11 ~13 位) W9825G6KH 有 13 位行位址,這裡設定為 10 。
MWID 這兩個位定義存儲器資料總線寬度 00~ 10 ,表示 8~32 位) W9825G6KH 資料位寬為 16 位,是以,這裡設定為 01 。
NB 該位用于 設定 SDRAM 内部存儲區域 BANK 數量 0=2 個, 1=4 個) W9825G6KH内部有 4 個 BANK ,是以,這裡設定為 1 。
CAS 這兩個位 可設定 SDRAM 的 CAS 延遲 按存儲器時鐘周期計 01 ~11 ,表示 1 ~3 個) W9825G6KH 可以設定為 2 ,也可以設定為 3 ,我們設定為 11 。
WP 該位用于寫保護設定 0= 寫使能, 1= 寫保護) 需要用到寫操作,是以這裡設定為 1 即可。
SDCLK 這兩個位用于配置 SDRAM 的時鐘( 10=HCLK/2 11=HCLK/3 ),需要在禁止SDRAM 時鐘的前提下配置。 W9825G6KH 最快可以到 200M ((@CL=3 ),為了較快的速度,設定為 10 。
RBURST 此位用于使能突發讀模式 0= 禁止, 1= 使能) 設定為 1 ,使能突發讀。
RPIPE 這 兩個位 可定義在 CAS 延遲後延後多少個 HCLK 時鐘周期讀取資料 00~10表示 0~2 個) 設定為 00 即可。

的時序寄存器FMC_SDTR1/FMC_SDTR2

該寄存器用于控制SDRAM的時序

STM32F7--->SDRAMSDRAMFMC接口驅動SDRAM附錄
功能 使用
TMRD 這 四個 位定義 加載模式寄 存器指令和激活或重新整理指令之間的延遲,這個參數就是SDRAM 資料手冊裡面的 tMR D 或 tRSC 參數 W9825G6KH 的 tRSC 值為 2 個時鐘,設定為 1 即可( 2 個時鐘周期,這裡的時鐘周期是指 SDRAM 的時鐘周期,下同)。
TXSR 這 四個 位 定義從發出自重新整理指令到發出激活指令之間的延遲 W9825G6KH 的這個時間為 72ns ,設定 STM32F767 的時鐘頻率為 216Mhz ,那麼一個 SDRAM 的時鐘頻率為108M ,一個周期為 9.3ns ,設定 TXSR 為 7 ,即 8 個時鐘周期即可。
TRAS 這四個位用于設定自刷 新周期 W9825G6KH 的自重新整理周期為 60ns ,我們設定 TRAS為 6 ,即 7 個時鐘周期即可。
TRC 這 四個位 定 義重新整理指令和激活指令之間的延遲,以及兩個相鄰重新整理指令之間的延遲 W9825G6KH 的這個時間同樣是 60ns ,設定 TRC 為 6 ,即 7 個時鐘周期即可。
TWR 這 四個位 定義寫指令和預充電指令之間的延遲 W9825G6KH 的這個時間為 2 個時鐘周期,設定 TWR=1 即可。
TRP 這 四個位定義預充電指令與其它指令之間的延遲 W9825G6KH 的這個時間為 15ns,設定 TRP=1 ,即 2 個時鐘周期( 18.6ns )。
TRCD 這 四個位 定義激活指令與讀/寫指令之間的延遲 W9825G6KH 的這個時間為 15ns ,設定 TRP=1 ,即 2 個時鐘周期( 18.6ns )。

的指令模式寄存器 FMC_SDCMR

STM32F7--->SDRAMSDRAMFMC接口驅動SDRAM附錄
功能 使用
MODE

這 三個 位 定義發送到 SDRAM 存儲器的命 令。

000 :正常模式

001 :時鐘配置使能;

010 :預充電所有存儲區

011 :自重新整理指令

100 :配置模式寄存器

101 :自重新整理指令

110 :掉電指令

111 :保留。

加粗部分的指令,配置的時候需要用到。
CTB2/CTB1 這兩個位用于指定指令所發送的目标存儲器,因為 SDRAM 控制器可以外挂2 個 SDRAM ,發送指令的時候,需要通過 CTB1/CTB2 指定指令發送給哪個存儲器。 使用的是第一個存儲器( SDNE0 ),是以設定 CTB1 即可。
NRFS 這四個位定義在 MODE=011 時,所發出的連續自重新整理指令的個數。 0000~1110 ,表示 1 ~15 個自重新整理指令 W9825G6KH 在初始化的時候,至少需要連續發送 8 個自重新整理指令。
MRD 這十三個位,定義 SDRAM 模式寄存器的内容(通過位址線發送) 在 MODE=100的時候,需要配置。

重新整理定時器寄存器: FMC_SDRTR

以W9825G6KH 為例, W9825G6KH 的重新整理周期為 64ms ,行數為 8192行,是以重新整理速率為:

重新整理速率=64ms/8192=7.81us

而SDRAM 時鐘頻率 =216Mhz/2=108Mhz 9.26ns ,

是以 COUNT 的值為:

COUNT=7.81us/9.26ns=844

SDRAM 在接受讀請求後,出現内部重新整理請求,則必須将重新整理速率增加 20 個 SDRAM時鐘周期,以獲得充足的餘量,是以,實際設計的 COUNT 值應該是: COUNT 20=824 。是以設定 FMC_SDRTR 的 COUNT=824 ,就可以完成對該寄存器的配置。

STM32F7--->SDRAMSDRAMFMC接口驅動SDRAM附錄

附錄

交代

上文中的tRC 、 tMRD 和 tRSC 見 SDRAM 的晶片資料手冊。

聲明

本文大部分參考于正點原子

繼續閱讀