ARM9 mini2451裸机学习——LCD学习(1)

基础知识:

LCD概述:
    LCD(Liquid Crystal Display),即液晶显示器,是一种采用了液晶控制透光度技术来实现色彩的显示器。LCD有多种类型,比如STN、TFT、LTPS TFT、OLED等。CPU或显卡发出的图像数据是TTL信号,LCD本身接收的也是TTL信号。由于TTL信号在高速率的长距离传输时性能不佳,抗干扰能力也比较差,后来又提出了多种接口,比如LVDS、TMDS、GVIF、P&D、DVI和DFP等。它们实际上只是将CPU或显卡发出的TTL信号编码成各种信号以便传输,在LCD侧将接收到的信号进行解码得到TTL信号。  

TFT LCD接口信号
•VSYNC
     该信号表示显示新一帧图像数据的开始
•HSYNC
     该信号表示显示一行数据的开始
•VCKL
     该信号表示像素时钟,每个VCLK周期显示一个像素
•LEDN
    该信号表示一行的结束
•VD[23:0]
  该信号表示像素数据输入   

图像的显示原理
    完整的一幅图像被称为一帧(frame),每帧由多行组成,每行由多个像素组成,每个像素使用若干位二进制数来表示,如8BPP。
    显示器从屏幕的左上角开始,一行一行地取得每个像素的数据并显示出来。当显示到一行的最右边一个像素时,自动跳到下一行的最左边开始显示下一行;当显示完所有行后,跳到左上方开始下一帧。显示器沿着“Z”字形的路线进行扫描。
    扫描过程中,使用HSYNC、VSYNC信号来控制扫描路线的跳转:HSYNC表示“是跳到最左边的时候了”,VSNYC表示“是跳到最上边的时候了”。
    VSYNC信号出现的频率表示一秒钟内能显示多少帧图像,称为垂直频率或场频率;HSYNC信号出现的频率称为水平频率。

有效数据的列数×行数即分辨率
ARM9 mini2451裸机学习——LCD学习(1)_第1张图片

时序分析
ARM9 mini2451裸机学习——LCD学习(1)_第2张图片
(1) VSYNC 信号有效时,表示一帧数据的开始。
(2) VSPW 表示 VSYNC 信号的 脉冲宽度 (VSPW+1) HSYNC 信号周期,即 (VSPW+1) 行,这 (VSPW+1) 行的数据无 效。
(3) VSYNC 信号脉冲之后,还要经过 (VBPD+1) HSYNC 信号周期,有效的行数据才出现。因此, VSYNC 信号有效 之后,总共还要经过 (VSPW+1+VBPD+1) 个无效的行,第 1 个有效的行才出现
(4) 随后即连续发出 (LINEVAL+1) 行的有效数据。
(5) 最后是 (VFPD+1) 个无效的行,完整的一帧结束,紧接着就是下一帧的数据 ( 即下一个 VSYNC 信号 )    



ARM mini2451知识:

我们使用的2451的LCD屏为480*272  24位彩屏。
一个像素为四个字节,分别为 :灰度,红色,绿色,蓝色。

一、Mini2451 LCD 的接口
ARM9 mini2451裸机学习——LCD学习(1)_第3张图片
ARM9 mini2451裸机学习——LCD学习(1)_第4张图片


二、LCD 初始化步骤
① 配置 GPIO 用于 LCD 相关的功能
看 LCD 相关电路,相关的 GPIO 为 GPB,GPC,GPD
主要设置 GPC、GPD 为特殊功能引脚
GPCCON = 0xAAAAAAAA;
GPDCON = 0xAAAAAAAA;
② 打开 LCD 背光
设置 GPB1 为输出,并设置为高电平
③ 配置接口类型,时钟,极性和 LCD 控制器等(配置寄存器 VIDCON0)
A. 设置 LCD 控制器输出数据格式为 RGB I/F(b’00)
ARM9 mini2451裸机学习——LCD学习(1)_第5张图片

B. 设置显示模式为 RGB 并行模式(b’00)
ARM9 mini2451裸机学习——LCD学习(1)_第6张图片

C. 设置 VCLK 时钟频率(9),设置 VCLK 为 13.3M


D. 打开 VCLK 使能(b’1)


E. 选择时钟分频(b’1)


F. 选择时钟源(b’00)
ARM9 mini2451裸机学习——LCD学习(1)_第7张图片


