LTDC/DMA2D——液晶顯示(代碼)


如何使用 LTDC 及 DMA2D 外設控制型號為“STD800480”的 5 寸液晶屏,該液晶屏的分辨率為 800x480,支持 RGB888 格式

液晶排線接口:

 使用5寸屏,通過屏幕上的排針接入到實驗板的液晶排母接口,與STM32芯片的引腳相連。連接圖如下:

 

 

//1.初始化LCD驅動的引腳
//2.使用LTDC初始化結構體,配置液晶屏的控制參數
//3.使用LTDC的層級初始化結構體,配置各層的控制參數
//4.直接操控顯存,控制液晶屏顯示圖形
//5.使用DMA2D快速繪制直線及矩形

 1、初始化LCD驅動的引腳,根據硬件結構分別初始化各個引腳。

以上代碼根據硬件的連接,把與 LTDC與液晶屏通訊使用的引腳號、引腳源以及復用功能映射都以宏封裝起來。其中部分 LTDC信號的復用功能映射比較特殊,如用作 R3 信號線的 PB0,它的復用功能映射值為 AF9,而大部分 LTDC的信號線都是 AF14。

 

 初始化 LTDC  的 GPIO

利用上面的宏,編寫 LTDC 的 GPIO 引腳初始化函數

與所有使用到 GPIO 的外設一樣,都要先把使用到的 GPIO 引腳模式初始化,以上代碼把 LTDC的信號線全都初始化為 LCD 復用功能,而背光 BL及液晶使能 DISP信號則被初始化成普通的推挽輸出模式,並且在初始化完畢后直接控制它們開啟背光及使能液晶屏。

配置 LTDC 

接下來需要配置 LTDC的工作模式,這個函數的主體是根據液晶屏的硬件特性,設置LTDC 與液晶屏通訊的時序參數及信號有效極性

 

函數的執行流程如下:

1. 初始化 GPIO 引腳以及 LTDC、DMA2D 時鍾

函數開頭調用了前面定義的 LCD_GPIO_Config 函數對液晶屏用到的 GPIO 進行初始化,並且使用庫函數 RCC_APB2PeriphClockCmd 及 RCC_AHB1PeriphClockCmd 使能LTDC和 DMA2D 外設的時鍾。

2. 初始化 SDRAM

接下來調用前面章節講解的 SDRAM_Init 函數初始化 FMC外設控制 SDRAM,以便使用 SDRAM 的存儲空間作為顯存。

3. 設置像素同步時鍾

在“LTDC結構框圖的時鍾信號”小節講解到,LTDC與液晶屏通訊的像素同步時鍾CLK 是由 PLLSAI分頻器控制輸出的,它的時鍾源為外部高速晶振 HSE 經過分頻因子M 分頻后的時鍾,按照默認設置,一般分頻因子 M 會把 HSE 分頻得到 1MHz 的時鍾,如 HSE 晶振頻率為 25MHz 時,把 M 設置為 25,HSE 晶振頻率為 8MHz時,把 M設置為 8,然后調用 SystemInit 函數初始化系統時鍾。經過 M 分頻得到的 1MHz 時鍾輸入到 PLLSAI分頻器后,使用倍頻因子“N”倍頻,然后再經過“R”因子分頻,得到PLLCDCLK 時鍾,再由“DIV”因子分頻得到 LTDC通訊的同步時鍾 LCD_CLK。

  利用庫函數 RCC_PLLSAIConfig及 RCC_LTDCCLKDivConfig函數可以配置 PLLSAI分頻器的這些參數,其中庫函數 RCC_PLLSAIConfig 的三個輸入參數分別是倍頻因子N、分頻因子 Q和分頻因子 R,其中“Q”因子是作用於 SAI接口的分頻時鍾,與LTDC無關,RCC_LTDCCLKDivConfig函數的輸入參數為分頻因子“DIV”。在配置完這些分頻參數后,需要調用庫函數 RCC_PLLSAICmd使能 PLLSAI的時鍾並且檢測標志位等待時鍾初始化完成。

   在上面的代碼中調用函數設置 N=420,R=6,DIV=8,計算得 LCD_CLK 的時鍾頻率為 8.75MHz,這個時鍾頻率是我們根據實測效果選定的,若使用的是 16位數據格式,可把時鍾頻率設置為 24MHz,若只使用單層液晶屏數據源,則可配置為 34MHz。然而根據液晶屏的數據手冊查詢可知它支持最大的同步時鍾為 50MHz,典型速率為33.3Mhz。由此說明傳輸速率主要受限於 STM32 一方。LTDC外設需要從SDRAM 顯存讀取數據,這會消耗一定的時間,所以使用 32 位像素格式的數據要比使用 16 位像素格式的慢,如若只使用單層數據源,還可以進一步減少一半的數據量,所以更快。

4. 配置信號極性

  接下來根據液晶屏的時序要求,配置 LTDC 與液晶屏通訊時的信號極性,

在程序中配置的 HSYNC、VSYNC、DE 有效信號極性均為低電平,同步時鍾信號極性配置為上升沿。其中 DE 信號的極性跟液晶屏時序圖的要求不一樣,文檔中 DE 的有效電平為高電平,而實際測試中把設置為 DE 低電平有效時屏幕才能正常工作,我們以實際測試為准

5. 配置時間參數

  液晶屏通訊中還有時間參數的要求,接下來的程序我們根據液晶屏手冊給出的時間參數,配置 HSW、VSW、HBP、HFP、VBP、VFP、有效像素寬度及有效行數。這些參數都根據圖 27-28 的說明以宏定義在程序中給出。

