本文所用的是东华TFT液晶屏(WXCAT35),配置为常用的16BPP(5:6:5)模式。
外部引脚信号:
VSYNC: 垂直同步信号,表示扫描1帧的开始
HSYNC: 水平同步信号,表示扫描1行的开始
VCLK:像素时钟信号
VDEN:数据使能信号
VD[23:0] : LCD像素数据输出端口
LEND/STH:行结束信号(TFT)/SEC TFT信号
LCD_LPCOE:SEC TFT OE信号
LCD_LPCREV:SEC TFT REV信号
LCD_LPCREVB:SEC TFT REVB信号
寄存器参数:
VSPW(vertical sync pulse width) :垂直同步信号的脉宽,单位为1行(Line)的时间
VFPD(vertical front porch) : 垂直同步信号的前肩,单位为1行(Line)的时间
VBPD(vertical back porch) : 垂直同步信号的后肩,单位为1行(Line)的时间
LINEVAL :垂直显示尺寸-1,即屏竖直方向像素-1
HSPW(horizontal sync pulse width) :水平同步信号的脉宽,单位为1VCLK的时间
HBPD(horizontal back porch) :水平同步信号的后肩,单位为1VCLK的时间
HFPD(horizontal front porth) :水平同步信号的前肩,单位为1VCLK的时间
HOZVAL:水平显示尺寸-1,即屏水平方向像素-1
如240x320屏幕: LINEVAL=239 ; HOZVAL=319
由上图可知:
扫描一帧的时间 =((VSPW+1) + (VBPD+1) + ( LINEVAL+1) + (VFPD+1)) * 行时间
扫描一行的时间 =((HSPW+1) + (HSPD+1+(HFPD+1)+ (HOZVAL+1)) * VCLK时间
一个VCLK的时间 =HCLK/[2*(CLKVAL+1)]
则:
扫描一帧所需的时间 =[(VSPW+1)+(VBPD+1)+(LINEVAL+1)+(VFPD+1)]* [(HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1)]*HCLK/[2*(CLKVAL+1)]
先看一下TFT屏的操作时序图: 东华TFT型LCD(WXCAT35)时序图
//2440A寄存器参数
#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 MSB\LSB设置
#define HWSWP (1) //Half word swap control 高16bit与低16bit交换
#define PNRMODE (3) // 设置为TFT屏 11B为TFT模式
#define BPPMODE (12) // 设置为16bpp模式
//东华屏参数
#define VBPD (15-1) //15垂直同步信号的后肩 参数见 东华pdf
#define VFPD (12-1) //12 垂直同步信号的前肩
#define VSPW (3-1) //3垂直同步信号的脉宽
#define HBPD (38-1) //(22)水平同步信号的后肩
#define HFPD (20-1) //(33)水平同步信号的前肩
#define HSPW (30-1) //(44)水平同步信号的脉宽
#define CLKVAL_TFT (6) //由以下计算可知:6
//屏大小
#define LCD_XSIZE_TFT (240)//屏实际列数
#define LCD_YSIZE_TFT (320)// 屏实际行数
#define SCR_XSIZE_TFT (240) //虚拟屏列数
#define SCR_YSIZE_TFT (320) //虚拟屏行数
#define HOZVAL_TFT (LCD_XSIZE_TFT-1)
#define LINEVAL_TFT (LCD_YSIZE_TFT-1)
以上有关东华屏参数设置,在PDF中如下所示:
因为CLKVAL= int(HCLK/(VCLK*2)-1);
若设置HCLK=100M,其中VCLK即上图的DCL; 先带入经典值:6.4M, 则CLKVAL="int"(100/12.8-1)=int(6.8)=6. 设置CLKVAL为6重新计算VCLK=DCLK=HCLK/[(CLKVAL+1)x2]= 100/2*(6+1)= 7.14MHz
VFRAME=HCLK/[(CLKVAL+1)x2]/{(VSPW+1+VBPD+1+LCD_YSIZE_TFT+VFPD+1)*(HSPW+1+HSPD+1+HFPD+1+LCD_XSIZE_TFT)}=64.4HZ
有些液晶屏给的参数单位可能不一样,需要自己计算。
方法如下:
VBPD:确定帧同步信号和帧数据传输前的一段延迟时间,是帧数据传输前延迟时间和行同步时钟间隔宽度的比值,如图,VBPD=t3/t6=1.02 mS/31.77μs=32。
VFPD:确定帧数据传输完成后到下一帧同步信号到来的一段延迟时间,是帧数据传输后延迟时间和行同步时钟间隔宽度的比值,如图,VFPD=t5/t6=0.35 ms/31.77μs=11。
VSPW:确定帧同步时钟脉冲宽度,是帧同步信号时钟宽度和行同步时钟间隔宽度的比值。如图,VSPW=t2/t6=0.06 ms/31.77μs=2。
HBPD:确定行同步信号和行数据传输前的一段延迟时间,描述行数据传输前延迟时间内VCLK脉冲个数,如图,VBPD=t7×VCLK=1.89 μs×25MHz=47。
HFPD:确定行数据传输完成后到下一行同步信号到来的一段延迟时间,描述行数据传输后延迟时间内VCLK脉冲个数,如图,HFPD=t9×VCLK=0.94 μs×25 MHz="24"。
HSPW:确定行同步时钟脉冲宽度。描述行同步脉冲宽度时间内VCLK脉冲个数,如图,HSPW=3.77μs×25 MHz="94"。
S3C2440A LCD控制器配置
1. LCDCON1寄存器
rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(PNRMODE<<5)|(BPPMODE<<1)|0;
其中:CLKVAL_TFT = 6;MMODE = MVAL_USED = 0;PNRMODE=3;BPPMODE=12。
ENVID=0(关闭视屏输出,需要开启显示是设为1)。
2. LCDCON2寄存器
rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW); 相关值见上文宏定义
3. LCDCON3寄存器
rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD); 相关值见上文宏定义
4. LCDCON4寄存器
rLCDCON4=(MVAL<<8)|(HSPW); 相关值见上文宏定义
5. LCDCON5寄存器
rLCDCON5 = (1<<11) | (1<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3) |(BSWP<<1) | (HWSWP);关于信号的极性 图二(东华TFT型LCD(WXCAT35)时序图)其中BSWP与数据存放有关见下文。
6. LCDSADDR1寄存器
volatile unsigned short LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];//全局变量
#define M5D(n) ((n) & 0x1fffff) // To get lower 21bits
rLCDSADDR1=(((U32)LCD_BUFFER>>22)<
7. LCDSADDR2寄存器
rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );
//单位为字节 一个点16bit=2字节
8. LCDSADDR3寄存器
rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);
// 1=*16bit/半字=16/16
LCD初始化程序:
void Lcd_Init(void)
{
//引脚功能初始化
rGPCUP = 0x00000000;
rGPCCON = 0xaaaa02a9;
rGPDUP = 0x00000000;
rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]
rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(PNRMODE<<5)|(BPPMODE<<1)|0;
// TFT LCD panel,16bpp TFT,ENVID=off(Disable the video output and the LCD control signal)
rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
rLCDCON4=(MVAL<<8)|(HSPW);
rLCDCON5 = (1<<11) | (1<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3) |(BSWP<<1) | (HWSWP);
//5:6:5
rLCDSADDR1=(((U32)LCD_BUFFER>>22)<
rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );//单位为字节 一个点16bit=2字节
rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);// 1=*16bit/半字=16/16
rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
rTCONSEL &= (~7) ; // Disable LPC3480
rTPAL=0; // Disable Temp Palette
}
16BPP模式特点:
内存数据格式:
数据引脚输出:没有用到的引脚可用作GPIO
要显示图像,只要向LCD_BUFFER[]先入像素数据(R(5):G(6):B(5))。LCD控制器会自动通过DMA读取数据送往TFT LCD显示。
上一篇:关于STM32F4的IAP的一点点记录
下一篇:s3c2440裸板_时钟系统及定时器
推荐阅读最新更新时间:2024-03-16 16:22