G. 使能图形输出(b’11)

ARM9 mini2451裸机学习——LCD学习(1)_第8张图片

④ 设置时钟极性(VIDCON1),(b’1,b’1)



⑤ 配置时序
A. 设置 VBPD,VFPD,VSPW(VIDTCON0)

ARM9 mini2451裸机学习——LCD学习(1)_第9张图片


B. 设置 HBPD,HFPD,HSPW(VIDTCON1)

ARM9 mini2451裸机学习——LCD学习(1)_第10张图片

这里给出参考值:
#define HSPW (0)
#define HBPD (40- 1)
#define HFPD (5 - 1)
#define VSPW (0)
#define VBPD (8 - 1)
#define VFPD (8 - 1)

⑥ 设置长宽(VIDTCON2)


Vertical :列数设置 272 - 1
Horizontal :行数设置为 480 - 1


⑦ 配置 WINDOW0 的数据格式(打开 window0,设置数据格式为 24bpp,b’1011)

ARM9 mini2451裸机学习——LCD学习(1)_第11张图片

⑧ 配置 WINDOW0 的坐标系(即设置 WINDOW0 大小)

ARM9 mini2451裸机学习——LCD学习(1)_第12张图片

如果设置满屏,则 OSD_LeftTopX_F = 0, OSD_LeftTopX_F = 0;
OSD_RightBotX_F = 479, OSD_RightBotY_F = 271
⑨ 设置 FRAMEBUF 起始地址,结束地址,buf 大小
VIDW00ADD0B0 设置起始地址
VIDW00ADD1B0 设置结束地址
VIDW00ADD2B0 设置 BUF 大小


下面贴上源代码:

#define VIDCON0			(*(volatile unsigned *)0x4c800000)	
#define VIDCON1			(*(volatile unsigned *)0x4c800004)	
#define VIDTCON0		(*(volatile unsigned *)0x4c800008)	
#define VIDTCON1		(*(volatile unsigned *)0x4c80000C)	
#define VIDTCON2		(*(volatile unsigned *)0x4c800010)	
#define WINCON0			(*(volatile unsigned *)0x4c800014)	
#define WINCON1			(*(volatile unsigned *)0x4c800018)	
#define VIDOSD0A		(*(volatile unsigned *)0x4c800028)	
#define VIDOSD0B		(*(volatile unsigned *)0x4c80002C)
#define VIDOSD1A		(*(volatile unsigned *)0x4c800034)	
#define VIDOSD1B		(*(volatile unsigned *)0x4c800038)	
#define VIDOSD1C		(*(volatile unsigned *)0x4c80003C)	
#define VIDW00ADD0B0	(*(volatile unsigned *)0x4c800064)	
#define VIDW00ADD0B1	(*(volatile unsigned *)0x4c800068)	
#define VIDW01ADD0		(*(volatile unsigned *)0x4c80006C)	
#define VIDW00ADD1B0	(*(volatile unsigned *)0x4c80007C)	
#define VIDW00ADD1B1	(*(volatile unsigned *)0x4c800080)	
#define VIDW01ADD1		(*(volatile unsigned *)0x4c800084)	
#define VIDW00ADD2B0	(*(volatile unsigned *)0x4c800094)	
#define VIDW00ADD2B1	(*(volatile unsigned *)0x4c800098)	
#define VIDW01ADD2		(*(volatile unsigned *)0x4c80009C)	
#define VIDINTCON		(*(volatile unsigned *)0x4c8000AC)	
#define W1KEYCON0		(*(volatile unsigned *)0x4c8000B0)	
#define W1KEYCON1		(*(volatile unsigned *)0x4c8000B4)	
#define W2KEYCON0		(*(volatile unsigned *)0x4c8000B8)	
#define W2KEYCON1		(*(volatile unsigned *)0x4c8000BC)	
#define W3KEYCON0		(*(volatile unsigned *)0x4c8000C0)	
#define W3KEYCON1		(*(volatile unsigned *)0x4c8000C4)	
#define W4KEYCON0		(*(volatile unsigned *)0x4c8000C8)	
#define W4KEYCON1		(*(volatile unsigned *)0x4c8000CC)	
#define WIN0MAP			(*(volatile unsigned *)0x4c8000D0)	
#define WIN1MAP			(*(volatile unsigned *)0x4c8000D4)	
#define WPALCON			(*(volatile unsigned *)0x4c8000E4)	
#define SYSIFCON0		(*(volatile unsigned *)0x4c800130)	
#define SYSIFCON1		(*(volatile unsigned *)0x4c800134)	
#define DITHMODE1		(*(volatile unsigned *)0x4c800138)	
#define SIFCCON0		(*(volatile unsigned *)0x4c80013C)	
#define SIFCCON1		(*(volatile unsigned *)0x4c800140)	
#define SIFCCON2		(*(volatile unsigned *)0x4c800144)	
#define CPUTRIGCON1		(*(volatile unsigned *)0x4c80015C)	
#define CPUTRIGCON2		(*(volatile unsigned *)0x4c800160)	
#define VIDW00ADD0B1	(*(volatile unsigned *)0x4c800068)	
#define VIDW01ADD0		(*(volatile unsigned *)0x4c80006C)	
#define GPCCON			(*(volatile unsigned *)(0x56000020))	
#define GPCDAT			(*(volatile unsigned *)(0x56000024))	
#define GPCUDP			(*(volatile unsigned *)(0x56000028))	
#define GPDCON			(*(volatile unsigned *)(0x56000030))	
#define GPDDAT			(*(volatile unsigned *)(0x56000034))	
#define GPDUDP			(*(volatile unsigned *)(0x56000038))	
#define MISCCR			(*(volatile unsigned *)(0x56000080))	
#define GPLCON			(*(volatile unsigned *)(0x560000f0))	
#define GPLDAT			(*(volatile unsigned *)(0x560000f4))	
#define GPBCON 			(*(volatile unsigned long *)0x56000010)
#define GPBDAT 			(*(volatile unsigned long *)0x56000014)
#define GPGCON 			(*(volatile unsigned long *)0x56000060)
#define GPGDAT 			(*(volatile unsigned long *)0x56000064)