6. 寫入參數到寄存器並使能外設

  經過上面步驟,賦值完了初始化結構體,接下來調用庫函數 LTDC_Init 把各種參數寫入到 LTDC的控制寄存器中,然后調用庫函數 LTDC_Cmd使能 LTDC。

配置 LTDC  的層級初始化 

  在上面配置完成 STM32 的 LTDC外設基本工作模式后,還需要針對液晶屏的各個數據源層進行初始化,才能正常工作。

LTDC的層級初始化函數執行流程如下:

(1) 配置窗口邊界

每層窗口都需要配置有效顯示窗口,使用 LTDC_HorizontalStart/ HorizontalStop/LTDC_VerticalStart/ LTDC_VerticalStop成員來確定這個窗口的左右上下邊界,各個成員應寫入的值與前面 LTDC 初始化結構體中某些參數類似,注意某些成員要求加 1 或減 1。

(2) 配置像素的格式

LTDC_PixelFormat 成員用於配置本層像素的格式,在這個實驗中我們把這層設置為RGB888 格式,兩層數據源的像素可以配置成不同的格式,層與層之間是獨立的。

(3) 配置默認背景顏色

在定義的層窗口外或在層禁止時,該層會使用默認顏色作為數據源,默認顏色使用LTDC_DefaultColorBlue/Green/Red/Alpha 成員來配置,本實驗中我們把默認顏色配置成透明了。

(4) 配置第 1 層的恆定 Alpha 與混合因子

前面提到兩層數據源混合時可根據混合因子設置只使用恆定 Alpha 運算,還是把像素的 Alpha 也加入到運算中。對於第 1 層數據源,我們不希望 LTDC 的默認背景層參與到混合運算中,而希望第 1 層直接作為背景(因為第 1 層的數據每個像素點都是可控的,而背景層所有像素點都是同一個顏色)。因此我們把恆定 Alpha 值(LTDC_ConstantAlpha)設置為 255,即完全不透明,混合因子 BF1/BF2 參數(LTDC_BlendingFactor_1/2)都配置成 LTDC_BlendingFactor1/2_CA,即只使用恆定Alpha 值運算,這樣配置的結果是第 1 層的數據顏色直接等於它像素本身的 RGB值,不受像素中的 Alpha 值及背景影響。

(5) 配置層的數據量

通過參數 LTDC_CFBLineLength及 LTDC_CFBLineNumber 可設定層的數據量,層的數據量跟顯示窗口大小及像素格式有關,由於我們把這層的像素格式設置成了RGB888,所以每個像素點的大小為 3 字節,LTDC_CFBLineLength參數寫入值:行有效像素個數 x3+3 。而 LTDC_CFBLineNumber 參數直接寫入有效行數(LCD_PIXEL_HEIGHT)。還有一個參數 LTDC_CFBPitch它用於配置上一行起始像素與下一行起始像素的數據增量,我們直接寫入:行有效像素個數 x3 即可。

(6) 配置顯存首地址

  每一層都有獨立的顯存空間,向 LTDC_CFBStartAdress 參數賦值可設置該層的顯存首地址,我們把第 1 層的顯存首地址直接設置成宏 LCD_FRAME_BUFFER,該宏表示的地址為 0xD0000000,即 SDRAM 的首地址,從該地址開始,BUFFER_OFFSET個字節的空間都用作這一層的顯存空間(BUFFER_OFFSET宏的值為 800x480x3:行有效像素寬度 x行數 x每個字節的數據量),向這些空間寫入的數據會被解釋成像素數據,LTDC會把這些數據傳輸到液晶屏上,所以我們要控制液晶屏的輸出,只要修改這些空間的數據即可,包括變量操作、指針操作、DMA操作以及 DMA2D 操作等一切可修改 SDRAM 內容的操作都支持。

  實際設置中不需要刻意設置成 SDRAM 首地址,只要能保證該地址后面的數據空間足夠存儲該層的一幀數據即可。

(7) 向寄存器寫入配置參數

  賦值完后,調用庫函數 LTDC_LayerInit 可把這些參數寫入到 LTDC 的層控制寄存器,根據函數的第一個參數 LTDC_Layer1/2 來決定配置的是第 1 層還是第 2層。

(8) 配置第 2 層控制參數  

  要想有混合效果,還需要使用第 2 層數據源,它與第 1 層的配置大致是一樣的,主要區別是顯存首地址和混合因子。在程序中我們把第 2 層的顯存首地址設置成緊挨着第 1 層顯存空間的結尾。而混合因子都配置成 PAxCA以便它的透明像素能參與運算,實現透明效果,但實際上我們並沒有修改第 2 層像素數據的格式,它依然使用RGB888 格式,由於像素本身並沒有 Alpha 通道的數據,所以是沒有透明混合效果的。
  正常使用時可把第 2層配置成 ARGB8888 或 ARGB1555 格式,才能正常使用兩層數據混合的功能。本程序沒有配置透明格式主要是因為各種描繪函數(如畫點、畫線等)是要根據像素格式進行修改的。兩層使用不同的像素格式那么就要有兩套同樣功能的
函數,容易造成混亂,而 ARGB8888 的數據量太大,所以我們把兩層的像素格式都設置成了 RGB888。 

 

(9) 重載 LTDC配置並使能數據層

  把兩層的參數都寫入到寄存器后,使用庫函數 LTDC_ReloadConfig讓 LTDC外設立即重新加載這些配置,並使用庫函數 LTDC_LayerCmd 使能兩層的數據源。至此,LTDC配置就完成,可以向顯存空間寫入數據進行顯示了。

輔助顯示的全局變量及函數

 


免責聲明!

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



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