天天看點

藍橋杯嵌入式學習STM32之FSMC詳解

我剛剛打标題才發現我好像一直打着藍橋杯的名号寫一些和比賽不是很有關的blog。

其實我早就感覺到了,我故意的

才不是為了騙通路量

好了言歸正傳

前排提醒,本BLOG是通過用FSMC控制LCD驅動為例講解,并不是針對FSMC講解

驅動原理

FSMC:靈活的靜态儲存控制器。

以下都是我個人的了解,可能不是很官方準确,但是絕對是人話!!!保證能看懂。

FSMC我感覺是意法半導體公司為了友善使用者使用一些存儲器比如SRAM ,NAND FLASH,NOR FLASH,PSRAM等等。(注意這裡沒有SDRAM,這個好像在4XX型号裡有,反正103沒有就對了。)

說起SDRAM我就想起了那段不好的回憶,當時因為FPGA比賽學這個,一節課睡了三次o( ̄▽ ̄)d~

你看到這裡肯定會想了,MD,LCD又不是存儲器,用個屁FSMC啊?!這個作者為了騙通路量簡直喪盡天良,毫無羞恥心!

錯!

這裡LCD驅動還真能用FSCM,為啥呢?

因為LCD驅動的方式上一篇部落格已經講解過了。讓我們來看看FSMC怎麼驅動SRAM的叭。

FSMC驅動外部SRAM時,外部SRAM的控制一般有:位址線(如A0-A25)、資料線(如D0-D15)、寫信号(WE,即WR)、讀信号(OE,即RD)、片選信号(CS),如果SRAM支援位元組控制,那麼還有UB/LB信号。

你品,你細品!!

來看一下下面的表格

操控LCD需要的信号線 操控SRAM需要的信号線
RS ??
D0-D15 D0-D15
WR WE
RD OE
CS CS

你發現了什麼?發現除了RS沒有對應以外都有了對應。

這時,你可能會說:MD這不是還有一個沒對應?走了走了,騙人的blog。

你沒發現SRAM控制還有位址線沒用麼!這裡有意思的來了,比如我們把RS接在A0上面,那麼當FSMC控制器寫位址0的時候,會使得A0變為0,對TFTLCD來說,就是寫指令。而FSMC寫位址1的時候,A0将會變為1,對TFTLCD來說,就是寫資料了。這樣,就把資料和指令區分開了,他們其實就是對應SRAM操作的兩個連續位址。

這裡LCD就相當于有兩個位址的SRAM!

是以我們可以通過FSMC驅動LCD。

驅動方法

STM32的FSMC将外部存儲器分為4塊。每塊大小為256M位元組

藍橋杯嵌入式學習STM32之FSMC詳解

我們這裡用第一塊。

第一塊裡又被分成四個區…

STM32的FSMC存儲塊1(Bank1)用于驅動NOR FLASH/SRAM/PSRAM,被分為4個區,每個區管理64M位元組空間,每個區都有獨立的寄存器對所連接配接的存儲器進行配置。Bank1的256M位元組空間由28根位址線(HADDR[27:0])尋址。

這裡HADDR,是内部AHB位址總線,其中,HADDR[25:0]來自外部存儲器位址FSMC_A[25:0],而HADDR[26:27]對4個區進行尋址。如下表所示:

藍橋杯嵌入式學習STM32之FSMC詳解

就是說這裡28根位址線前兩根已經固定是用來選擇那個區的了。後面26根給外部存儲器相連。

這裡有一個地方要注意,雖然我也不知道啥意思,但是我查的很多資料都強調了這一點那我也不能例外,這叫專業

不論外部接8位/16位寬裝置,FSMC_A[0]永遠接在外部裝置位址A[0]

下面不是強調的内容啦

當Bank1接的是16位寬度存儲器的時候:HADDR[25:1] -> FSMC_A[24:0]

當Bank1接的是8位寬度存儲器的時候:HADDR[25:0] -> FSMC_A[25:0]

這裡可能就有人要問了,你這8位一一對應我還能了解,你這16位咋要錯位對應啊?

我的了解是這樣子的:

網上說這叫位元組尋址,不知道啥玩意兒

16位存儲器,他每加一相當于加了兩個位元組,而我們内部都是8位的,它加一就加了一個位元組。

16位存儲器 8位存儲器
0001(2位元組) 0010(2位元組)
0010(4位元組) 0100(4位元組)
0011(6位元組) 0110(6位元組)
0100(8位元組) 1000(8位元組)

