本文轉自: http://blog.mcuol.com/User/colinluan/Article/42955_1.htm
本次筆記主要針對 2440 的 TFT 液晶而言 , 開發板爲 TQ2440 。
一、 2440 LCD 特點
TFT 型 LCD 顯示屏
-支持 1 位、 2 位、 4 位和 8 位(每像素)調色板 TFT 顯
-支持 16 位 / 像素非調色板真彩色 TFT 顯示
-支持 24 位 / 像素非調色板真彩色 TFT 顯示
- 24 位 / 像素模式下最大支持 16M 彩色 TFT
-支持多種屏幕尺寸
典型分辯率爲 640*480 、 320*240 、 160*160 及其它多種
最大虛擬顯示達 4Mbytes 。
虛擬顯示尺寸在 64K 模式下: 2048 × 1024 及其它
二、 TFT LCD 配置
1 、 CLKVAL,VCLK
CLKVAL 在 LCDCON1[17:8] 中設置,這些位決定了 VCLK 的頻率, VCLK 便是 LCD 的操作頻率。
VCLK=HCLK/((CLKVAL+1)*2)
TQ2440 中 FCLK 設置爲 400M ,FCLK:HCLK:PCLK=1:4:8, 可知 HCLK 的的頻率爲 100M ,查閱 LCD 模組手冊的操作頻率 ,這裏設置 CLKVAL=6 ,則
VCLK=100M/((6+1)*2)=7.14M
2 、 SYNC 、 HYNC,VDEN
VBPD 、 LINEVAL 、 VFPD 、 VSPW
HBPD 、 HOZVAL 、 HFPD 、 HSPW
VSYNC 是垂直同步信號 ,在每進行一個幀(即一個屏)的掃描之前,該信號就有效一次,由該信號可以確定 LCD 的場頻,即每秒屏幕刷新的次數(單位 Hz )。
HSYNC 是水平同步信號 ,在每進行一行的掃描之前,該信號就有效一次,由該信號可以確定 LCD 的行頻,即每秒屏幕從左到右掃描一行的次數(單位 Hz )。
其中 VSYNC 是幀同步信號, VSYNC 每發出 1 個脈衝,就意味着新的 1 屏視頻資料開始發送。
HSYNC 爲行同步 信號,每個 HSYNC 脈衝都表明新的 1 行視頻資料開始發送。
VDEN 則用來標明視頻資料的有效
在每一幀時鐘信號中,還會有一些與屏顯示無關的時鐘出現,這就給確定行頻和場頻帶來了一定的複雜性。如在 HSYNC 信號先後會有水平同步信號前肩( HFPD ) 和水平同步信號後肩( HBPD ) 出現,在 VSYNC 信號先後會有垂直同步信號前肩( VFPD ) 和垂直同步信號後肩( VBPD ) 出現,在這些信號時序內,不會有有效像素信號出現,另外 HSYNC 和 VSYNC 信號有效時,其電平要保持一定的時間,它們分別叫做水平同步信號脈寬 HSPW 和垂直同步信號脈寬 VSPW ,這段時間也不能有像素信號。因此計算行頻和場頻時,一定要包括這些信號。
關於 VBPD 、 LINEVAL 、 VFPD 、 VSPW 、 HBPD 、 HOZVAL 、 HFPD 、 HSPW 的配置 LCD 手冊上一般都會給出。
幀頻 (VSYNC 頻率 )=1/(((VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1))*
((HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)) * (2*(CLKVAL+1)/(HCLK)) )
在 TQ2440 的測試程序中:
//Timing parameter for 3.5'' LCD
#define VBPD (12) // 垂直同步信號的後肩
#define VFPD (4) // 垂直同步信號的前肩
#define VSPW (5) // 垂直同步信號的脈寬
#define HBPD (22) // 水平同步信號的後肩
#define HFPD (33) // 水平同步信號的前肩
#define HSPW (44) // 水平同步信號的脈寬
#define HOZVAL_TFT (LCD_XSIZE_TFT-1)
#define LINEVAL_TFT (LCD_YSIZE_TFT-1)
//TFT_SIZE
#define LCD_XSIZE_TFT (320)
#define LCD_YSIZE_TFT (240)
所以幀頻 = 1/( ((5+1)+(12+1)+(239+1)+(4+1)) * ((5+1)+(22+1)+(33+1)+((319+1))*
(2*(6+1))/100M))
= 1/(264*380*0.14us)
= 71Hz
3 、 LCDBANK 、 LCDBASEU 、 LCDBASEL
OFFSIZE 、 PAGEWIDTH
(1)LCDBANK 在 LCDADDR11[29:21 ] 中配置,存放的是顯示緩存地址的 A[30:22] ,即爲顯示緩存的基地址。
例 1 :顯示緩存存放在如下:
volatile unsigned short LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];
則 LCDBANK=LCD_BUFFER>>22
(2)LCDBASEU 在 LCDADR11[20:0] 中配置 ,顯示緩存的開始地址 A[21:1] 。
例 2 : LCD_BUFFER 的開始地址
#define M5D(n) ((n) & 0x1fffff) // 低 21bits 掩碼
LCDBASEU=M5D((LCD_BUFFER)>>1); // 取出 A[21:1] 位地址放入 LCDBASEU
(3)LCDBASEL 在 LCDADDR2[20:0] 中配置 ,顯示緩存的結束地址 A[21:1] 。
LCDBASEL = ((the fame end address) >>1) + 1
= LCDBASEU +(PAGEWIDTH+OFFSIZE)*(LINEVAL+1)
例 3 : LCDBUFFER 的結束地址 .
LCD 爲 16bitTFT,OFFSIZE=0,LINEVAL=240,PAGEWIDTH=320*16bit/16=320
LCDBASEL=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );
(4)OFFSIZE
:用於虛擬屏幕的偏移長度,如果我們不使用虛擬屏幕,就把它置爲
0
。
(5)PAGEWIDTH
:定義了視口的寬,單位是半字
.
三、 LCD 的初始化工作
#define MVAL (13)
#define MVAL_USED (0) //0=each frame 1=rate by MVAL
#define INVVDEN (1) //0=normal 1=inverted
#define BSWP (0) //Byte swap control
#define HWSWP (1) //Half word swap control
#define PNRMODE (3) // 設置爲 TFT 屏
#define BPPMODE (12) // 設置爲 16bpp 模式
//TFT_SIZE
#define LCD_XSIZE_TFT (320)
#define LCD_YSIZE_TFT (240)
#define SCR_XSIZE_TFT (320)
#define SCR_YSIZE_TFT (240)
#define HOZVAL_TFT (LCD_XSIZE_TFT-1)
#define LINEVAL_TFT (LCD_YSIZE_TFT-1)
//Timing parameter for 3.5'' LCD
#define VBPD (12) // 垂直同步信號的後肩
#define VFPD (4) // 垂直同步信號的前肩
#define VSPW (5) // 垂直同步信號的脈寬
#define HBPD (22) // 水平同步信號的後肩
#define HFPD (33) // 水平同步信號的前肩
#define HSPW (44) // 水平同步信號的脈寬
#define CLKVAL_TFT (6)
volatile unsigned short LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];
rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
rLCDCON4=(MVAL<<8)|(HSPW);
rLCDCON5 = (1<<11) | (0<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3) |(BSWP<<1) | (HWSWP);
rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);
rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );
rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);
1 、 rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
通過 CLKCAL 設置 VCLK
#define CLKVAL_TFT (6)
FCLK=400MHz,FCLK:HCLK:PCLK=1:4:8
HCLK=100MHz
VCLK=100MHz/((6+1)*2)=7.14MHz
設置 LCD 爲 TFT 顯示
設置 LCD 爲 16 位 TFT
視頻輸入和控制信號無效 (ENVID) ,等完全配置好後再使能。
2 、 rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
配置 VBPD,VFPD,VSPW , LINEVAL, 這幾個參數可以參考 LCD 手冊
3 、 rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
配置 HBPD,HOZVAL,HFPD ,這幾個參數可以參考 LCD 手冊
4 、 rLCDCON4=(MVAL<<8)|(HSPW);
配置 HSPW, 此參數可以參考 LCD 手冊
5 、 rLCDCON5 = (1<<11) | (0<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3) |(BSWP<<1) | (HWSWP);
RGB 爲 5:6:5 模式
VCLK 下降沿時取數據
HSYNC,VSYNC 極性反轉
VD 極性正常
VDEN 極性正常
PWEN 有效
不可字節交換
可以半字交換
6 、 rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);
設置 LCDBANK 以及 LCDBASEU
7rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 )
設置 LCDBASEL
8 、 rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);
設置 OFFSIZE 以及 PAGEWIDTH
9 、
rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
rTCONSEL &= (~7) ; // Disable LPC3600
rTPAL=0; // Disable Temp Palette
Lcd_PowerEnable(0, 1);
Lcd_EnvidOnOff(1); //turn on vedio
小結:
仔細研讀 2440 的 LCD 這一節,對 LCD 有了初步的理解,可以對 TFTLCD 進行相關的配置。
配置時還需參考 LCD 模組手冊,得到相關的時序。
注意各個引腳以及各個寄存器的作用。
例程均參考自 TQ2440 測試程序。