一、LCD简介
LCD-liquid crystal display 的简称,液晶显示器按驱动方式分为1.静态驱动、2.简单矩阵驱动及3.主动矩阵驱动。
其中,简单矩阵又可分为1.扭转向列型(TN)和超转向列型(STN)两种,而主动矩阵驱动则以TFT为主。
TN与STN都采用场电压驱动方式,如果显示尺寸加大,中心部分对电机变化的反应时间就会变长,显示器的速度跟不上。为解决这个问题,主动矩阵驱动TFT被提出,他通过晶体管显示信号开启过关闭液晶分子的电压,从而避免了显示器对电场效应的依靠。
1.1LCD常见参数:
像素 :LCD屏上所能控制最小单位
分辨率:LCD屏像素总数,一般采用“横向像素点x纵向像素点”,如320*240或640*480
位像素BPP:指某一分辨率下,每个像素点可以用多少bit来表示该点颜色。例如:16bpp表示用16bit表示像素点色彩,色彩范围是0--2^16。位像素与分辨率乘积决定显存大小。
刷新率:图像在屏幕上更新速度
物理尺寸:LCD外观对角线长度,单位为英寸。如3.5英寸、4.3英寸
1.2 LCD显示系统
S3C2440A 的LCD 控制器简介
S3C2440A 中的LCD 控制器由从位于系统存储器的视频缓冲区到外部LCD 驱动器的转移LCD 图像数据逻辑组成。LCD 控制器支持单色LCD 的单色、2 位每像素(4 阶灰度)或4 位每像素(16 阶灰度)模式,通过使用基于时间的抖动算法和帧频控制(FRC)方法,其可以连接到8 位每像素(256 色)的彩色LCD 面板和连接到12 位每像素(4096 色)的STN LCD。可以编程LCD 控制器来支持不同涉及屏幕水平和垂直像素数、数据接口的数据线宽度、接口时序和刷新率的需要。
特性
STN LCD 显示:
– 支持3 种类型的LCD 面板:4 位双扫描、4 位单扫描和8 位单扫描显示类型
– 支持单色、4 阶灰度和16 阶灰度
– 支持256 色和4096 色的彩色STN LCD 面板
– 支持多种屏幕尺寸
典型实际屏幕尺寸:640×480、320×240、160×160 等
最大虚拟屏幕尺寸为4M 字节
256 色模式最大虚拟屏幕尺寸:4096×1024、2048×2048、1024×4096 等
TFT LCD 显示:
– 支持TFT 的1、2、4、8 bpp(位每像素)调色显示
– 支持彩色TFT 的16、24 bpp 无调色显示
– 支持24 位每像素模式下最大16M 色TFT
– 支持多种屏幕尺寸
典型实际屏幕尺寸:640×480、320×240、160×160 等
最大虚拟屏幕尺寸为4M 字节
64K 色模式最大虚拟屏幕尺寸: 2048×1024 等
由SDRAM、CPU(S3C2440)、LCD驱动器、TFT型LCD共4部分组成。不管什么架构CPU,LCD显示系统组成都不会变化。一般LCD驱动器与LCD屏集成在一起。
LCD系统结构
工作原理:
1、将需要显示的图像存放在显示缓存中。S3C2440通过地址线和数据线实现对显存读取和存放。
嵌入式中没有专门的显存芯片,而是将S3C2440的内存SDRAM划出4Mbyte空间作为显示缓存。
2、LCD控制器通过数据线、控制线、时钟线将显示数据,传送给LCD驱动器。
LCD控制器集成在S3C2440(编写LCD驱动实质就是操作LCD控制器)
3、LCD驱动器将信号处理后,直接驱动TFT显示
注:
1、显存大小如何确定?显存大小=图形分辨率×位像素/8,TX2440使用东华LCD:若使用位像素为16,图形分辨率320*240,则16*320*240/8=150KB,则显存大于150KB即可。需要验证一下??
验证:通过计算程序中显存终止地址-起始地址=显存大小
rLCDSADDR1(寄存器地址0x4d000014)----设置显存的起始地址(寄存器[20:0]对应起始地址[21:1])
rLCDSADDR2(寄存器地址0x4d000018)----设置显存的终止地址(寄存器[20:0]对应终止地址[21:1])
程序中显示的帧缓冲区起始地址、结束地址定义
rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1)
rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );
其中:LCD_BUFFER---定义存放显示图像的数组unsigned short LCD_BUFFER[240][320],占用空间=240*320*2byte=150KB(unsigned short 占用2个byte)
显存大小=(终止地址-起始地址)*2=(4EBC2-3BFC2)*2=12C00*2=75KB*2=150KB 此处为什么乘以2,因为计算地址时,做了左移一位。
AXD调试时内存数据
经过上面验证可知:S3C2440的LCD控制器提供4Mbyte帧缓冲区(即LCD结构图中显存),而3.5寸的320*240LCD使用了150KB。
2、编写LCD驱动实质就是操作LCD控制器,下面重点讲解一下LCD控制器。
LCD控制器框架
由上图LCD控制框架可知:
由寄存器组REGBANK+定时器产生器TIMEGEN+视频多路开关VIDEOMUX+LPC3600(适用三星TFT屏)+LCD专用DMA LCDDMA+VIDPRCS构成,作用是:传送视屏数据以及产生需要的控制信号VFAME、VLIN 、VCLK、VM等。LCD控制器使用VD[23:0]传送图像数据到LCD驱动器。
REGBANK是17个寄存器组和调色板组成,作用是配置LCD控制器。重点
定时器产生器TIMEGEN作用:支持不同LCD驱动器接口时序图,产生VFAME、VLIN 、VCLK、VM等信号。
LCDDMA是专用DMA,自动地传送显存中像素数据,通过VD[23:0]传送到LCD驱动器。在此过程中,视屏数据不需要CPU干预,就能显示到LCD屏上。
VIDPRCS作用调整从LCDDMA接收图像数据格式,然后VD[23:0]传送到LCD驱动器。
LPC3600是专门适用三星TFT屏,TX2440使用东华LCD,所以不需要设置。
1.3 数据格式
下面以显示模式设定为TFT的16bpp为例,说明一下。由下图可知:
1、例如像P1每个像素点由16bit表示,占用视屏缓冲区2个字节(即地址000H--001H)
2、设置16bpp输出格式为5:5:1。即数据A[31:16]表示像素点1,而数据[15:0]表示像素点2。
3、图3中表示16BPP的数据在VD[23:0]传输格式。输出格式5:5:I等同5:5:1。
图1:16BPP在缓冲区存储数据格式 图2:16BPP输出视频数据格式
图3:16BPP下VD引脚描述
1.4虚拟屏、视口概念
S3C2440支持4MB的虚拟屏幕,就是指显示图像的大小最大可达4MB。4MB的图像,即使使用24bpp的模式也是一个比较大的图片(1024×1024)。为了更好的使用这个特性S3C2440对于图像数据的读取处理给出了一个直观的图像,这个图像中,可以看到屏幕可以当成一个“视口”在这个4MB的图像区域“滑动”。这个视口可大可小,但是这个一般由你的设备的屏幕决定(TX2440的屏幕为3.5寸,大小为320×240)。
S3C2440A 支持硬件水平或垂直滚屏。要实现滚屏,需要改变LCDSADDR1/2 寄存器中LCDBASEU 和LCDBASEL 的字段,删除PAGEWIDTH 和OFFSIZE 的值。 实现前提:储存在视频缓冲器中的图像应该在尺寸上大于LCD 面板屏幕 。 未测试过
上面表示虚拟屏幕的地址空间必须4MB对齐,所以取其起始地址的[30:22]表示虚拟屏幕的地址。“视口”在这个4MB的空间内“滑动”,所以“视口”的起始地址就取[21:1]就可以了,它们之间的配合是一种偏移量的配合。但是由于内存中的数据是一行行的存放,所以需要使用偏移量来描述“窗口”每一行之间的偏移量。
二、硬件
TFT屏型号:东华3.5英寸LCD
cpu:S3C2440
SDRAM:K4S561632 x 2 (32M) x 2
电路图:
开发板与LCD屏接线图 LCD屏引脚与S3C2440接线表
其中:如何设置LCD输出视频?
1、设置GPG4口为LCD_PWREN
2、设置允许LCD_PWREN输出信号,通过LCDCON5寄存器中PWREN置1
3、设置视频输出和逻辑允许,通过LCDCON1寄存器中ENVID置1
4、设置控制信号的匹配极性(LCDCON5寄存器中INVVLNE 、INNNFAME、INVVD、INVVDEN 、INVPWER)
三、软件
3.1初始化
步骤
GPIO设置初始化
显示模式初始化
帧缓冲区设置初始化
其他
//以下TFT参数:由自己根据东华3.5寸TFT(WXCAT35.PDF)中时序图和参数表
//经过验证TFT使用以下参数能正常工作
#define VBPD (15) //垂直同步信号的后肩
#define VFPD (12) //垂直同步信号的前肩
#define VSPW (3) //垂直同步信号的脉宽
#define HBPD (38) //水平同步信号的后肩
#define HFPD (20) //水平同步信号的前肩
#define HSPW (30) //水平同步信号的脉宽
#define CLKVAL_TFT (6)
#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 M5D(n) ((n) & 0x1fffff)//只取21位数据
volatile unsigned short LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];//定义帧缓冲,占用320*240*2字节
void TFT_InitHardware(void)
{
/*GPIO初始化--定义V[0]--V[23],和VM VFRAME VLINE VCLK控制信号*/
rGPCUP = 0x00000000;
rGPCCON = 0xaaaa02a9; //GPC口定义成:1、像素数据输出端口V[0]--V[7]
//2、VM VFRAME VLINE VCLK信号有效,
//3、而LCDVF2 LCDVF1 LCDVF0 LEND信号无效
rGPDUP = 0x00000000;
rGPDCON=0xaaaaaaaa; //GPD口定义成:1、像素数据输出端口V[8]--V[23]
/*显示初始化*/
rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(PNRMODE<<5)|(BPPMODE<<1)|0;
//设置VCLK的分频比为6,VM信号的触发模式=each frame,
//显示模式为 TFT LCD panel,彩色模式为16bpp TFT,ENVID=0(禁止LCD信号输出)
//像素时钟:VCLK=HCLK/[(CLKVAL+1)*2]=100M/(7*2)=7.14M(3.5寸TFT的VCLK=6.4M,大于该值即可)
rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
//rLCDCON2--设置垂直方向各信号时间参数(即列控制寄存器)
//设置VBPD=15,VFPD=12,VSPW=5和LCD panel的垂直有效宽度=239
//LINEVAL_TFT--LCD最大显示行数, LINEVAL_TFT=LCD_YSIZE_TFT-1=240-1=239
rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
//rLCDCON3--设置水平方向各信号时间参数(即行控制寄存器)
//设置HBPD=238,LCD panel的水平有效宽度=319,HFPD=20
//HOZVAL_TFT--LCD最大显示列数 HOZVAL_TFT=LCD_XSIZE_TFT-1=320-1=319
rLCDCON4=(MVAL<<8)|(HSPW);
//设置MVAL=13,HSPW=30
rLCDCON5 = (1<<11) | (0<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3) |(BSWP<<1) | (HWSWP);
//1、TFT显示模式16BPP时,使用数据格式5:6:5 2、在VCLK下降沿读取数据
//3、HSYNC脉冲的极性:反转,VSYNC脉冲的极性:反转 4、VD数据线表示数据极性:正常
//5、VDEN信号极性:正常 6、LCD_PWREN信号输出使能 7、禁止字节交换,允许半字节交换
/*帧缓冲区初始化*/
/*
LCDBANK:视屏缓冲区内存地址:30-22位
LCDBASEU:视屏缓冲区的开始地址21-1位
LCDBASEL:视屏缓冲区的结束地址21-1位
*/
/*rLCDSADDR1[29:21]表示LCDBANK,rLCDSADDR1[20:0]表示LCDBASEU*/
rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);
//在内存中设置显存(帧缓冲区)起始地址,其中LCD_BUFFER是定义存放图像的数组,
//以该数组的地址作为显存的起始地址。其中LCD_BUFFER[21:0]表示4Mbyte空间。
/*rLCDSADDR2[20:0]表示LCDBASEL*/
rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );//设置帧缓冲区结束地址
//LCDBASEL=(帧缓冲区结束地址)>>1+1
//等同 =LCDBASEU+(PAGEWITH+OFFSIZE)*(LINEVAL+1)
// =M5D((U32)LCD_BUFFER>>1+((320*240)*2)>>1)
// =M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 )
//1、为什么乘以2?因为每个像素点由2个字节即16bit组成(因为LCD设置16bpp)。如果设置为24bpp,则乘以4。
//2、为什么M5D?因为计算缓冲区起始和结束地址时只需要A[20:0]
/* LCDSADDR3用于设置虚拟屏幕
OFFSIZE:虚拟屏幕左侧偏移的半字数(半字=16bit),如果不使用虚拟屏幕,设置为0
PAGEWITH:虚拟屏幕一行的半字数,如果不使用虚拟屏幕,设置为实际屏幕行的半字数。
其中半字由16位表示,等同一个16bpp像素点
*/
rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);
//设置虚拟屏的offset size和page width
//offset size=(SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1=0
//page width=(LCD_XSIZE_TFT/1)=320
/*其他项初始化*/
rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
rTCONSEL &= (~7) ; // Disable LPC3480
rTPAL=0; // Disable Temp Palette
}
3.2显示程序
3.2.1图片显示
//=============================================================
//语法格式: void TFT_Pitcure(int x0,int y0,int h,int l,unsigned char bmp[])
//实现功能: 在屏幕上指定坐标画一个指定大小的图片
//参数:
// x0 - 图片左上角x坐标
// y0 - 图片左上角y坐标
// h - 图片的高
// l - 图片的长
// bmp[] - 图片的模
//返回值: 无
//注:用Image2LCD取模 水平扫描 16位真色彩 高位在前
//=============================================================
void TFT_Pitcure(int x0,int y0,int height,int width,unsigned char bmp[])
{
int x,y;
U32 c;
int p = 0;
for( y = y0 ; y < width ; y++ )
{
for( x = x0 ; x < height ; x++ )
{
c = bmp[p+1] | (bmp[p]<<8) ;
if ( ( (x0+x) p = p + 2 ;//LCD_BUFFER数组的数据类型:unsigned short为2个字节 } } } 3.3时序图 LCD控制器时序图 寄存器参数: VSPW:垂直同步信号的脉宽,单位为1行(Line)的时间。 VFPD: 垂直同步信号的前肩,单位为1行(Line)的时间。 VBPD: 垂直同步信号的后肩,单位为1行(Line)的时间。 LINEVAL :垂直显示尺寸-1,即屏行宽-1。HBPD:水平同步信号的后肩,单位为1VCLK的时间。 HFPD:水平同步信号的前肩,单位为1VCLK的时间。 HSPW:水平同步信号的脉宽,单位为1VCLK的时间。 HOZVAL:水平显示尺寸-1,即屏列宽-1。由上图可知:扫描一帧所需的时间:=((VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1))个行时间。 扫描一行所所需的时间:= ((HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1))个VCLK时间。而一个VCLK时间由LCD寄存器LCDCON1内的CLKVAL决定:=HCLK/[2*(CLKVAL+1)]因此扫描一帧所需的时间:T=[(VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1)]* [(HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1)]* HCLK/[2*(CLKVAL+1)]即帧频率为:1/T 东华TFT型LCD(WXCAT35)时序图 参数表 WXCAT35时序表 由以上参数表可知: 1、TFT的VCLK典型值=6.4M,所以外部提供给TFT的VCLK最好大于6.4M,这样能保证TFT正常显示。(以前提供VCLK=3.7M,导致FTF显示画面抖动)。实验板的HCLK=100M,CLKVAL=6,则 VCLK = HCLK/[(CLKVAL+1)x2]= 100/2*(6+1)= 7.14MHz,即满足要求。 2、参数设置:(由上面东华TFT型LCD(WXCAT35)时序图和表1的参数表可知) 1 、VBPD:确定帧同步信号和帧数据传输前的一段延迟时间,是帧数据传输前延迟时间和行同步时钟间隔宽度的比值。 VBPD=帧数据传输前延迟时间/行同步时钟间隔宽度=VSYNC_Back_porch/HSYNC_Period (垂直同步信号的后肩) =tvb/th=15 2、VFPD:确定帧数据传输完成后到下一帧同步信号到来的一段延迟时间,是帧数据传输后延迟时间和行同步时钟间隔宽度的比值 VFPD=帧数据传输后延迟时间/行同步时钟间隔宽度= VSYNC_front_porch/HSYNC_Period (垂直同步信号的前肩) =tvf/th=12 3、VSPW:确定帧同步时钟脉冲宽度,是帧同步信号时钟宽度和行同步时钟间隔宽度的比值 VSPW =帧数据传输后延迟时间/行同步时钟间隔宽度= VSYNC_Pulsewidth/HSYNC_Period (垂直同步信号的脉宽)
上一篇:TX2440裸机程序-触摸屏
下一篇:S3C2440时钟和电源管理
推荐阅读
史海拾趣
在市场竞争日益激烈的情况下,ARCOTRONICS公司始终坚持创新引领的发展理念。公司投入大量资源用于研发新产品,不断推出具有创新性和竞争力的电子产品。这些新品不仅满足了市场的多样化需求,还为公司带来了丰厚的利润回报,进一步巩固了公司在行业内的领先地位。
DCX-CHOL Enterprises成立于一个科技蓬勃发展的时代。公司的创始人是一群热衷于电子技术的年轻人,他们看到市场上对于高性能、低功耗芯片的巨大需求,于是决定自主研发。经过数年的艰苦努力,他们成功开发出了一款具有革命性意义的低功耗芯片,该芯片不仅性能卓越,而且成本远低于同类产品。这一创新成果迅速赢得了市场的认可,DCX-CHOL Enterprises因此获得了第一桶金,为公司后续的发展奠定了坚实的基础。
随着环保意识的提高,ECE公司积极响应环保号召,致力于推广绿色环保理念。公司采用环保材料和生产工艺,减少废弃物排放和能源消耗。同时,ECE公司还积极参与环保公益活动,宣传环保知识,提高公众的环保意识。这些努力使ECE公司成为电子行业中绿色环保的倡导者和实践者。
进入20世纪30年代,Hammond迎来了其发展历程中的一个重要转折点。在1930年代初,Hammond成为加拿大第一家生产两柱式机架和窄柜系列产品的公司,这些产品迅速获得了广播和通讯行业的青睐。这一创举不仅巩固了Hammond在业内的地位,还为其后续在电气、电子行业的全面发展铺平了道路。
为了提高产品质量,意华先后通过了ISO9001、ISO14001、IECQC080000等多项国际质量管理体系认证。这些认证不仅证明了公司的质量管理水平,也为客户提供了更可靠的产品保障。通过持续的质量改进和过程控制,意华的产品质量得到了显著提升,赢得了更多客户的认可。
随着业务的不断发展,Cherry将目光投向了更广阔的市场。1967年,随着个人计算机的普及,Cherry看到了键盘市场的巨大潜力,于是决定引进键盘生产线。不久之后,Cherry建造了世界上第一个键盘工厂,开始生产高质量的键盘产品。这一决策为Cherry公司后来的发展奠定了坚实的基础。
我想自己做一个播放器,大致功能如下 功能 1、通过VGA(主要接液晶电视)或者AV输出,能够顺畅播放realplay所支持的影视格式。 2、通过无线网络访问其他计算机的文件。 大致列了如下配置单: 硬件配置表 1、CPU主频400MHz 以上 2、64MBtyes SD ...… 查看全部问答∨ |
|
在XC2VP30的开发板上编写DDR的控制器,对于一个256MB的DDR内存,它有三对输入时钟CLK0、~CLK0、CLK1、~CLK1、CLK2、~CLK2和两个CKE。现在想请教一下,这三对时钟是要输入同频同相的时钟信号吗?还是怎么样?两个CKE是用来干什么的?… 查看全部问答∨ |
运行结果提示:the arc between pins \'CK\' and \'D\' is negative, which is not allowed. To make it positive, the maximum hold value has been adjusted from 0.729405 to 0.782819.请问:1. 修改那里,才能保证是正值。 ...… 查看全部问答∨ |
本帖最后由 dontium 于 2015-1-23 13:27 编辑 我要做一个语音端点检测的程序,用的vpm642的开发板,aic23b语音芯片,用EDMA输入和输出采集的语音信号,使用了输出和输出两个pingpong缓存,在输入ping或pong缓存接受完数据后产生中断,将数据做fft ...… 查看全部问答∨ |
|
最近搞个板子,使用Mega128访问DS3231SN,可是数据读取始终为0,不知何故,请大家帮忙看一下代码,看看哪有问题,谢谢。 上拉电阻为10K。 #ifndef _ds3231_h#define _ds3231_h //============================= ...… 查看全部问答∨ |