下面我就不列舉了,發現了沒有,8位向右移一位(也就是除2)數值就和16位一樣了。

是以要保證HADDR[25:0]和FSMC_A[24:0]代表的位元組數一樣的話,就要保證HADDR[25:0]右移一位和FSMC_A[24:0]一樣。也就是HADDR[25:1] -> FSMC_A[24:0]一一對應。

你要是還不了解我就舉個例子。

假如是甲國是16位存儲器,他們這個國家以公斤為機關進行豬肉交易。

乙國是8位存儲器,這個國家以斤為機關進行豬肉交易。

如果雙方要進行貿易往來,交易一堆豬肉。

雙方都量了一下豬肉的重量,要保證交易正确無誤,那麼甲國記錄的豬肉重量(比如200)肯定是乙國記錄的豬肉重量(這裡是400)的一半。因為甲國是200公斤,乙國是400斤。

啊啊啊啊,累死我了,我好久沒寫這樣的部落格了,這個部落格真的是為了教會别人東西而寫的,我以前寫部落格是為我一個人寫的,友善我以後來很快能回憶起知識點,在很多細枝末節上不會解釋很多

寄存器設定

對于NOR FLASH/PSRAM控制器(存儲塊1),通過FSMC_BCRx、FSMC_BTRx和FSMC_BWTRx寄存器設定(其中x=1~4,對應4個區)。通過這3個寄存器,可以設定FSMC通路外部存儲器的時序參數,拓寬了可選用的外部存儲器的速度範圍。

至于那些高低電平的時間參數看LCD的晶片手冊!!(如下)

藍橋杯嵌入式學習STM32之FSMC詳解

SRAM/NOR閃存片選控制寄存器(FSMC_BCRx)

藍橋杯嵌入式學習STM32之FSMC詳解

EXTMOD:擴充模式使能位,控制是否允許讀寫不同的時序,需設定為1

WREN:寫使能位。我們需要向TFTLCD寫資料,故該位必須設定為1

MWID[1:0]:存儲器資料總線寬度。00,表示8位資料模式;01表示16位資料模式;10和11保留。我們的TFTLCD是16位資料線,是以設定WMID[1:0]=01。

MTYP[1:0]:存儲器類型。00表示SRAM、ROM;01表示PSRAM;10表示NOR FLASH;11保留。我們把LCD當成SRAM用,是以需要設定MTYP[1:0]=00。

MBKEN:存儲塊使能位。需設定為1

SRAM/NOR閃存片選時序寄存器(FSMC_BTRx)

藍橋杯嵌入式學習STM32之FSMC詳解

ACCMOD[1:0]:通路模式。00:模式A;01:模式B;10:模式C;11:模式D。 (選A)

DATAST[7:0]:資料保持時間,等于: DATAST+1個HCLK時鐘周期,DATAST最大為255。對ILI9341來說,其實就是RD低電平持續時間,最大為355ns。對STM32F1,一個HCLK=13.8ns (1/72M),設定為15。

ADDSET[3:0]:位址建立時間。表示:ADDSET +1個HCLK周期,ADDSET最大為15。對ILI9341來說,這裡相當于RD高電平持續時間,為90ns。STM32F1的FSMC性能存在問題,即便設定為0,RD也有190ns的高電平,我們這裡設定為1。(F103的性能問題,你退群把你)

如果未設定EXTMOD位,則讀寫共用這個時序寄存器!

SRAM/NOR閃存寫時序寄存器(FSMC_BWTRx)

藍橋杯嵌入式學習STM32之FSMC詳解

ACCMOD[1:0]:通路模式。00:模式A;01:模式B;10:模式C;11:模式D。

DATAST[7:0]:資料保持時間,等于: DATAST+1個HCLK時鐘周期,DATAST最大為255。對ILI9341來說,其實就是WR低電平持續時間,為15ns,不過ILI9320等則需要50ns。考慮相容性,對STM32F1,一個HCLK=13.8ns (1/72M),設定為3。

ADDSET[3:0]:位址建立時間。表示:ADDSET+1個HCLK周期,ADDSET最大為15。對ILI9341來說,這裡相當于WR高電平持續時間,為15ns。同樣考慮相容ILI9320,對STM32F1,這裡即便設定為1,WR也有100ns的高電平,我們這裡設定為1。

其他說明

在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]保留,沒有用到。

繼續閱讀