【海東青電子原創(chuàng)文章,轉(zhuǎn)載請注明出處:http://www.itdecent.cn/p/216388df4d4d】
(實(shí)例代碼下載地址:https://github.com/haidongqing/ltdc-demo)
LTDC是一種顯示接口,主要被MCU用來連接TFT屏,這也是Lcd-Tft Display Controller(LTDC)的本意。各種常用的顯示接口請參見這篇文章:《各種顯示接口DBI、DPI、LTDC、DSI、FSMC》(向原作者致意!),文中詳細(xì)描述了3大類顯示接口:DBI、DPI和DSI。LTDC屬于DPI(display pixel interface,顯示像素接口,也稱RGB接口),它不斷地向顯示器(TFT液晶屏)發(fā)送圖像數(shù)據(jù)(即:不斷刷新),液晶屏不需要具備顯存,顯存在MCU一端(片內(nèi)RAM或外擴(kuò)RAM)。可以直觀地認(rèn)為LTDC就是PC上的“顯卡”。
液晶屏上的像素點(diǎn)是一行、一行地顯示出來的,掃描到最后一行后,再回到第一行掃描,如此循環(huán)往復(fù),很像VGA顯示器的工作模式。

而且,LTDC的信號時(shí)序確實(shí)沿用了VGA的術(shù)語,為了便于理解LTDC的時(shí)序參數(shù)如何設(shè)置,先來看看關(guān)于傳統(tǒng)的VGA的信號時(shí)序:《VGA原理詳解》(向原作者致意?。?。核心概念如下:
? ? ? “顯示器的掃描方式:掃描從屏幕左上角一點(diǎn)開始,從左向右逐點(diǎn)掃描。每掃描完一行,電子束回到屏幕的左邊下一行的起始位置,在這期間,CRT對電子束進(jìn)行消隱,每行結(jié)束時(shí),用行同步信號進(jìn)行同步;當(dāng)掃描完所有的行,形成一幀,用場同步信號進(jìn)行場同步,并使掃描回到屏幕左上方,同時(shí)進(jìn)行場消隱,開始下一幀。
? ? ? 從掃描方式中我們知道,行同步,場同步以及消隱區(qū)的概念?;氐綍r(shí)鐘上來。以行掃描為例子,在一行中由于需要行消隱,所以要求一定的時(shí)鐘周期用于行消隱,當(dāng)然也有行同步信號。”

上圖中,1-6處是重點(diǎn),是LTDC的主要參數(shù),后面將詳述。LTDC的功能框圖:
LTDC的信號可以分為兩類:4個控制信號(像素時(shí)鐘LCD_CLK、水平同步HSYNC、垂直同步VSYNC、數(shù)據(jù)有效DE)和3個RGB數(shù)據(jù)信號(8-bit x 3)。LTDC與液晶面板之間的通訊是“同步的”,受LCD_CLK的控制。STM32F746G-DISCO開發(fā)板有關(guān)TFT顯示器的電路原理圖如下:
4個控制信號和3個RGB數(shù)據(jù)信號與圖三相對應(yīng)。除此之外,注意上圖綠色框中的 LCD_BL_CTRL 和 LCD_DISP 2個信號線。LCD_BL_CTRL 控制電源芯片 STLD40D 的輸出,當(dāng)其高電平時(shí)有效,使得輸出的 LCD_BL_A(陽極)與 LCD_BL_K(陰極)導(dǎo)通,TFT面板的背光打開。這樣,LCD_BL_CTRL (板子上是PK3管腳)可以用來控制TFT面板是否顯示。LCD_DISP(板子上是PI12管腳) 用來控制 TFT面板是否進(jìn)入休眠狀態(tài),見?RK043FN48H-CT672B 模組的參考手冊:
RK043FN48H-CT672B 是深圳晶鴻公司的帶觸摸的TFT液晶模組,其中液晶驅(qū)動IC型號為?OTA5180A,其數(shù)據(jù)手冊里也有關(guān)于DISP信號的描述:
這個DISP 名字實(shí)在是令人費(fèi)解,換成 Standby 或 Sleep 就容易理解了,反正是需要給高電平,才能使液晶屏正常工作。 LCD_BL_CTRL 和 LCD_DISP 這2個信號線不是LTDC“標(biāo)配”的,是液晶模組“特有”的,不同的模組可能有不同的控制信號,這里特別說明一下,后面需要用CUBEMX專門配置對應(yīng)的GPIO。
LTDC的硬件接口介紹完了,下面具體說說LTDC的控制邏輯。
圖七中的1-6 標(biāo)號與圖二的標(biāo)號是一一對應(yīng)的:
1、HSYNC,水平同步信號,需要指明它的脈寬,單位:像素時(shí)鐘DCLK。
2、HBP,Horizontal Back Porch,水平同步信號后肩(后沿,后廓,一個意思),它之后就是真正的數(shù)據(jù)開始了。單位:像素時(shí)鐘。
3、HFP,Horizontal Front Porch,水平同步信號前肩,表明一行結(jié)束,單位:像素時(shí)鐘。
4、VSYNC,垂直同步信號,一幀的開始,需要指明寬度,單位:行。
5、VBP,Vertical?Back Porch,垂直同步信號后肩,它之后就是一幀的首行數(shù)據(jù)開始了,單位:行。
6、VHP,Vertical Front Porch,垂直同步信號前肩,表明一幀結(jié)束,單位:行。
再加上 Active Width(寬,像素,本例中為480)、Active height(高,像素,本例中為272),這8個數(shù)據(jù)是LTDC需要配置的最重要的參數(shù)??纯匆壕Э刂菩酒謨灾袑?shù)的要求:
上表給出了各個參數(shù)的范圍,實(shí)際使用時(shí)可以在這個參考范圍內(nèi)做調(diào)整。注意,像素時(shí)鐘DCLK的范圍在5--12MHz,本例中將使用9.8MHz。
這里還要介紹兩個LTDC的重要概念:顯示層(Layer)與窗口(Window)。LTDC支持2個Layer,每個Layer對應(yīng)一個顯存,也就是一個圖像。LTDC可以將2個圖像疊加,layer1在下、layer2在上。2個層可以分別被使能,可以單獨(dú)使用,也可以一起疊加使用。顯然,這種2個(硬件)圖層的結(jié)構(gòu)非常利于動畫的實(shí)現(xiàn)。例如,layer1保持不動,layer2不停改變相對位置,則看到的是上面的圖像(比如,動畫人物)在背景圖上運(yùn)動。進(jìn)一步,每個層都有一個活動的“窗口”,就是圖像具體的顯示位置和大小,即圖七中的 Active display area。窗口的大小可以等同于圖層的大小(滿屏),也可以小于圖層,這樣的設(shè)計(jì)利于編程的靈活性。例如,當(dāng)只需要顯示1/4大小的圖片時(shí),可以定義一個1/4大小的窗口來顯示圖片,對應(yīng)的顯存也只需要1/4大小,節(jié)省內(nèi)存。而且圖片的顯示位置可以動態(tài)調(diào)整。
補(bǔ)充:關(guān)于圖四中LCD_DE信號的說明:
當(dāng)?LCD_DE 為高電平時(shí),LTDC向液晶面板輸出數(shù)據(jù)有效(就是說,LCD_DE變高后,LCD_R[7:0]等24條數(shù)據(jù)線上的輸出數(shù)據(jù)有效)。
至此,與LTDC有關(guān)的參數(shù)配置講完了,下面可以使用CUBEMX具體來配置LTDC了。
選擇芯片 STM32F746NG:
配置外部晶振:
調(diào)試模式(ST-LINK):
配置主時(shí)鐘、像素時(shí)鐘:
HCLK配置為最高頻率216MHz;綠框中的 LCD-TFT 的頻率默認(rèn)是48MHz,超出了5--12 的范圍(見圖八),但這個值是灰色的、無法更改。這是因?yàn)長TDC還沒有啟用,像素時(shí)鐘是通過LTDC的寄存器配置的,所以到這一步還無法配置像素時(shí)鐘。下面配置LTDC,需要三個步驟,先配置LTDC的參數(shù):
Display Type 選 RGB888,是因?yàn)長TDC的硬件接口是RGB各占8-bit,共24條數(shù)據(jù)線(跟顯存數(shù)據(jù)格式RGB565等不是一個概念、不要混淆)。
然后配置圖層參數(shù):
為了簡化,選擇了一個圖層(layer1,直接顯示、不關(guān)layer2的事了),圖像格式是RGB565,這是顯存中數(shù)據(jù)的格式。我們將在代碼編程時(shí),通過ST的圖像格式轉(zhuǎn)換工具將一個demo圖片轉(zhuǎn)化成C語言數(shù)組數(shù)據(jù),而這個數(shù)據(jù)是RGB565的,所以上面layer1要選RGB565格式。Buffer的起始地址設(shè)置成了0xC000 0000,這是開發(fā)板上SDRAM的地址,我們的測試程序?yàn)榱撕喕?,不使用SDRAM作顯存,而是直接從片內(nèi)FLASH中讀取圖片,在CUBEMX生成的代碼中,需要修改這個地址(見后)。Alpha選了最大值255,就是完全不透明顯示圖片(即原圖)。如果Alpha=128,將看到半透明的圖片;Alpha=0的話,就什么也看不到了。
第三步,也是容易被忽略的一步,檢查LTDC用到的GPIO復(fù)用管腳是否正確。這是CUBEMX默認(rèn)配置的:
與開發(fā)板原理圖對比,上圖中大部分GPIO的配置不對。按照電路圖重新配置如下:
LTDC本身的所有參數(shù)配置完畢了(為什么強(qiáng)調(diào)“本身”?見后),再回到時(shí)鐘配置頁,因?yàn)長TDC使能了,圖十四綠框中的參數(shù)不再是灰色的了,按下圖將像素時(shí)鐘DCLK配置成9.8MHz:
至此,所有參數(shù)配置完成了嗎?沒有,還差一點(diǎn)點(diǎn)。在圖四時(shí)說過 LCD_BL_CTRL 和 LCD_DISP 2個信號線,它們不是LTDC本身具有的,是控制液晶面板必須的,需要將這兩個GPIO配置成輸出模式、并初始化成高電平:
全部配置工作完成,生成KEIL代碼。(完整代碼下載地址:https://github.com/haidongqing/ltdc-demo)
在main.c文件中,修改 MX_LTDC_Init():
0xC000 0000是圖十六配置的參數(shù),例程中圖片數(shù)據(jù)是保存在flash中的。圖片數(shù)據(jù)保存在頭文件?RGB565_480x272.h 中:
編譯、燒寫,運(yùn)行后的結(jié)果:
touchgfx用到的三大硬件接口技術(shù):FMC(SDRAM)、QaudSPI(NOR FLASH)、LTDC(TFT Panel),到今天全部介紹完了,下一步將進(jìn)入touchgfx開發(fā)的正題:使用CUBEMX從零開始配置touchgfx?。ùm(xù)......)