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