#define HSPW (0)
#define HBPD (40- 1)
#define HFPD (5 - 1)
#define VSPW (0)
#define VBPD (8 - 1)
#define VFPD (8 - 1)

unsigned long FRAME_BUFFER[272][480];

void lcd_init(void)	//lcd初始化
{
	GPCCON = 0xaaaaaaaa;	//配置GPC,GPD特殊功能口
	GPDCON = 0xaaaaaaaa;
	GPBCON &= ~(0x3<<2);	//对要操作的位清零
	GPBCON |= (0x1<<2);	//配置GPB1
	GPBDAT |= (0x1<<1);	//打开背光
	VIDCON0 = 0;	//清零
	VIDCON0 = (0x0<<22)|(0x0<<13)|(9<<6)|(1<<5)|(1<<4)|(0x3<<0);	//设置接口类型,时钟,极性和 LCD 控制器
	VIDCON1 = 0;	//清零
	VIDCON1 |= (1<<6)|(1<<5);	//设置时钟极性
	VIDTCON0 = 0;
	VIDTCON1 = 0;
	VIDTCON0 |= (VBPD<<16)|(VFPD<<8)|(VSPW<<0);	//配置时序
	VIDTCON1 |= (HBPD<<16)|(HFPD<<8)|(HSPW<<0);
	VIDTCON2 = 0;
	VIDTCON2 |= (271<<11)|(479<<0);		//设置长宽
	WINCON0 = 0;
	WINCON0 |= (0xb<<2)|(1<<0);		// 配置 WINDOW0 的数据格式
	VIDOSD0A = 0;
	VIDOSD0A |= (0<<11)|(0<<0);		//配置 WINDOW0 的坐标系(左上角)
	VIDOSD0B = 0;
	VIDOSD0B |= (479<<11)|(271<<0);		//配置 WINDOW0 的坐标系(右下角)

	
	VIDW00ADD0B0 = (unsigned long)FRAME_BUFFER;	//设置 FRAMEBUF 起始地址,结束地址
	VIDW00ADD1B0 = (unsigned long)FRAME_BUFFER+sizeof(FRAME_BUFFER);
}

void chear_test(void)	//检测,全屏红色
{
	unsigned int x,y;
	
	for(y=0; y<272; y++)
	{
		for(x=0; x<480; x++)
		{
			FRAME_BUFFER[y][x] = 0x00ff0000;	//红色
		}
	}
}




你可能感兴趣的:(ARM)