找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3976|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

對“用FSMC驅(qū)動TFT-LCD”的爛筆頭

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:257542 發(fā)表于 2019-5-13 13:15 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
前幾天在那個寶上買的STM32F4小板子到了,板子上帶一塊3.2寸320*240的電阻屏。然后就想著把正點原子的LCD驅(qū)動和uc/GUI移植到這個小板子上,然后將之前不甚明白的FSMC驅(qū)動TFT-LCD的知識全面學(xué)習(xí)一下。


圖為我的小板,本人什么都喜歡mini的
之所以不用GPIO口直接驅(qū)動液晶,是因為這種方法速度太慢,而FSMC是用來外接各種存儲芯片的,所以其數(shù)據(jù)通信速度是比普通GPIO口要快得多的。TFT-LCD 驅(qū)動芯片的讀寫時序和SRAM的差不多,所以就可以用FSMC四塊中的SRAM塊來驅(qū)動LCD。SRAM有數(shù)據(jù)線和地址線,所以FSMC跟它匹配同樣也有數(shù)據(jù)線和地址線,而LCD數(shù)據(jù)線跟地址線共用,通信時用RS端來區(qū)分線上是數(shù)據(jù)還是指令,RS高是數(shù)據(jù),RS低是指令。
其實這中間一開始最不理解就是與LCD的RS引腳相關(guān)的東西,那時候也不知道咋回事一直以為FSMC的地址線和數(shù)據(jù)線是共用的,導(dǎo)致我一直沒明白怎么回事,昨天一看正點原子的探索者原理圖才發(fā)現(xiàn)FSMC有數(shù)據(jù)線還有地址線,是分開的。驅(qū)動液晶的時候,數(shù)據(jù)線接液晶的并口,RS接到了FSMC的某個地址引腳。具體為什么這樣接,也是我想著重記錄的。

首先,F(xiàn)SMC是什么,F(xiàn)SMC我自己的理解就是,一個銜接CPU與外部存儲的橋梁,它的功能呢就是你往相應(yīng)的地址里寫數(shù)據(jù)時候,你不需用軟件來模擬外部存儲芯片的讀寫時序,而只需配置好FSMC相關(guān)的時序寄存器,配置好相關(guān)寄存器之后,你只管往相應(yīng)存儲塊中的地址里寫數(shù)據(jù)就可以了。最直觀的解釋就看上邊正點原子的一小段代碼,代碼中定義了一個結(jié)構(gòu)體,然后強制性的把結(jié)構(gòu)體的起始地址設(shè)在了0x6C000000 | 0x0000007E處。那么這個0x6C000000 | 0x0000007E地址是啥意思呢,其中0x6C000000是FSMC存儲塊1的區(qū)4起始地址,0x6C00007E為存儲塊1區(qū)4內(nèi)的某個地址,你給LCD_REG賦值,就是往外部存儲設(shè)備中的0x6C00007E地址處寫數(shù)據(jù),給LCD_RAM賦值,就是往0x6C00007F地址處寫數(shù)據(jù)。這里是結(jié)構(gòu)體,當(dāng)然也可以是一個巨大的數(shù)組或其他數(shù)據(jù)類型。當(dāng)然了,F(xiàn)SMC只是一個數(shù)據(jù)銜接部件,真正的存儲芯片是需要通過引腳連接在FSMC的地址和數(shù)據(jù)引腳上的。存儲芯片在指定地址寫入數(shù)據(jù)的時候需要地址線來指定要寫數(shù)據(jù)往哪個地址。也就是說上例中,往0x6C00007E中寫數(shù)據(jù)的時候,地址線的低8位(0x7E)就是0111 1110。這就是FSMC的工作機制。
說完FSMC,下面說如何用FSMC的某跟地址線控制LCD的RS端。以RS連接到A6為例,TFT-LCD的數(shù)據(jù)是16位的,即讀寫一次數(shù)據(jù)為兩個字節(jié)按字節(jié)編址的話就是所有的地址都是偶地址,LCD的顯示RAM編址確實是按兩個字節(jié)編址的(即stm32中AHB總線上的地址,總是FSMC地址線上地址的2倍,即左移一位)。具體怎么個意思,就如下圖(朕的御用畫圖軟件Altium Designer16繪制)所示了:

這樣的話FSMC地址線上的0000 0001就代表AHB(FSMC是接到AHB總線上的)總線上的0000 0010,FSMC地址線上的0000 0010就代表AHB總線上的0000 0100,也就是說你在程序中寫的這個地址右移一位才是FSMC地址線引腳上所表現(xiàn)出來的地址狀態(tài)。造成這種現(xiàn)象的原因就是因為在配置FSMC傳輸數(shù)據(jù)位寬時設(shè)置成了16位。向LCD傳輸數(shù)據(jù)一次都是兩個字節(jié)。所以對應(yīng)上例,往地址0x6C00007E寫數(shù)據(jù),地址線的低8位并不是0111 1110,而是0011 1111。然后假如RS端連接在地址線A6端,那么也就是讓A6端的高低來決定數(shù)據(jù)線上傳輸?shù)氖菙?shù)據(jù)還是命令。上邊說了,當(dāng)往0x6C00007E地址(LCD_REG)寫的時候,F(xiàn)SMC地址線低8位是0011 1111,A6(紅色標(biāo)出)為低電平,這時數(shù)據(jù)線上的是命令,所以寫命令函數(shù)就是直接往LCD_REG寫就行了,實際上就是為了讓RS接低電平,當(dāng)往0x6C000080(低8位1000 0000)地址(LCD_RAM)中寫數(shù)據(jù)時,F(xiàn)SMC地址線低8位是01000000,A6(紅色標(biāo)出)為高電平,這時數(shù)據(jù)線上是數(shù)據(jù),所以寫數(shù)據(jù)就直接往LCD_RAM中寫,實際是為了讓RS接高電平。
當(dāng)然了,這里RS接的是A6,其他場合,RS可能接的是其他地址線,只需要根據(jù)上邊的規(guī)律技巧來改變“0x6C000000 | 0x0000007E”中后者就可以了。這里這個RS的接法和用法很巧妙,摘自正點原子。

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表