摘要:玩單片機(jī)的難免要和內(nèi)存和屏幕打交道,那就不得不說一下FSMC,掌握了他基本你就知道單片機(jī)是如何與他們進(jìn)行通訊的了。本文較長因此分了兩篇文章來說明,如有不同意見請?jiān)谠u論區(qū)留言。
一、概述
STM32控制器芯片內(nèi)部有一定大小的SRAM及FLASH作為內(nèi)存和程序存儲空間,但當(dāng)程序較大,內(nèi)存和程序空間不足時,就需要在 STM32芯片的外部擴(kuò)展存儲器了。
擴(kuò)展內(nèi)存時一般使用SRAM和SDRAM存儲器,但STM32F407系列的芯片不支持?jǐn)U展 SDRAM(STM32F429系列支持),它僅支持使用FSMC外設(shè)擴(kuò)展 SRAM,我們以SRAM為例講解如何為STM32擴(kuò)展內(nèi)存。
給STM32芯片擴(kuò)展內(nèi)存與給PC擴(kuò)展內(nèi)存的原理是一樣的,只是PC上一般以內(nèi)存條的形式擴(kuò)展,內(nèi)存條實(shí)質(zhì)是由多個內(nèi)存顆粒(即SRAM芯片)組成的通用標(biāo)準(zhǔn)模塊,而STM32直接與SRAM 芯片連接。
二、SRAM的簡介
大家都知道,當(dāng)電腦運(yùn)行比較卡的時候,我們可以通過給電腦加裝內(nèi)存條來改善電腦的性能。那么號稱微型計(jì)算機(jī)的單片機(jī)能不能像電腦一樣加裝內(nèi)存條呢?裝內(nèi)存條倒是不行,但是我們可以給單片機(jī)外加和內(nèi)存條效果一樣的SRAM來提升單片機(jī)的性能。下面以STM32F407ZGT6單片機(jī)來講解一下來擴(kuò)展外部SRAM。
原理:給STM32芯片擴(kuò)展內(nèi)存與給PC擴(kuò)展內(nèi)存的原理是一樣的,只是PC上一般以內(nèi)存條的形式擴(kuò)展,內(nèi)存條實(shí)質(zhì)是由多個內(nèi)存顆粒(即SRAM芯片)組成的通用標(biāo)準(zhǔn)模塊,而STM32直接與SRAM芯片連接。
SRAM,型號IS62WV51216,管腳圖如下:
一種 SRAM 芯片的內(nèi)部結(jié)構(gòu)框圖
IS62WV51216的管腳總的來說大致分為:電源線、地線、地址線、數(shù)據(jù)線、片選線、寫使能端、讀使能端和數(shù)據(jù)掩碼信號線。
數(shù)據(jù)手冊截圖,原汁原味
什么是數(shù)據(jù)掩碼信號呢UB#和LB#?
用UB#或LB#線控制數(shù)據(jù)寬度,例如,當(dāng)要訪問寬度為16位的數(shù)據(jù)時,使用行地址線指出地址,然后把UB#和LB#線都設(shè)置為低電平,那么 I/O0-I/O15線都有效,它們一起輸出該地址的16位數(shù)據(jù)(或者接收16位數(shù)據(jù)到該地址);當(dāng)要訪問寬度為 8位的數(shù)據(jù)時,使用行地址線指出地址,然后把UB#或LB#其中一個設(shè)置為低電平,I/O會對應(yīng)輸出該地址的高8位和低8位數(shù)據(jù),因此它們被稱為數(shù)據(jù)掩碼信號。如果不太明白接著往下看。
因?yàn)镮S62WV51216是有LB和UB引腳的,可以控制字節(jié)的有效性,所以編程操作的時候我們是可以進(jìn)行任意字節(jié)位寬的數(shù)據(jù)操作的。如果換作其他不支持字節(jié)通道訪問的芯片的話,那就需要對齊芯片的數(shù)據(jù)位寬進(jìn)行數(shù)據(jù)操作了。在網(wǎng)上查資料時看到有人問“在操作不同的數(shù)據(jù)位寬時,F(xiàn)SMC_NBL1,F(xiàn)SMC_NBL0是受什么控制輸出高低電平給UB,LB的?”,這個應(yīng)該是屬于硬件自動實(shí)現(xiàn)的,是FSMC的硬件機(jī)制。
從這個圖中我們可以看出IS62WV51216有19根地址線和16根數(shù)據(jù)線,從這些數(shù)據(jù)中我們可以分析出IS62WV51216的存儲大小為1M,那么這個1M是怎么分析出來的呢?我們得來說說IS62WV51216的存儲原理。首先,我們來談一談一般的RAM的存儲原理。
CPU編址以字節(jié)(8bit)為單位。存儲器編址:以其位寬為單位,也就是說每個存儲器地址下的數(shù)據(jù)位數(shù)為位寬。芯片有19根數(shù)據(jù)線,那么它的芯片的可尋址空間大小就是2^19=254288=512K,又因?yàn)樗臄?shù)據(jù)位寬位16(16根數(shù)據(jù)線),所以這個芯片的容量位512KB*16bit=8192Kbit=1024KByte=1MByte。
2.1 RAM的存儲原理
RAM是“Random Access Memory”的縮寫,被譯為隨機(jī)存儲器。所謂隨機(jī)存取,指的是當(dāng)存儲器中的消息被讀取或?qū)懭霑r,所需要的時間與這段信息所在的位置無關(guān)。根據(jù) RAM的存儲機(jī)制,又分為動態(tài)隨機(jī)存儲器 DRAM(Dynamic RAM)以及靜態(tài)隨機(jī)存儲器 SRAM(Static RAM)兩種。不管是DRAM還是SRAM他們都是在RAM前面加了一個頭而已。
2.2 靜態(tài)隨機(jī)存儲器SRAM
靜態(tài)隨機(jī)存儲器SRAM(Static RAM)顧名思義電路結(jié)構(gòu)不需要定時刷新充電,就能保持狀態(tài)(當(dāng)然,如果斷電了,數(shù)據(jù)還是會丟失的),因?yàn)椴恍枰〞r刷心充電,所以SRAM的存儲單元以鎖存器來存儲數(shù)據(jù),這種存儲器被稱為“靜態(tài)(Static)”RAM。
2.3 動態(tài)隨機(jī)存儲器DRAM
而動態(tài)隨機(jī)存儲器DRAM(Dynamic RAM)顧名思義電路結(jié)構(gòu)是需要定時刷新充電,因?yàn)樾枰〞r刷心充電所以DRAM的存儲單元以電容的電荷來表示數(shù)據(jù),這種存儲器被稱為“動態(tài)(Dynamic)”RAM。
SRAM的存儲單元 | ? |
DRAM的存儲單元 |
從他們的存儲單元的結(jié)構(gòu)圖我們就知道DRAM的結(jié)構(gòu)比SRAM的結(jié)構(gòu)簡單的多,所以所以生產(chǎn)相同容量的存儲器,DRAM 的成本要更低,且集成度更高。而DRAM中的電容結(jié)構(gòu)則決定了它的存取速度不如SRAM。這種結(jié)論是不需要死記硬背的,看結(jié)構(gòu)圖就知道了。
但是我們可能還聽說過SDRAM,我們把它叫做同步動態(tài)隨機(jī)存儲器SDRAM(Synchronous DRAM),同步顧名思義就是利用時鐘進(jìn)行同步的通訊時序,它在時鐘的上升沿表示有效數(shù)據(jù)。
2.4 SRAM的存儲模型
SRAM 存儲陣列模型
SRAM的存儲模型我們可以用矩陣來說明:
SRAM內(nèi)部包含的存儲陣列,可以把它理解成一張表格,數(shù)據(jù)就填在這張表格上。和表格查找一樣,指定一個行地址和列地址,就可以精確地找到目標(biāo)單元格,這是SRAM芯片尋址的基本原理。這樣的每個單元格被稱為存儲單元,而這樣的表則被稱為存儲矩陣。地址譯碼器把N根地址線轉(zhuǎn)換成2的N次方根信號線,每根信號線對應(yīng)一行或一列存儲單元,通過地址線找到具體的存儲單元,實(shí)現(xiàn)尋址。如果存儲陣列比較大,地址線會分成行和列地址,或者行、列分時復(fù)用同一地址總線,訪問數(shù)據(jù)尋址時先用地址線傳輸行地址再傳輸列地址。
但是呢?你會發(fā)現(xiàn),這個原理好像不太適用于IS62WV51216,為什么呢?
其實(shí)不然,因?yàn)槲覀兪褂玫腟RAM比較小(IS62WV51216容量是1MB),IS62WV51216沒有列地址線。它只有19根行地址線,那么,我們就可以這么來解釋:IS62WV51216有16根數(shù)據(jù)線,也就是說它的數(shù)據(jù)寬度為16位,一個行地址也就對應(yīng)16位,即一個行地址對應(yīng) 2字節(jié)空間。
好,那現(xiàn)在來計(jì)算一下IS62WV51216有多少個行地址。2的19次方等于512K,在512K的基礎(chǔ)之上在乘我們之前計(jì)算的2字節(jié),不正好是1024K,也就是1M嗎?1M后面的單位是B,即Byte,而不是Bit哦。這樣的話你就會發(fā)現(xiàn)IS62WV51216這個名字中本身就包含了大量的信息:IS62WV51216共有512K個行地址,數(shù)據(jù)寬度為16位,再加以計(jì)算就可以得到它的存儲大小為1M啦,有趣吧!另外,該芯片支持兩種不同的高速訪問時間,分別為45ns和55ns,該時間表示進(jìn)行一次數(shù)據(jù)讀寫的最短時間要求,本文選擇55ns的模式。
2.5 通信方式
異步通訊,無須時鐘,無須刷新,與STM32F407單片機(jī)通過FSMC接口相連。
SRAM的讀寫流程
數(shù)據(jù)手冊上的SRAM 的讀時序 | ? |
翻譯過來的SRAM 的讀時序 |
數(shù)據(jù)手冊上的SRAM 的寫時序 | ? |
翻譯過來的SRAM 的寫時序 |
讀寫時序的流程很類似,下面我們統(tǒng)一解說:
(1) 主機(jī)使用地址信號線發(fā)出要訪問的存儲器目標(biāo)地址;
(2) 控制片選信號 CS1#及 CS2#使能存儲器芯片;
(3) 若是要進(jìn)行讀操作,則控制讀使能信號OE#表示要讀數(shù)據(jù),若進(jìn)行寫操作則控制寫使能信號 WE#表示要寫數(shù)據(jù);
(4) 使用掩碼信號LB#與UB#指示要訪問目標(biāo)地址的高、低字節(jié)部分;
(5) 若是讀取過程,存儲器會通過數(shù)據(jù)線向主機(jī)輸出目標(biāo)數(shù)據(jù),若是寫入過程,主要使用數(shù)據(jù)線向存儲器傳輸目標(biāo)數(shù)據(jù)。
在讀寫時序中,有幾個比較重要的時間參數(shù),在使用 STM32 控制的時候需要參考。
IS62WV51216BLL-55ns型號SRAM的時間參數(shù)
三、FSMC簡介
FSMC的本質(zhì)就是內(nèi)核想要訪問存儲器,但是內(nèi)核不能生成硬件時序,F(xiàn)SMC外設(shè)就幫忙做了這個硬件時序這個事情。有了這個外設(shè)我們操作外部SRAM就不需要自己在那里寫讀寫時序了,F(xiàn)SMC就幫我們解決了。怎么解決的?它有各種寄存器結(jié)構(gòu)體啊,直接按照要求配置就可以了。
STM32F407或STM32F417系列芯片都帶有FSMC接口,F(xiàn)SMC,即靈活的靜態(tài)存儲控制器,能夠與同步或異步存儲器和16位PC存儲器卡連接,STM32F4的FSMC 接口支持包括SRAM、NAND FLASH、NOR FLASH和 PSRAM 等存儲器。
**注意:FSMC不能驅(qū)動如SDRAM 這種動態(tài)的存儲器,而在STM32F429系列的控制器中,它具有FMC外設(shè),支持控制 SDRAM 存儲器**。其他我們不用管,從上面我們可以總結(jié)的是,STM32雇傭FSMC這個管家來管理我們的IS62WV51216。來來來,我們來看看FSMC的廬山真面目:
FSMC 的框圖如圖所示:
FSMC時鐘來源
FSMC—STM32F4XX參考手冊
FSMC—STM32F4XX參考手冊
蒙了吧!又是這么多信號線,不要怕,我們還是來總結(jié)歸納下。我們FSMC控制SRAM為例來說明:通過查看STM32F407xx參考手冊。
外部存儲器接口信號—STM32F4xx參考手冊
上圖打碼的地方是PSRAM偽靜態(tài)隨機(jī)存儲器的引腳,不需要理會,只需要看SRAM的部分即可。
你會發(fā)現(xiàn)居然和SRAM中的線居然高度統(tǒng)一(那是當(dāng)然喏,我們就是講的FSMC嘛?。?/p>
1、FSMC_NBL[1]、FSMC_NBL[0]分別對應(yīng)于LBn、UBn,有什么用呢?提供數(shù)據(jù)掩碼信號。貝體是怎么回事昵?還記得前面提到的行地址線嗎?
一根行地址線對應(yīng)16位的數(shù)據(jù),我們可以把16位的數(shù)據(jù)分為高字節(jié)和低字節(jié)。當(dāng)要訪問寬度為16位的數(shù)據(jù)時,使用行地址線指出地址,然后把UBn(n表示低電平有效)和LBn線都設(shè)置為低電平(FSMC_NBL0和 FSMC_NBL為低電平),那么I/O0-I/O15線(FSMC_D0到 FSMC_D15)都有效,它們一起輸出該地址的16位數(shù)據(jù)(或者接收16位數(shù)據(jù)到該地址);當(dāng)要訪問寬度為8位的數(shù)據(jù)時,使用行地址線指出地址,然后把UBn(FSMC_NBL0)設(shè)置為低電平,I/O0-I/O15(FSMC_D8到 FSMC_D15)會對應(yīng)輸出該地址的高8位,l/O0-I/O7的信號無效(或者把LBn(FSMC_NBL1)設(shè)置為低電平,I/O0-/O7(FSMC_D0到SMCD7)會對應(yīng)輸出該地址的低8位,I/O8-/I/O15的信號無效。這樣是不是有部分信號沒有用呢?好像被掩蓋了。因此它們被稱為數(shù)據(jù)掩碼信號。
要注意的是FSMC_NBL[1]、FSMC_NBL[0]分別對應(yīng)于LBn、UBn,這兩個引腳的電平不是我們用程序控制的,如果用程序控制就太麻煩了,這兩個引腳應(yīng)該是FSMC的內(nèi)部硬件機(jī)制完成的,不需要我們?nèi)藶椴僮鳌?/p>
2、FSMC_NE[1:4]是個很有趣的東西,它決定了FSMC可以控制多個存儲器。這里就要提及FSMC的地址映射啦!
FSMC存儲區(qū)域—STM32F4XX參考手冊
首先,有一點(diǎn)我們必須明白,對于32位的STM32單片機(jī)來說,它能夠管理的地址大小為4GB,而STM32將4GB的地址空間中的0X60000到0X9FFFF共1GB的空間分給外部內(nèi)存,所以這1GB的空間就成了我們的小天地,供我們自由玩耍。
STM32F407數(shù)據(jù)手冊英文版—MemoryMap
野火407手冊
STM32F417數(shù)據(jù)手冊—中文版
然后強(qiáng)勢的FSMC就接管了這1GB的空間,F(xiàn)SMC將圖中的1GB大小的外部RAM存儲區(qū)域分成了4個Bank區(qū)域,每個Bank對應(yīng)于STM32內(nèi)部尋址空間的不同地址范圍。
那么為什么要分為不同的Bank區(qū)域呢?
因?yàn)椴煌腂ank可以來管理不同的外部存儲設(shè)備,比如NOR_Flash及SRAM存儲器只能使用Bank1的地址,NAND_Flash存儲器只能使用Bank2和Bank3的地址等。
細(xì)心的你肯定還會發(fā)現(xiàn),每個Bank中居然還有4x64MB這種文宇,這是什么意思呢?
FSMC存儲區(qū)域—STM32F4XX參考手冊
Bank內(nèi)部的256MB空間又被分成4個小塊,每塊64M,各自有相應(yīng)的控制引腳用于連接片選信號。FSMC_NE[4:1]信號線就分別對應(yīng)圖中的 FSMC bank1 NOR/PSRAM4到FSMC bank1 NOR/PSRAM1。當(dāng)STM32訪問0×6800000—0x6BFFF址空間時,會訪問到Bank1的第3小塊區(qū)域:FSMC bank1 NOR/PSRAM3,相應(yīng)的FSMC_NE3信號線會輸出控制信號(即片選信號),如果這個時候FSMC_NE3處剛好接上IS62WV51216的CS端,那么IS62WV51216就可以任由我們擺布啦。因此,對于你使IS62WV51216來說,一定要注意你的CS端是接的FSMC的哪個FSMC_NE端,這決定你在程序訪問哪個地址范圍。
STM32F4 的 FSMC 存儲塊 1(Bank1)被分為 4 個區(qū),每個區(qū)管理64M 字節(jié)空間,每個區(qū)都有獨(dú)立的寄存器對所連接的存儲器進(jìn)行配置。Bank1 的 256M 字節(jié)空間由28根地址線(HADDR[27:0])尋址。
為什么是28根地址線?因?yàn)?^28=268435456B=262144KB=256MB,正好管理這Bank1的256M 字節(jié)空間。
當(dāng)Bank1接的是16位寬度存儲器的時候:HADDR[25:1]→FSMC_A[24:0]。當(dāng)Bank1接的是8位寬度存儲器的時候:HADDR[25:0]→ FSMC_A[25:0]。不論外部接8位/16位寬設(shè)備,F(xiàn)SMC_A0永遠(yuǎn)接在外部設(shè)備地址A[0]。
這里感覺很不好理解,簡單地分析如下:
對于16位SRAM,F(xiàn)SMC地址線要向右移一位(非常重要)。
以0x6800 0000這個地址為例,它分解成二進(jìn)制是0110 1000 0000 0000 0000 0000 0000 0000,由于一個BANK是64M的地址空間,而2^25=64M,故0x6800 0000的位[25:0]是FSMC向外部SRAM傳遞的真實(shí)地址,對于0x6800 0000,F(xiàn)SMC向外部SRAM發(fā)的地址是位[25:0],即00 0000 0000 0000 0000 0000 0000,這很好理解。
同理,對于0x6800 0002,F(xiàn)SMC向外部SRAM發(fā)送的地址是00 00000000 0000 0000 0000 0010。若FSMC不自動右移一位,這個地址明顯發(fā)錯了,因?yàn)槠谕x取的SRAM地址為0x0000 0001中的數(shù)據(jù)。
為了解決這一問題,當(dāng)在初始化FSMC時,若選擇外部SRAM為16位,則FSMC在向外部SRAM發(fā)地址時,會自動右移一位,例如剛才的0x6800 0002,F(xiàn)SMC在向外部發(fā)SRAM地址時,00 0000 0000 0000 0000 0000 0010會自動右移一位,變成00 0000 00000000 0000 0000 0001,即0x0000 0001,該地址正好是期望的外部SRAM地址。接著,外部SRAM從地址為0x0000 0001中取出16位數(shù)據(jù)傳送給FSMC,由FSMC將這個16位數(shù)據(jù)保存在以映射地址0x6800 0002起始的兩個8位存儲單元中。
地址映射如下:
這樣的話,當(dāng)16位數(shù)據(jù)寬度時,地址的問題解決了,還有一個問題,是往高字節(jié)寫入還是低字節(jié)寫入呢?
這也就是NBL0和NBL1的作用了,如果你要進(jìn)行字節(jié)操作 :如stm32發(fā)送地址0x0001讀取一個字節(jié)。右移一位對應(yīng)的是sram地址0x0000處的16位數(shù)據(jù), FSMC會根據(jù)A0(最后一根地址線)來控制NBL0和NBL1。當(dāng)A0 = 1時,讀取高字節(jié)數(shù)據(jù)(僅NBL1有效);A0 = 0時,讀取低字節(jié)數(shù)據(jù)僅NBL0有效),當(dāng)進(jìn)行16位讀寫時,NBL0和NBL1都有效。
經(jīng)過了上面的分析,再來重新觀察數(shù)據(jù)的寫入過程:
當(dāng)?shù)刂窞?x6800 ?0000,會訪問到SRAM的第0個16位地址,而此時A0 = 0(低字節(jié)有效),實(shí)際會訪問的是16位 0地址的低字節(jié);當(dāng)?shù)刂窞?x6800 ?0001時,A0 = 1,訪問16位 0地址的高字節(jié)。依次。
因此,想讓地址線的最后一位產(chǎn)生0或1,應(yīng)該在前一位做出改變(stm32會自動右移):
我們的SRAM芯片使用的是Bank1 的第三個區(qū),即使用FSMC_NE3來連接外部設(shè)備的時候,即對應(yīng)了HADDR[27:26]=10(這是內(nèi)部硬件配置,不需要我們管),我們要做的就是配置對應(yīng)第3區(qū)的寄存器組,來適應(yīng)外部設(shè)備即可。
STM32F4的FSMC各Bank配置寄存器如下表
STM32的FSMC存儲塊1支持的異步突發(fā)訪問模式包括:模式1、模式A~D等多種時序模型,驅(qū)動SRAM時一般使用模式1或者模式A,這里我們使用模式A來驅(qū)動SRAM用,其他模式說明詳見:STM32中文參考手冊-FSMC章節(jié)。
FSMC外設(shè)支持輸出多種不同的時序以便于控制不同的存儲器,它具有 ABCD 四種模式,下面我們僅針對控制 SRAM 使用的模式 A進(jìn)行講解。
模式A讀時序
模式A寫時序
對于NOR FLASH/PSRAM(包括SRAM)控制器(存儲塊1),通過FSMC_BCRX、FSMC_BTRX和FSMCBWTRx寄存器設(shè)置(其中x=1~4,對應(yīng)4個區(qū))。由于我們硬件是把blank的第三個區(qū)給外部SRAM使用,所以對于SRAM芯片的片選引腳為FSMC_NE3。所以就要配置FSMC_BCR3、FSMC_BTR3和FSMCBWTR3這3個寄存器。正點(diǎn)原子F407板子的SRAM的片選引腳是FSMC_NE3,LCD顯存芯片的片選引腳是FSMC_NE4。
原子的F407的SRAM是blank NE3 LCD是blank NE3
野火的F407的SRAM blank NE4 | ? |
野火F407的LCD blank NE3 |
四、SRAM的FSMC寄存器配置
4.1 SRAM/NOR-Flash片選控制寄存器
EXTMOD:擴(kuò)展模式使能位,控制是否允許讀寫不同的時序,需設(shè)置為1。
WREN:寫使能位。我們需要向SRAM寫數(shù)據(jù),故該位必須設(shè)置為1。
MWID[1:0]:存儲器數(shù)據(jù)總線寬度。00,表示8位數(shù)據(jù)模式;01表示16位數(shù)據(jù)模式;10和11保留。我們的SRAM是16位數(shù)據(jù)線,所以設(shè)置WMID[1:0]=01。
MTYP[1:0]:存儲器類型。00表示SRAM、ROM;01表示PSRAM;10表示NOR FLASH;11保留。我們使用SRAM,所以需要設(shè)置MTYP[1:0]=00。
MBKEN:存儲塊使能位。需設(shè)置為1。
STM32F4XX中文參考手冊
4.2 SRAM/NOR-Flash片選時序寄存器
ACCMOD[1:0]:訪問模式。00:模式A;01:模式B;10:模式C;11:模式D。
DATAST[7:0]:數(shù)據(jù)保持時間,等于:DATAST個HCLK時鐘周期,DATAST最大為255。對STM32F1,一個HCLK=13.8ns(1/72M),設(shè)置為15;對STM32F4,一個HCLK=6ns(1/168M),設(shè)置為60。
ADDSET[3:0]:地址建立時間。表示:ADDSET個HCLK周期,ADDSET最大為15。STM32F1的FSMC性能存在問題,即便設(shè)置為0,RD也有190ns的高電平,我們這里設(shè)置為1。而對STM32F4,則設(shè)置為15。
4.3 SRAM/NOR-Flash寫入時序寄存器
ACCMOD[1:0]:訪問模式。00:模式A;01:模式B;10:模式C;11:模式D。
DATASTI7:01:數(shù)據(jù)保持時間,等于:DATAST個HCLK時鐘周期,DATAST最大為255。對ILI9341來說,其實(shí)就是WR低電平持續(xù)時間,為15ns,不過ILI9320等則需要50ns??紤]兼容性,對STM32F1,一個HCLK=13.8ns(1/72M),設(shè)置為3;對STM32F4,一個HCLK=6ns(1/168M),設(shè)置為9。
ADDSET[3:0]:地址建立時間。表示:ADDSET個HCLK周期,ADDSET最大為15。對lL19341來說,這里相當(dāng)于WR高電平持續(xù)時間,為15ns。同樣考慮兼容IL19320,對STM32F1,這里即便設(shè)置為1,WR也有100ns的高電平,我們這里設(shè)置為1。而對STM32F4,則設(shè)置為8。
在MDK的寄存器定義里面,并沒有定義FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx等這個單獨(dú)的寄存器,而是將他們進(jìn)行了一些組合。
FSMC_BCRx和FSMC_BTRx,組合成BTCR[8]寄存器組,他們的對應(yīng)關(guān)系如下:
BTCR[0] 對應(yīng) FSMC_BCR1,BTCR[1] 對應(yīng) FSMC_BTR1BTCR[2] 對應(yīng) FSMC_BCR2,BTCR[3] 對應(yīng) FSMC_BTR2BTCR[4] 對應(yīng) FSMC_BCR3,BTCR[5] 對應(yīng) FSMC_BTR3BTCR[6] 對應(yīng) FSMC_BCR4,BTCR[7] 對應(yīng) FSMC_BTR4
FSMC_BWTRx則組合成BWTR[7],他們的對應(yīng)關(guān)系如下:
BWTR[0]對應(yīng) FSMC_BWTR1,BWTR[2]對應(yīng) FSMC_BWTR2,BWTR[4]對應(yīng) FSMC_BWTR3,BWTR[6]對應(yīng) FSMC_BWTR4,BWTR[1]、BWTR[3]和 BWTR[5]保留,沒有用到。
本篇到此結(jié)束,下一篇將講解FSMC的先關(guān)代碼,并使用STM32CubeMX進(jìn)行配置。
審核編輯:劉清
評論
查看更多