FSMC是Flexible static memory controller(可變靜態(tài)存儲(chǔ)控制器)的簡(jiǎn)稱,是STM32系列采用的一種新型的存儲(chǔ)器擴(kuò)展技術(shù),支持SRAM、Nor Flash、LCD、PSRAM、NAND Flash、PC Card等。只在某些芯片上有,使用前要查看對(duì)應(yīng)的手冊(cè)確定。
在FSMC的角度來看,外部存儲(chǔ)分成了4個(gè)固定的大小為256MB的bank。
Bank1分成了4個(gè)子bank,每一個(gè)64MB大小,并且每個(gè)bank都有獨(dú)立的片選,用來控制Nor Flash、RAM、PSRAM。Bank2和Bank3用來控制NAND Flash。Bank4控制PC Card。
不同的Bank共享了地址、數(shù)據(jù)、讀、寫信號(hào),其他信號(hào)根據(jù)bank的用途不同會(huì)有一些差別。
下面介紹下如何通過FSMC點(diǎn)亮LCD。LCD可以看作是一個(gè)SRAM,通過Bank1控制。理論上支持8080接口的LCD都可以使用FSMC來點(diǎn)亮(不知是否有例外)。LCD有8位或16位接口的,F(xiàn)SMC的設(shè)置需要一致,本文以16位為例。
STM32的設(shè)置使用cubeMX很方便,下面是針對(duì)FSMC的設(shè)置,其他基礎(chǔ)設(shè)置這里就不羅列了。
這里使用了bank1的第四個(gè)子bank,片選是NE4;
內(nèi)存類型是LCD接口;
LCD寄存器選擇為A0,其他A1-A24都可以,這本來是存儲(chǔ)器尋址信號(hào),這里用來接LCD的RS信號(hào),控制LCD是寫命令(低0)還是寫數(shù)據(jù)(高1)。;
數(shù)據(jù)選擇16位。
再往下
寫操作使能;
擴(kuò)展模式Disabled;
地址建立時(shí)間設(shè)置為6;
數(shù)據(jù)建立時(shí)間設(shè)置為6;
總線翻轉(zhuǎn)時(shí)間設(shè)置為0.
上面建立時(shí)間范圍如下表所示,實(shí)際要根據(jù)LCD的時(shí)序確定。
除了上面的配置,別忘了一般LCD還有個(gè)背光控制引腳。
之后生成代碼。(只羅列了變量和函數(shù)內(nèi)容,不是真正的函數(shù))
背光引腳代碼如下:
FSMC的初始化代碼如下:
FSMC的引腳配置
FSMC模式和時(shí)序配置:
到此,F(xiàn)SMC的初始化就搞定了,后邊就可以通過內(nèi)存地址直接控制LCD了。這里有幾個(gè)需要注意的點(diǎn),下面來詳細(xì)說說。
第一, 存儲(chǔ)基地址
bank1的基地址是0x60000000,不同的子bank地址不同,通過HADDR[27:26]這兩位的值確定。我們選擇了第四個(gè),這兩位是11,所以子bank的基地址是
0x60000000+(0x3<<26)=0x6c000000。
第二, 外部存儲(chǔ)地址
HADDR[25:0]存儲(chǔ)了外部存儲(chǔ)器的地址,對(duì)于8位和16位略有差別。
8位用到了HADDR[25:0]的所有位,對(duì)映FSMC_A[25:0]。而16位只用了HADDR[25:1],沒有用HADDR0,所以對(duì)于16位,HADDR[25:1]就對(duì)映了FSMC_A[24:0]。
第三, LCD的數(shù)據(jù)or命令選擇
LCD沒有地址,我們引出的地址線實(shí)際上接到了LCD的RS或者叫D/C引腳上。當(dāng)RS為低,則通過D[15:0]的是命令,當(dāng)RS為高,則通過D[15:0]的是數(shù)據(jù)。上面我們選擇了A0,在16位模式下,寫命令的地址就是0x6c000000(HADDR1為0),寫數(shù)據(jù)的地址就是0x6c000002(HADDR1為1)
(其實(shí)地址不唯一,只要保證HADDR1的0和1準(zhǔn)確就行,其他地址位隨意,但是一般選擇最簡(jiǎn)單或?qū)嵱玫牡刂?,后邊?huì)提到)。
我們?cè)偌僭O(shè)選擇A3,那么寫命令的地址還是0x6c000000(HADDR4為0),寫數(shù)據(jù)的地址是0x6c000010(HADDR4為1)。所以結(jié)論就是,寫命令的地址可以都是0x6c000000,寫數(shù)據(jù)的地址根據(jù)選擇的地址線確定。這是最簡(jiǎn)單的地址。
第四, 巧用結(jié)構(gòu)體,只需定義一個(gè)地址
在很多參考例程中,會(huì)出現(xiàn)下面的實(shí)現(xiàn)方法:
我們都知道結(jié)構(gòu)體是順序排列的,所以LCD_REG的地址是0x6c000000,變量大小是2個(gè)字節(jié)(16位),所以LCD_RAM的地址就是0x6c000002,剛好就是我們選擇A0地址線(HADDR1)拉高的值。
那如果選擇其他地址線,這里就需要做一點(diǎn)變動(dòng)。比如選擇A3,我們逆向操作來解決這個(gè)問題,A3寫數(shù)據(jù)地址是0x6c000010,也就是LCD_RAM的地址。LCD_REG比LCD_RAM小兩個(gè)字節(jié),減2就得到了0x6c00000e,此時(shí)HADDR4為0,那這個(gè)就是我們需要的LCD基地址,因?yàn)橹挥羞@個(gè)值加2后會(huì)變成寫數(shù)據(jù)的地址,這就是那個(gè)實(shí)用的地址。
操作框圖如下圖所示,F(xiàn)SMC初始化好后就跟透明的一樣,只需要往指定的地址送命令或者數(shù)據(jù)即可。類似串口藍(lán)牙的透?jìng)?,一旦設(shè)置配對(duì)好,就可以無視藍(lán)牙的存在。
后面的事情就跟具體的LCD有關(guān)了,比如讀取ID,寫初始化序列等,這里就不多介紹了。
-
lcd
+關(guān)注
關(guān)注
34文章
4520瀏覽量
171495 -
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7649瀏覽量
167319 -
sram
+關(guān)注
關(guān)注
6文章
785瀏覽量
115928 -
STM32
+關(guān)注
關(guān)注
2293文章
11031瀏覽量
364689 -
FSMC
+關(guān)注
關(guān)注
0文章
55瀏覽量
38680
發(fā)布評(píng)論請(qǐng)先 登錄
STM32L433 驅(qū)動(dòng)LCD斷碼屏,怎么單獨(dú)讓某個(gè)數(shù)字閃爍?
STM32L433使用LCD控制器驅(qū)動(dòng)段碼屏,請(qǐng)問有什么LCD降低功耗的方法嗎?
STM32L433VCT6 LCD復(fù)用引腳如何分配?
STM32N657X0Q為什么無法通過SPI驅(qū)動(dòng)st7796板子?

stm32cubumx使用1.28.0固件包無法初始化fsmc怎么解決?
stm32cubumx使用1.28.0固件包無法初始化fsmc怎么解決?

FP7103 高效降壓恒流驅(qū)動(dòng)芯片:內(nèi)置模擬調(diào)光技術(shù),徹底消除 LCD 背光頻閃難題# #LCD顯示
stm32cubumx使用1.28.0固件包無法初始化fsmc怎么解決?
如何通過J-Link實(shí)現(xiàn)STM32H5控制調(diào)試端口

通過STM32CubeMonitor,實(shí)現(xiàn)對(duì)MCU數(shù)據(jù)監(jiān)控

FPGA與STM32通過FSMC總線通信的實(shí)驗(yàn)

基于FPGA的LCD1602液晶顯示模塊驅(qū)動(dòng)設(shè)計(jì)

評(píng)論