STM32FSMC扩展SRAM
?作者簡介:嵌入式入坑者,與大家一起加油,希望文章能夠幫助各位!!!!
📃個人主頁:@rivencode的個人主頁
🔥系列專欄:玩轉STM32
💬推薦一款模擬面試、刷題神器,從基礎到大廠面試題👉點擊跳轉刷題網站進行注冊學習
目錄
- 一.SRAM-IS62WV51216芯片介紹
- 二.SRAM芯片功能框圖
- 三.FSMC外設功能框圖
- 四.初始化結構體
一.SRAM-IS62WV51216芯片介紹
IS62WV51216是ISSI(Integrated Silicon Solution, Inc)公司生產的一顆16位寬512K(512*16,即1M字節)(這1M字節是怎么算的后面會講)容量的CMOS靜態內存(SRAM)芯片。
STM32 控制器芯片內部有一定大小的 SRAM,SRAM相當于我們電腦中的內存當程序運行時那些臨時變量就需要暫存在SRAM中,當我們程序很大時導致內存不足就需要進行內存擴展,由于引腳數量的限制(需要很多地址線與數據線),只有 STM32F103ZE 或以上型號的芯片才可以擴展外部 SRAM。
二.SRAM芯片功能框圖
1.SRAM 信號線
只要控制信號線使能了訪問,從地址線輸入要訪問的地址,即可從 I/O數據線寫入或讀出數據。
2.存儲器矩陣
SRAM 內部包含的存儲陣列,可以把它理解成一張表格,數據就填在這張表格上。和表格查找一樣,指定一個行地址和列地址,就可以精確地找到目標單元格,這是 SRAM 芯片尋址的基本原理。這樣的每個單元格被稱為存儲單元,而這樣的表則被稱為存儲矩陣。
2.地址譯碼器、列 I/O 及 I/O 數據電路
地址譯碼器把 N 根地址線轉換成 2的N次方根信號線,每根信號線對應一行或一列存儲單元,通過地址線找到具體的存儲單元,實現尋址。如果存儲陣列比較大,地址線會分成行和列地址,或者行、列分時復用同一地址總線,訪問數據尋址時先用地址線傳輸行地址再傳輸列地址
本實例中的SRAM 比較小,沒有列地址線,它的數據寬度為 16 位,即一個行地址對應 2 字節空間,框圖中左側的 A0-A18 是19根地址線一共可以表示 2的19次方=2的8次方x1024=512K 行存儲單元,所以它一共能訪問 512Kx2字節就等于1M字節大小的空間。
#代表低電平有效
訪問時,使用 UB# 或 LB# 線控制數據寬度,例如,當要訪問寬度為 16 位的數據時,使用行地址線指出地址,然后把 UB# 和 LB# 線都設置為低電平,那么 I/O0-I/O15 線都有效,它們一起輸出該地址的 16 位數據 (或者接收 16 位數據到該地址);當要訪問寬度為 8 位的數據時,使用行地址線指出地址,然后把 UB# 或 LB# 其中一個設置為低電平,I/O 會對應輸出該地址的高 8 位和低 8 位數據,因此它們被稱為數據掩碼信號。
STM32與SRAM數據交互:直接統統A0~A18信號線輸入一個地址,然后數據通過數據線I/O0 ~ I/O15將我們要傳輸的數據存儲在SRAM中或STM32讀取出來
3.SRAM 的讀寫流程
(1) 主機使用地址信號線發出要訪問的存儲器目標地址,地址需要持續整個讀寫時序
(2) 控制片選信號 CS1# 及 CS2# 使能存儲器芯片;
(3) 若是要進行讀操作,則控制讀使能信號 OE# 表示要讀數據,若進行寫操作則控制寫使能信號WE# 表示要寫數據;
(4) 使用掩碼信號 LB# 與 UB# 指示要訪問目標地址的高、低字節部分;
(5) 若是讀取過程,存儲器會通過數據線向主機輸出目標數據,若是寫入過程,主要使用數據線向存儲器傳輸目標數據。
三.FSMC外設功能框圖
前面帶N的代表低電平有效
1.AHB接口
AHB接口為內部CPU和其它總線控制設備訪問外部靜態存儲器提供了通道。
AHB操作被轉換到外部設備的操作。當選擇的外部存儲器的數據通道是16或8位時,在AHB上的32位數據會被分割成連續的16或8位的操作。
AHB時鐘(HCLK)是FSMC的參考時鐘。
一般的操作規則
請求AHB操作的數據寬度可以是8位、16位或32位,而外部設備則是固定的數據寬度,此時需要保障實現數據傳輸的一致性。
因此,FSMC執行下述操作規則:
- AHB操作的數據寬度與存儲器數據寬度相同:無數據傳輸一致性的問題。
- AHB操作的數據寬度大于存儲器的數據寬度:此時FSMC將AHB操作分割成幾個連續的較小數據寬度的存儲器操作,以適應外部設備的數據寬度(如:我們擴展的SRAM的數據寬度是16位的,如果我們要寫入或者讀出32位的數據,則FSMC外設會自動讀取或寫入2次16位的數據)
- AHB操作的數據寬度小于存儲器的數據寬度: 依據外部設備的類型,異步的數據傳輸有可能不一致。
1.與具有字節選擇功能的存儲器(SRAM、ROM、PSRAM等)進行異步傳輸時,FSMC執行讀寫操作并通過它的字節通道BL[1:0]訪問正確的數據的。(與我們要擴展的SRAM16數據寬度對應,當我們要只讀寫一個字節的內容時我們只需通過UB與LB來控制訪問高低字節的目的)
2.與不具有字節選擇功能的存儲器(NOR和16位NAND等)進行異步傳輸時,即需要對16位寬的閃存存儲器進行字節訪問;顯然不能對存儲器進行字節模式訪問(只允許16位的數據傳輸),因此:
a. 不允許進行寫操作(只能寫入16位的數據,不能寫入8位數據)
b. 可以進行讀操作(控制器讀出完整的16位存儲器數據,只使用需要的字節)。
2.FSMC 的地址映射
從FSMC的角度看,可以把外部存儲器劃分為固定大小為256M字節的四個存儲塊。
● 存儲塊1用于訪問最多4個NOR閃存或PSRAM存儲設備。這個存儲區被劃分為4個NOR/PSRAM區并有4個專用的片選。
● 存儲塊2和3用于訪問NAND閃存設備,每個存儲塊連接一個NAND閃存。
● 存儲塊4用于訪問PC卡設備
每一個存儲塊上的存儲器類型是由用戶在配置寄存器中定義的。
使用 FSMC 外接存儲器時,其存儲單元是映射到 STM32 的內部尋址空間的;在程序里,定義一個指向這些地址的指針,然后就可以通過指針直接修改該存儲單元的內容,FSMC 外設會自動完成數據訪問過程,讀寫命令之類的操作不需要程序控制。FSMC的地址映射見圖 FSMC 的地址映射。
FSMC 把整個 External RAM 存儲區域分成了 4 個 Bank 區域,并分配了地址范圍及適用的存儲器類型,如 NOR 及 SRAM 存儲器只能使用 Bank1 的地址。
所以接線接到哪個片選區,讀寫操作時必須操作該區對應的地址,假設這里SRAM芯片片選接到了區3,則操作的地址范圍為:0x6800 0000 – 0x6BFF FFFF。
在每個 Bank 的內部又分成了 4 個小塊,每個小塊有相應的控制引腳用于連接片選信號,FSMC_NE[4:1] 信號線可用于選擇 BANK1 內部的 4 小塊地址區域,見圖 Bank1 內部的小塊地址分配 ,當 STM32 訪問 0x68000000-0x6BFFFFFF地址空間時,會訪問到 Bank1 的第 3 小塊區域,相應的 FSMC_NE3 信號線會輸出控制信號(信號線自動拉低(SRAM片選有效此時就可以傳輸數據了))。
如何選擇存儲塊區域
HADDR[25:0]包含外部存儲器地址。HADDR是字節地址,而存儲器訪問不都是按字節訪問,因此接到存儲器的地址線依存儲器的數據寬度有所不同,如下表:
3.FSMC 控制 SRAM 的時序
FSMC與SRAM讀取時序配置
FSMC的時鐘等于HCLK=72MHZ,則一個時鐘周期為1/72M=13.8ns
**根據 FSMC 配置表達式的配置要求把時間單位 1/72 微秒 (即 1000/72 納秒=13.8ns) 代入,
可求得 ADDSET= 0,DATAST=1 時即可符合要求。
如:
tRC=ADDSET+1+DATAST+1+2 =( 0+1+1+1+2 )13.8 = 69 ns > 55 ns
tDOE=DATAST+1 = (1+1)13.8 = 27.7 > 25 ns
不過,經實驗總結出該配置在連續讀取多個數據的時候會出現問題,更正確的配置為 ADDSET=0,DATAST=2
FSMC與SRAM寫操作時序配置
其實就是相當于發送數據方產生的時序能確保數據接收方能接收到數據。
**根據 FSMC 配置表達式的配置要求把時間單位 1/72 微秒 (即13.8ns) 代入
可求得
ADDSET= 0,DATAST=2 時即可符合要求。如:
tWC = ADDSET+1+DATAST+1 =( 0+1+2+1 )13.8 = 55.2 ns > 55 ns
tPWB = DATAST+1 = (2+1) 13.8 = 41.4 > 40 ns
四.初始化結構體
1.SRAM 時序結構體
紅框框住的才是用到的,其他成員變量可以不管
這個結構體成員定義的都是 SRAM 讀寫時序中的各項時間參數,這些成員的的參數都與FSMC_BRT 及 FSMC_BWTR 寄存器配置對應,各個成員介紹如下:
(1) FSMC_AddressSetupTime
本成員設置地址建立時間,即 FSMC 讀寫時序圖 FSMC 模式 A 的讀時序 中的 ADDSET值,它可以被設置為 0-0xF 個 HCLK 周期數,按 STM32 標準庫的默認配置,HCLK 的時鐘頻率為 72MHz,即一個 HCLK 周期為 13.8ns。
(2) FSMC_DataSetupTime
本成員設置數據建立時間,即 FSMC 讀寫時序圖 FSMC 模式 A 的寫時序 中的 DATAST值,它可以被設置為 0-0xF 個 HCLK 周期數。
(3) FSMC_AccessMode
本成員設置存儲器訪問模式,不同的模式下 FSMC 訪問存儲器地址時引腳輸出的時序不一樣,可選 FSMC_AccessMode_A/B/C/D 模式。一般來說控制 SRAM 時使用 A 模式。
下面的成員變量沒有用到
(4) FSMC_AddressHoldTime
本成員設置地址保持時間,它可以被設置為 0-0xF 個 HCLK 周期數。
(5) FSMC_BusTurnAroundDuration
本成員設置總線轉換周期,在 NOR FLASH 存儲器中,地址線與數據線可以分時復用,總線轉換周期就是指總線在這兩種狀態間切換需要的延時,防止沖突。控制其它存儲器時這個參數無效,配置為 0 即可。
(6) FSMC_CLKDivision
本成員用于設置時鐘分頻,它以 HCLK 時鐘作為輸入,經過 FSMC_CLKDivision 分頻后輸出到 FSMC_CLK 引腳作為通訊使用的同步時鐘。控制其它異步通訊的存儲器時
這個參數無效,配置為 0 即可。
(7) FSMC_DataLatency
本成員設置數據保持時間,它表示在讀取第一個數據之前要等待的周期數,該周期指同步時鐘的周期,本參數僅用于同步 NOR FLASH 類型的存儲器,控制其它類型的存儲器時,本參數無效。
這個 FSMC_NORSRAMTimingInitTypeDef 時序結構體配置的延時參數,指向該結構體的指針變量將作為下一節的 FSMCSRAM 初始化結構體的一個成員。
對結構體指針不熟的請參考-》《結構體詳解》
2.SRAM 初始化結構體
紅框框住的才是用到的,其他成員變量可以不管
(1) FSMC_Bank
本成員用于選擇 FSMC 映射的存儲區域,它的可選參數以及相應的內核地址映射范,其實就是選擇對應的寄存器。
(2) FSMC_MemoryType
本成員用于設置要控制的存儲器類型,它支持控制的存儲器類型為 SRAM、PSRAM以及 NOR FLASH(FSMC_MemoryType_SRAM/PSRAM/NOR)。
(3) FSMC_MemoryDataWidth
本 成 員 用 于 設 置 要 控 制 的 存 儲 器 的 數 據 寬
度, 可 選 擇 設 置 成 8 或 16 位(FSMC_MemoryDataWidth_8b /16b)。
(4) FSMC_WriteOperation
這個成員用于設置是否寫使能 (FSMC_WriteOperation_ Enable /Disable),禁止寫使能的話 FSMC 只能從存儲器中讀取數據,不能寫入。
(5) FSMC_ExtendedMode
本成員用于設置是否使用擴展模式 (FSMC_ExtendedMode_Enable/Disable),在非擴展模式下,對存儲器讀寫的時序都只使用 FSMC_BCR 寄存器中的配置,即下面的FSMC_ReadWriteTimingStruct 結構體成員;在擴展模式下,對存儲器的讀寫時序可以分開配置,讀時序使用 FSMC_BCR 寄存器,寫時序使用 FSMC_BWTR 寄存器的配置,即下面的 FSMC_WriteTimingStruct 結構體。
(6) FSMC_ReadWriteTimingStruct
本 成 員 是 一 個結構體指針變量, 賦 值 時 使 用 上 一 小 節 中 講 解 的 時 序 結 構 體FSMC_NORSRAMInitTypeDef 設置,當不使用擴展模式時,讀寫時序都使用本成員的參數配置。(將結構體變量的地址賦值給這個成員就好了)
(7) FSMC_WriteTimingStruct
同樣地,本成員也是一個時序結構體的指針,只有當使用擴展模式時,本配置才有效,它是寫操作使用的時序。
下面的成員變量沒有用到
(8) FSMC_DataAddressMux
本成員用于設置地址總線與數據總線是否復用 (FSMC_DataAddressMux_Enable /Disable),在控制 NOR FLASH 時,可以地址總線與數據總線可以分時復用,以減少使用STM32 信號線的數量(9) FSMC_BurstAccessMode
本成員用于設置是否使用突發訪問模式 (FSMC_BurstAccessMode_Enable/Disable),突
發訪問模式是指發送一個地址后連續訪問多個數據,非突發模式下每訪問一個數據都需要輸入一個地址,僅在控制同步類型的存儲器時才能使用突發模式。
(10) FSMC_AsynchronousWait
本 成 員 用 于 設 置 是 否 使 能 在 同 步 傳 輸 時 使 用 的 等 待 信 號
(FSMC_AsynchronousWait_Enable/Disable), 在 控 制 同 步 類 型 的 NOR 或 PSRAM時,存儲器可以使用 FSMC_NWAIT 引腳通知 STM32 需要等待。
(11) FSMC_WaitSignalPolarity本成員用于設置等待信號的有效極性,即要求等待時,使用高電平還是低電平(FSMC_WaitSignalPolarity_High/Low)。
(12) FSMC_WrapMode
本成員用于設置是否支持把非對齊的 AHB 突發操作分割成 2 次線性操作
(FSMC_WrapMode_Enable/Disable),該配置僅在突發模式下有效。
(13) FSMC_WaitSignalActive
本 成 員 用 于 配 置 在 突 發 傳 輸 模 式 時, 決 定 存 儲 器 是 在 等 待
狀 態 之 前 的 一 個 數 據 周 期 有 效 還 是 在 等 待 狀 態 期 間 有 效
(FSMC_WaitSignalActive_BeforeWaitState/DuringWaitState)。
(14) FSMC_WaitSignal
本成員用于設置當存儲器處于突發傳輸模式時,是否允許通過 NWAIT 信號插入等待狀態 (FSMC_WaitSignal_Enable/Disable)。
2.程序源碼分析
void FSMC_SRAM_Init(void) { FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef readWriteTiming;/*初始化SRAM相關的GPIO*/SRAM_GPIO_Config();/*使能FSMC外設時鐘*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);/*-----------------------SRAM 時序結構體-----------------------*///地址建立時間(ADDSET)為1個HCLK 1/72M=14nsreadWriteTiming.FSMC_AddressSetupTime = 0x00; //數據保持時間(DATAST)+ 1個HCLK = 3/72M=42ns(對EM的SRAM芯片) readWriteTiming.FSMC_DataSetupTime = 0x02; //選擇匹配SRAM的模式readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; /*-----------------------下面成員未用到-----------------------*///地址保持時間(ADDHLD)模式A未用到readWriteTiming.FSMC_AddressHoldTime = 0x00; //設置總線轉換周期,僅用于復用模式的NOR操作readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;//設置時鐘分頻,僅用于同步類型的存儲器readWriteTiming.FSMC_CLKDivision = 0x00; //數據保持時間,僅用于同步型的NORreadWriteTiming.FSMC_DataLatency = 0x00; /*-----------------------SRAM 初始化結構體-----------------------*/// 選擇FSMC映射的存儲區域: Bank1 sram3FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;//設置要控制的存儲器類型:SRAM類型FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM; //存儲器數據寬度:16位FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; //存儲器寫使能 FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;// 不使用擴展模式,讀寫使用相同的時序FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;//讀寫時序配置FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;//讀寫同樣時序,使用擴展模式時這個配置才有效FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming;/*-----------------------下面成員未用到-----------------------*///設置地址總線與數據總線是否復用,僅用于NORFSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; //設置是否使用突發訪問模式,僅用于同步類型的存儲器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_WaitSignal = FSMC_WaitSignal_Disable; //突發寫操作FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); // 使能BANK }在ST官方庫提供的的寄存器定義里面,并沒有定義FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx等這個單獨的寄存器,而是將他們進行了一些組合。規律如下:
FSMC_BCRx和FSMC_BTRx,組合成BTCR[8]寄存器組,他們的對應關系如下:
BTCR[0]對應FSMC_BCR1,BTCR[1]對應FSMC_BTR1
BTCR[2]對應FSMC_BCR2,BTCR[3]對應FSMC_BTR2
BTCR[4]對應FSMC_BCR3,BTCR[5]對應FSMC_BTR3
BTCR[6]對應FSMC_BCR4,BTCR[7]對應FSMC_BTR4
FSMC_BWTRx則組合成BWTR[7],他們的對應關系如下:
BWTR[0]對應FSMC_BWTR1,BWTR[2]對應FSMC_BWTR2,
BWTR[4]對應FSMC_BWTR3,BWTR[6]對應FSMC_BWTR4,
BWTR[1]、BWTR[3]和BWTR[5]保留,沒有用到。
另外結構體初始化函數結合寄存器去看源碼就很清楚了
總結
以上是生活随笔為你收集整理的STM32FSMC扩展SRAM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: App2sd功能和Asec文件
- 下一篇: 基于VHDL移位寄存器程序设计