LCD和FSMC的那點事


A.先說一下幾種LCD interface,包括但不限於於以下三種:

1.SPI

2.FSMC,就是常說的8080(或者稱80並口,都是一個意思)

3.LTDC,就是RGB的接口

概念:

FM指幀緩存,即:GRAM

true colo ,就是RGB888

B.由於我使用的LCD接口是16位的80並口(16位代表有16條數據線),現在說一下80並口的標准信號,要驅動一個80並口的LCD包括以下7項信號(其中第8項位觸摸屏接口的信號,可先不理會):
1.LCD_CS:LCD片選信號

2.LCD_WR:LCD寫信號

3.LCD_RD:LCD讀信號

4.DB[17:1]:16位雙向數據線

5.LCD_RST:硬復位LCD信號

6.LCD_RS:命令/數據標志(0:命令,1:數據)

7.BL_CTR:背光控制信號

8.T_MISO/T_MOSI/T_PEN/T_CS/T_CLK,觸摸屏接口信號

還有一個題外話,就是LCD的驅動初始化代碼是由廠家提供的(初始化代碼將LCD調到最佳顯示效果),LCD必須硬復位后才能初始化。

C.再說一下為何FSMC可以用來驅動LCD,原因是FSMC的讀寫時序和LCD的讀寫時序很相似,於是把LCD當成一個外部存儲器來用。利用FSMC在相應的地址讀或寫相關數值時,STM32的FSMC會在硬件上自動完成時序上的控制。所以我們只要設置好讀寫相關時序的寄存器后,FSMC就可以幫我們完成時序上的控制了。對於FSMC驅動LCD有一個比較難理解的地方就是當你的LCD使用16位寬度的數據傳輸(也就是有16條數據線,就像我上面說的我使用的是16位的80並口)的時候,HADDR和FSMC_A這個地址塊的對應問題(使用8位數據則不用考慮此問題)。先開STM32中文參考手冊_V10.pdf第327頁,看到下圖的紅色下划線的文字,這個問題就是體現在這幾句話上。


為什么FSMC外接16位寬度存儲器(前面說了我們把LCD當成外部存儲器來用)的時候和外接8位寬度存儲器的時候,HADD和FSMC_A對應的地址不一樣呢?下面我來說一下。

第一,我們先要明白FSMC_A是STM32的硬件的外部接口,是我們看得見摸得着的。然后HADDR是需要轉換到外部存儲器的內部AHB地址線(如上圖所述),這個我們是看不見摸不着的,但是,我們可以用代碼來控制它(理解這點很重要),我們代碼直接操作着HADDR,而會間接操作到FSMC_A。所以當我們的LCD的16位(16位與8位是可選擇,一般是是通過LCD的FPC上的電阻進行選擇的,這點不詳細講)的80並口和STM32的FSMC接口連接好之后,要操作的就是HADDR,因為HADDR會間接操作到FSMC_A。

    第二,外部存儲器不都是按字節訪問的(如上圖所述),也就是說當你找到某個地址之后,你可以讀出一個字節的數據(8位寬度)或者兩個字節的數據(16位寬度)或者更多字節的數據(其他寬度),而這,就是依靠你外部存儲器的數據寬度是多少。而所謂16位數據寬度就是說一個地址對應兩個字節,當然了8位的數據寬度就是一個地址對應一個字節。

    第三,從上圖中,我們知道當你是8位數據寬度的時候是26根數據線HADDR[25:0],而16位數據寬度的時候是25根數據線[25:1]。前者可能大家都比較好理解,算下來就是有64M的地址空間(我們把LCD當成SRAM來用,把LCD接在了bank1上,bank1就是外接NOR/PSRAM用的,接到bank1后,再隨便接到bank1的四個分區中的一個,每個bank大小512M,每個bank中的每個區64M),每個地址對一個字節空間大小,存儲器儲存空間大小為64M。后者算下來就是有32M的地址空間,他前面8位數據寬度時不同的是16位數據寬度每個地址對應兩個字節的空間大小,這樣算的話,它也是有32M*2=64M的存儲空間大小(注意這里和前面的多少多少M指的是地址的數目,而不是實際對應的存儲器存數空間的大小,就是說要注意區分地址空間大小和存儲空間大小,因為前面說了一個地址可能對應一個字節大小的空間,也可能對應兩個字節大小的空間)。

      到了這里,大家應該都知道為什么16位數據寬度時HADDR的地址線需要減少一根了,因為16位數據寬度時需要的地址的數量只是8位數據寬度時的一半。

     第四,現在假設我們的LCD的LCD_RS(命令/數據標志線)是接在STM32的外部接口FSMC_A[10]上的。由於STM32規定當使用16位數據寬度的時候HADDR[25:1]與FSMC_A[24:0]對應相連, HADDR[0]未接(如上圖所述)。也就是說當使用16位數據寬度時有如下HADDR和FSMC_A有如下對應關系:

 

很明顯,當使用16位數據寬度的時候,HADDR[0]這個地址是沒用的。而因為我們的LCD的LCD_RS(命令/數據標志線)是接在STM32的外部接口FSMC_A[10]上的,所以實際上我們要操作的事HADDR[11]這根地址線。其實這就是所謂的當使用16位數據寬度的時候,HADDR自動右移一位對其的原理。

D.我的LCD的控制IC是ILI9314,講一下我使用時遇到的一些問題。
其實我遇到的主要是橫豎屏切換時問題,就是當我們從橫豎屏間切換時應該要注意哪些地方,或者說白了,就是要設置哪些寄存器。
第一,先說一下,所謂的橫豎屏切換指的是LCD的一個掃描方式,如下圖展示了其中的三種掃描方式:

掃描方式確定好了,其實也就是確定好橫屏或者豎屏了。同時該方向上的虛擬原點坐標(其實LCD的原點只有一個,就是物理的原點坐標)也確定好了,像上圖中的B就是當確定好了掃描方式后的對應的虛擬原點(0,0)坐標所在的位置。
當LCD處於不是默認掃描方式時(也就是虛擬坐標和物理坐標不是一樣的時候),需要做虛擬坐標到實際坐標的轉換公式如下:

下面我舉個例子說明一下,他們之間的轉換關系:

上圖中黑色的都是物理上的坐標,而紅色的是改變掃描方式后的視角,紅色的(10,20)是相對於橫屏狀態下虛擬原點坐標(0,0)來說的。當我們在橫屏狀態時想在(10,20)打紅色的點,就必須做坐標轉換,不然的話就會打到黑色的點那里去了。其實從虛擬坐標到物理坐標的轉換控制IC已經幫我們做好了,我們其實不用理會。上圖中的藍色箭頭指向的其實就是轉換公司,它和上上圖中B5,B6,B7為110時的公式是一樣的。其實就是(239-y,x),其中這里的x和y都是在橫屏狀態下你想打的點。
第二,我總結一下橫豎屏切換(掃描方式改變)時需要注意的地方。
1,x坐標的開始和結束地址,y坐標的開始和結束地址要重新設置,因為橫豎屏間的切換時x,y相應也會變化,所以需要重新設置(調換即可)。
2,所謂的設置當前坐標,其實就是設置x,y的開始地址。和上面的設置方法一樣,這時可以省略不設置x,y的結束地址。
3,最后說一下,所謂的顯示字符是怎么回事。以及1206,1608字符是什么意思,畫了個圖,大家都明白。

如果有哪里我理解錯了,請指正我。

————————————————
版權聲明:本文為CSDN博主「siufai_92」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/siufai_92/java/article/details/48214109


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM