1.顯示器的基本參數
(1) 像素
像素是組成圖像的最基本單元要素,顯示器的像素指它成像最小的點。
(2) 分辨率
一些嵌入式設備的顯示器常常以“行像素值 x列像素值”表示屏幕的分辨率。如分辨率 800x480表示該顯示器的每一行有 800 個像素點,
每一列有 480 個像素點,也可理解為有 800列,480 行。
(3) 色彩深度
色彩深度指顯示器的每個像素點能表示多少種顏色,一般用“位”(bit)來表示。如單色屏的每個像素點能表示亮或滅兩種狀態(即實際上能顯示 2 種顏色),
用 1 個數據位就可以表示像素點的所有狀態,所以它的色彩深度為 1bit,其它常見的顯示屏色深為16bit、24bit。
(4) 顯示器尺寸
顯示器的大小一般以英寸表示,如 5英寸、21 英寸、24 英寸等,這個長度是指屏幕對
角線的長度, 通過顯示器的對角線長度及長寬比可確定顯示器的實際長寬尺寸。
(5) 點距
點距指兩個相鄰像素點之間的距離,它會影響畫質的細膩度及觀看距離,相同尺寸的屏幕,若分辨率越高,則點距越小,畫質越細膩。
如現在有些手機的屏幕分辨率比電腦顯示器的還大,這是手機屏幕點距小的原因;LED 點陣顯示屏的點距一般都比較大,所以適合遠距離觀看。
2. 液晶面板的控制信號線
(1) RGB信號線
RGB信號線各有 8 根,分別用於表示液晶屏一個像素點的紅、綠、藍顏色分量。使用紅綠藍顏色分量來表示顏色是一種通用的做法,打開 Windows 系統自帶的畫板調色工具,
可看到顏色的紅綠藍分量值。常見的顏色表示會在“RGB”后面附帶各個顏色分量值的數據位數,如 RGB565表示紅綠藍的數據線數分別為 5、6、5根,一共為 16個數據位,
可表示 2^16 種顏色;而這個液晶屏的種顏色分量的數據線都有 8 根,所以它支持 RGB888 格式,一共 24位數據線,可表示的顏色為 2^24 種。
(2) 同步時鍾信號 CLK
液晶屏與外部使用同步通訊方式,以 CLK 信號作為同步時鍾,在同步時鍾的驅動下,每個時鍾傳輸一個像素點數據。
(3) 水平同步信號 HSYNC
水平同步信號 HSYNC(Horizontal Sync)用於表示液晶屏一行像素數據的傳輸結束,每傳輸完成液晶屏的一行像素數據時,
HSYNC 會發生電平跳變,如分辨率為 800x480 的顯示屏(800 列,480 行),傳輸一幀的圖像 HSYNC的電平會跳變 480 次。
(4) 垂直同步信號 VSYNC
垂直同步信號 VSYNC(Vertical Sync)用於表示液晶屏一幀像素數據的傳輸結束,每傳輸完成一幀像素數據時,VSYNC會發生電平跳變。其中“幀”是圖像的單位,一幅
圖像稱為一幀,在液晶屏中,一幀指一個完整屏液晶像素點。人們常常用“幀/秒”來表示液晶屏的刷新特性,即液晶屏每秒可以顯示多少幀圖像,如液晶屏以 60 幀/秒的
速率運行時,VSYNC每秒鍾電平會跳變 60 次。
(5) 數據使能信號 DE
數據使能信號 DE(Data Enable)用於表示數據的有效性,當 DE 信號線為高電平時,RGB信號線表示的數據有效。
3. 液晶數據傳輸時序

液晶屏顯示的圖像可看作一個矩形,結合下圖來理解。液晶屏有一個顯示指針,它指向將要顯示的像素。顯示指針的掃描方向方向從左到右、從上到下,
一個像素點一個像素點地描繪圖形。這些像素點的數據通過 RGB數據線傳輸至液晶屏,它們在同步時鍾CLK 的驅動下一個一個地傳輸到液晶屏中,
交給顯示指針,傳輸完成一行時,水平同步信號 HSYNC電平跳變一次,而傳輸完一幀時 VSYNC電平跳變一次。

液晶顯示指針在行與行之間,幀與幀之間切換時需要延時,而且 HSYNC 及VSYNC 信號本身也有寬度,這些時間參數說明如下表:
在這些時間參數控制的區域,數據使能信號線“DE”都為低電平,RGB數據線的信號無效,當“DE”為高電平時,表示的數據有效,傳輸的數據會直接影響液晶屏的顯示區域。
4. 顯存
液晶屏中的每個像素點都是數據,在實際應用中需要把每個像素點的數據緩存起來,再傳輸給液晶屏,這種存儲顯示數據的存儲器被稱為顯存。
顯存一般至少要能存儲液晶屏的一幀顯示數據,如分辨率為 800x480 的液晶屏,使用 RGB888 格式顯示,它的一幀顯示數據大小為:3x800x480=1152000 字節;
若使用 RGB565 格式顯示,一幀顯示數據大小為:2x800x480=768000字節。
5. LTDC 液晶控制器
STM32F429 系列芯片內部自帶一個 LTDC液晶控制器,使用 SDRAM 的部分空間作為顯存,可直接控制液晶面板,無需額外增加液晶控制器芯片。
STM32 的 LTDC液晶控制器最高支持 800x600 分辨率的屏幕;可支持多種顏色格式,包括 RGB888、RGB565、ARGB8888 和 ARGB1555 等(其中的“A”是指透明像素);
支持 2 層顯示數據混合,利用這個特性,可高效地做出背景和前景分離的顯示效果,如以視頻為背景,在前景顯示彈幕。

LTDC的控制信號線與液晶顯示面板的數據線一一對應,包含有 HSYNC、VSYNC、DE、CLK 及 RGB數據線各 8 根。設計硬件時把液晶面板與 STM32 對應的這些引腳連接起
來即可,查閱《STM32F4xx 規格書》可知 LTDC信號線對應的引腳,見下表。


時鍾信號
LTDC外設使用 3 種時鍾信號,包括 AHB時鍾、APB2 時鍾及像素時鍾 LCD_CLK。
AHB時鍾用於驅動數據從存儲器存儲到 FIFO,APB2 時鍾用於驅動 LTDC 的寄存器。而LCD_CLK 用於生成與液晶面板通訊的同步時鍾,見下圖,它的來源是 HSE(高速外部晶振),
經過“/M”分頻因子分頻輸出到“PLLSAI”分頻器,信號由“PLLSAI”中的倍頻因子 N 倍頻得到“PLLSAIN”時鍾、然后由“/R”因子分頻得到“PLLCDCLK”時鍾,
再經過“DIV”因子得到“LCD-TFT clock”,“LCD-TFT clock”即通訊中的同步時鍾LCD_CLK,它使用 LCD_CLK 引腳輸出。
在實際使用 LTDC控制器控制液晶屏時,使 LTDC正常工作后,往配置好的顯存地址
寫入要顯示的像素數據,LTDC 就會把這些數據從顯存搬運到液晶面板進行顯示,而顯示
數據的容量非常大,所以我們希望能用 DMA來操作,針對這個需求,STM32 專門定制了
DMA2D 外設,它可用於快速繪制矩形、直線、分層數據混合、數據復制以及進行圖像數
據格式轉換,可以把它理解為圖形專用的 DMA。
DMA2D 結構框圖剖析
下圖是 DMA2D 的結構框圖,它與前面 LTDC結構里的圖像處理單元很類似,主要為分層 FIFO、PFC及彩色混合器。

1. FG FIFO 與 BG FIFO
FG FIFO(Foreground FIFO)與 BG FIFO(Backgroun FIFO)是兩個 64x32 位大小的緩沖區,
它們用於緩存從 AHB總線獲取的像素數據,分別專用於緩沖前景層和背景層的數據源。
AHB總線的數據源一般是 SDRAM,也就是說在 LTDC外設中配置的前景層及背景層
數據源地址一般指向 SDRAM 的存儲空間,使用 SDRAM 的部分空間作為顯存。
2. FG PFC 與 BG PFC
FG PFC(FG Pixel Format Convertor)與 BG PFC(BG Pixel Format Convertor)是兩個像素格
式轉換器,分別用於前景層和背景層的像素格式轉換,不管從 FIFO 的數據源格式如何,
都把它轉化成字的格式(即 32 位),ARGB8888。
圖中的“ɑ”表示 Alpha,即透明度,經過 PFC,透明度會被擴展成 8 位的格式。
圖中的“CLUT”表示顏色查找表(Color Lookup Table),顏色查找表是一種間接的顏色
表示方式,它使用一個 256x32 位的空間緩存 256 種顏色,顏色的格式是 ARGB8888 或
RGB888。見下圖,利用顏色查找表,實際的圖像只使用這 256 種顏色,而圖像的每個
像素使用 8位的數據來表示,該數據並不是直接的 RGB 顏色數據,而是指向顏色查找表的
地址偏移,即表示這個像素點應該顯示顏色查找表中的哪一種顏色。在圖像大小不變的情
況下,利用顏色查找表可以擴展顏色顯示的能力,其特點是用 8位的數據表示了一個 24或
32 位的顏色,但整個圖像顏色的種類局限於顏色表中的 256 種。DMA2D 的顏色查找表可
以由 CPU自動加載或編程手動加載。

