天天看點

STM32學習--FMSC 和 LCD(1)

FMSC 和 LCD

1.      簡述

        TFT-LCD也叫做真彩液晶顯示器,即薄膜半導體液晶顯示器。價格便宜量又足,在裝置儀表顯示中經常被用到。一般情況下,儀備用的LCD都可以直接采購市場上成熟的LCD子產品,可以降低開發成本,提高開發速度。當然,有些便攜式裝置可能由于空間體積的限制也隻能一體化設計來減小體積,達到更好的工業設計效果。

在我的學習過程中,采用的是成熟的LCD子產品,以後若有需要再針對LCD設計開展專題學習。TFTLCD 子產品的驅動晶片有很多種類型,我選擇的是正點原子3.5寸的LCD子產品,其驅動晶片采用的是ILI9341。80并口在上文已描述過,其使用非常廣泛,LCD大多的驅動晶片均支援該接口。

        在StM32中,大多晶片具備FSMC 接口。FSMC,即靈活的靜态存儲控制器,能夠與同步或異步存儲器和 16 位 PC 存儲器卡連接配接,STM32F1 的FSMC 接口支援包括SRAM、NAND FLASH、 NORFLASH 和PSRAM 等存儲器。

        STM32 的 FSMC 将外部裝置分為 3 類:NOR/PSRAM 裝置、NAND裝置、PC 卡裝置。他們共用位址資料總線等信号,他們具有不同的 CS 以區分不同的裝置,将 TFTLCD 當成SRAM 來控制使用。

2.      ILI9341功能描述

2.1  ILI9341簡介

         LI9341是一個用于TFT液晶顯示的單晶片控制驅動器。有262,144色的240RGB X 320像素顯示解決方案。内部顯存172800位元組用于圖形顯示的GRAM。

ILI9341支援 8/9/16/18位資料總線的MCU接口,6/16/18位資料總線的RGB接口, 以及3/4線的SPI接口。 移動圖像區域可以通過視窗位址功能在内部GRAM 來指定。 指定的視窗區域可以選擇性地更新。它的接口選擇可以通過外部IM[3:0]引腳來控制,一般在LCD子產品内部已選擇完成,提供跳線以供選擇。這裡我們選的是16部資料總線。

2.2 子產品接口

         LCD子產品與STM32的接口,其本也是驅動晶片ILI9341與STM32接口,主要也是80并口,與OLeD接口差別就是資料帶寬不一樣,LCD是16位的,有16條資料線。

CS: LED 片選信号。

WR:向 LED 寫入資料。

RD:從 LED 讀取資料。

D[15:0]: 16位雙向資料線。

RST(RES):硬複位 LED

RS:指令/資料标志( 0,讀寫指令; 1,讀寫資料)。

       另外我們還需要一個背光控制線來控制 TFTLCD 的背光。

       16位總線模式下,ILI9341 采用RGB565 格式存儲顔色資料。如圖所示,在該模式下,輸入18位 ( D17-D0) , D0和D12這兩個位是無效的位。 實際上隻有D11-D1,D17-D13是有 效的。也正是這16位,最終被送到GRAM中顯示出某一個顔色的像素點出來。

STM32學習--FMSC 和 LCD(1)

       MCU 的 16 位資料, 最低 5 位代表藍色,中間 6 位為綠色,最高5 位為紅色。數值越大,表示該顔色越深。

2.3   常用指令

       ILI9341 所有的指令都是 8 位的(高8 位無效),且參數除了讀寫 GRAM 的時候是 16 位,其他操作參數,都是 8 位的。

       ILI9341的一級指令46個,二級指令28個,擴充指令7個,具體可以參與其資料手冊,有中文版的,參考比較友善 。

       在這裡,主要學習0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 條指令的使用。

       0XD3:讀 ID4 指令,用于讀取LCD 控制器的ID。它有4個參數,最後 2 個參數,讀出來是 0X93 和 0X41,就是驅動晶片的ID,用來确定我們使用的是這個型号的晶片。

STM32學習--FMSC 和 LCD(1)

       0X36:存儲通路控制指令,可以控制 ILI9341 存儲器的讀寫方向,就是在連續寫 GRAM 的時候,可以控制 GRAM 指針的增長方向,進而控制顯示方式參數中MY、 MX、 MV這三個位,通過這三個位的設定,我們可以控制整個 ILI9341 的全部掃描方向。

STM32學習--FMSC 和 LCD(1)

        這個指令可以使我們顯示内容時很靈活。比如顯示 BMP 圖檔,BMP解碼資料,就是從圖檔的左下角開始,慢慢顯示到右上角,如果設定 LCD 掃描方向為從左到右,從下到上,那麼我們隻需要設定一次坐标,然後就不停的往 LCD 填充顔色資料即可,這樣可以大大提高顯示速度。

STM32學習--FMSC 和 LCD(1)

       0X2A:列位址設定指令, 在從左到右,從上到下的掃描方式(預設),該指令用于設定橫坐标( x 坐标)。帶有4 個參數是2 個坐标值:SC和 EC,即列位址的起始值和結束值, SC 必須小于等于 EC,且 0≤SC/EC≤239。一般在設定x 坐标的時候,我們隻需要帶 2 個參數即可,也就是設定 SC 即可,因為如果 EC 沒有變化,我們隻需要設定一次即可(在初始化 ILI9341 的時候設定),進而提高速度。

STM32學習--FMSC 和 LCD(1)

      0X2B:頁位址設定指令, 在從左到右,從上到下的掃描方式(預設)下面,該指令用于設定縱坐标( y 坐标)。該指令用于設定 y 坐标,該指令帶有 4 個參數,實際上是 2 個坐标值:SP和 EP,即頁位址的起始值和結束值, SP 必須小于等于 EP,且 0≤SP/EP≤319。

      0X2C,該指令是寫 GRAM 指令,在發送該指令之後,便可以往 LCD的 GRAM 裡面寫入顔色資料了,支援連續寫。

STM32學習--FMSC 和 LCD(1)

          0X2E指令:讀 GRAM 指令,用于讀取ILI9341 的顯存(GRAM)。

STM32學習--FMSC 和 LCD(1)

       該指令的參數為16位,對應每個點的RGB值。連續寫時,GRAM 的位址将根據 MY/MX/MV 設定的掃描方向進行自增。

       例如:假設設定的是從左到右,從上到下的掃描方式,那麼設定好起始坐标(通過 SC, SP 設定)後,每寫入一個顔色值, GRAM 位址将會自動自增 1( SC++),如果碰到 EC,則回到SC,同時SP++,一直到坐标:EC, EP 結束,其間無需再次設定的坐标,進而大大提高寫入速度。

0X2E指令:讀 GRAM 指令,用于讀取ILI9341 的顯存(GRAM)。

       ILI9341 在收到該指令後,第一次輸出的是dummy 資料,也就是無效的資料,第二次開始,讀取到的才是有效的 GRAM 資料(從坐标:SC, SP 開始),輸出規律為:每個顔色分量占 8 個位,一次輸出2 個顔色分量。