3. 混合器
FIFO 中的數據源經過 PFC像素格式轉換器后,前景層和背景層的圖像都輸入到混合器中運算,運算公式如下:
從公式可以了解到混合器的運算主要是使用前景和背景的透明度作為因子,對像素
RGB 顏色值進行加權運算。經過混合器后,兩層數據合成為一層 ARGB8888 格式的圖像。
4. OUT PFC
OUT PFC是輸出像素格式轉換器,它把混合器轉換得到的圖像轉換成目標格式,如ARGB8888、RGB888、RGB565、ARGB1555 或 ARGB4444,具體的格式可根據需要在輸出 PFC控制寄存器 DMA2D_OPFCCR 中選擇。
STM32F429 芯片使用 LTDC、DMA2D 及 RAM 存儲器,構成了一個完整的液晶控制器。LTDC負責不斷刷新液晶屏,DMA2D 用於圖像數據搬運、混合及格式轉換,RAM 存儲器作為顯存。其中顯存可以使用 STM32 芯片內部的 SRAM 或外擴 SDRAM/SRAM,只要容量足夠大即可(至少要能存儲一幀圖像數據)。
LTDC 初始化結構體
控制 LTDC涉及到非常多的寄存器,利用 LTDC初始化結構體可以減輕開發和維護的工作量,LTDC初始化結構體見如下代碼:
這個結構體大部分成員都是用於定義 LTDC的時序參數的,包括信號有效電平及各種時間參數的寬度,配合“液晶數據傳輸時序”中的說明更易理解。各個成員介紹如下,括號中的是 STM32 標准庫定義的宏:



對這些 LTDC初始化結構體成員賦值后,調用庫函數 LTDC_Init 可把這些參數寫入到LTDC 的各個配置寄存器,LTDC 外設根據這些配置控制時序。
LTDC 層級初始化結構體
LTDC初始化結構體只是配置好了與液晶屏通訊的基本時序,還有像素格式、顯存地址等諸多參數需要使用 LTDC 層級初始化結構體完成。代碼如下:





本結構體成員可以設置 BF1/BF2 參數使用 CA配置(LTDC_BlendingFactor1/2_CA)還是PAxCA 配置(LTDC_BlendingFactor1/2_PAxCA)。配置成 CA 表示混合系數中只包含恆定的 Alpha 值,即像素本身的 Alpha 不會影響混合效果,若配置成 PAxCA,則混合系數中包含有像素本身的 Alpha 值,即把像素本身的 Alpha 加入到混合運算中。其中的恆定Alpha 值即前面“ LTDC_ConstantAlpha ”結構體配置參數的透明度百分比:(配置的Alpha 值/0xFF)。
數據源混合時,由下至上,如果使用了 2層,則先將第 1 層與 LTDC背景混合,隨后再使用該混合顏色與第 2層混合得到最終結果。例如,當只使用第 1層數據源時,且 BF1及 BF2 都配置為使用恆定 Alpha,該 Alpha 值在 LTDC_ConstantAlpha結構體成員值中被配置為 240(0xF0)。因此,恆定 Alpha 值為 240/255=0.94。若當前層顏色 C=128,背景色 Cs=48,那么第 1 層與背景色的混合結果為:
BC=恆定 Alpha x C + (1- 恆定 Alpha) x Cs=0.94 x Cs +(1-0.94)x 48=123

配置完 LTDC_Layer_InitTypeDef層級初始化結構體后,調用庫函數 LTDC_LayerInit可把這些配置寫入到 LTDC的層級控制寄存器中,完成初始化。初始化完成后 LTDC會不斷把顯存空間的數據傳輸到液晶屏進行顯示,我們可以直接修改或使用 DMA2D 修改顯存中的數據,從而改變顯示的內容。
DMA2D初始化結構體
在實際顯示時,我們常常采用 DMA2D 描繪直線和矩形,這個時候會用到 DMA2D 結構體


配置完這些結構體成員,調用庫函數 DMA2D_Init 即可把這些參數寫入到 DMA2D 的控制寄存器中,然后再調用 DMA2D_StartTransfer 函數開啟數據傳輸及轉換。
