免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1359 | 回复: 0
打印 上一主题 下一主题

MICRO2440 LCD学习 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-20 09:44 |只看该作者 |倒序浏览
开发板:micro2440,TFT,统宝3.5英寸,240×320分辨率,16bpp驱动
电路图分析:
            




  1. /**************************************************************
  2. 240*320 TFT LCD数据和控制端口初始化
  3. **************************************************************/
  4. static void Lcd_Port_Init( void )
  5. {
  6.     rGPCUP=0xffffffff; // Disable Pull-up register
  7.     rGPCCON=0xaaaa02a8; //Initialize VD[7:0],VM,VFRAME,VLINE,VCLK

  8.     rGPDUP=0xffffffff; // Disable Pull-up register
  9.     rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]
  10. }
下面看看寄存器:


功能模块:

REGBANK LCD控制器的寄存器组

LCDCDMA 则是LCD控制器专用的DMA信道

TIMEGEN LPC3600 负责产生 LCD屏所需要的控制时序

图像信息经VIDPRCS VD[23:0]发送给LCD


信号解释:

VSYNC: 帧同步信号,表示扫描1帧的开始,一帧也就是LCD显示的一个画面。

HSYNC: 行同步信号,表示扫描1行的开始。

VDEN:数据使能信号。

VD[23:0] : LCD像素数据输出端口。

VCLK:像素时钟信号。


寄存器参数:

VSPW:帧同步信号的脉宽,单位为1行(Line)的时间。

VFPD: 帧同步信号的前肩,单位为1行(Line)的时间。

VBPD: 帧同步信号的后肩,单位为1行(Line)的时间。

HOZVAL: 240屏宽

LINEVAL: 320屏高

HBPD:行同步信号的后肩,单位为1VCLK的时间。

HFPD:行同步信号的前肩,单位为1VCLK的时间。

HSPW:行同步信号的脉宽,单位为1VCLK的时间。、



这八个值参看,LCD的数据手册:

#define LCD_HOZVAL 240

#define LCD_LINEVAL 320

#define LCD_CLKVAL 8


#define LCD_HBPD 20

#define LCD_HFPD 10

#define LCD_HSPW 10


#define LCD_VBPD 2

#define LCD_VFPD 2

#define LCD_VSPW 2

下面看寄存器:

LCDCON1:

VCLK=100/((8+1)*2)=5.55MHZ,LCD数据手册推荐值

MMODE VM=0信号的触发模式(仅对STN屏有效,对TFT屏无意义)。

TFT面板,16bpp(RGB565)

ENVID :使能LCD信号输出。


LCDCON2:

#define LCD_VBPD 2

#define LCD_VFPD 2

#define LCD_VSPW 2

lineval=320


LCDCON3/4:

#define LCD_HBPD 20

#define LCD_HFPD 10

#define LCD_HSPW 10

hozval=240


LCDCON5:

VSTATUS :00
HSTATUS
:00
BPP24BL
:16bpp模式不用设置,

FRM565 :对于16bpp显示模式,5:6:516bit RGB(5:6:5)资料中,红色(R)占了5bit,绿色(G)占了6bit,兰色(B)占了5bit

 INVVCLK ,VCLK下降沿,,,电源允许,半字交换 
INVLINE 帧反转 
INVFRAME 行反转 
INVVD 正常

INVVDEN ,正常 
INVPWREN 正常
INVLEND   正常

PWREN
电源允许
ENLEND
对普通的TFT屏无效,可以不考虑。

BSWP    禁止
HWSWP  允许


配置显存地址:直接把要显示的东东扔进这个二维数组即可显示

rLCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((LCD_ADDR >> 1) <<  0);
rLCDSADDR2 = (LCD_ADDR >> 1) + LCD_HOZVAL * LCD_LINEVAL;
rLCDSADDR3 = LCD_HOZVAL;  //不是用虚拟屏幕

禁止中断
不使用调色板
TCONSEL:为三星显示器特有,所以除分辨率设为240*320外,其他都设为0

  1. /**************************************************************
  2. 240*320 TFT LCD功能模块初始化
  3. **************************************************************/
  4. static void LCD_Init(void)
  5. {
  6.     #define LCD_ADDR ((U32)LCD_BUFFER)
  7.     
  8.     rLCDCON1 = (LCD_CLKVAL << 8) | (3 << 5) | (12 << 1);//VCLK=100/18=5.55MHZ,每帧,TFT,16bpp,禁止输出
  9.        rLCDCON2 = (LCD_VBPD << 24) | ((LCD_LINEVAL - 1) << 14) | (LCD_VFPD << 6) | (LCD_VSPW << 0);//VBPD=2,VLINE=320,VFPD=2,VSPW=2
  10.        rLCDCON3 = (LCD_HBPD << 19) | ((LCD_HOZVAL - 1) << 8) | (LCD_HFPD << 0);//HBPD=20,HOZVAL=240,HFPD=10
  11.        rLCDCON4 = (13 << 8) | (LCD_HSPW << 0);//HSPW=10
  12.     rLCDCON5 = ((1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0));//16bpp的5:6:5格式,VCLK下降沿,帧反转,行反转,电源允许,半字交换

  13.     rLCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((LCD_ADDR >> 1) << 0);
  14.     rLCDSADDR2 = (LCD_ADDR >> 1) + LCD_HOZVAL * LCD_LINEVAL;
  15.     rLCDSADDR3 = LCD_HOZVAL;
  16.     
  17.     rLCDINTMSK |= 3;
  18.       
  19.       rTCONSEL &= 0x0;
  20.       rTCONSEL |= 0x2;
  21.  
  22.        rTPAL = 0x0;     
  23. }

配置相关流程:

1、打开LCD背光

LCD背光对应的GPIO设置为禁止上拉(GPxUP相应位写入1),选择output类型(GPxCON相应位写入01),输出为高电平(GPxDAT相应位写入1)


2
、打开LCD电源

可以将GPG4选择为LCD_PWREN(GPGCON:9-8写入11),这时候LCD电源的打开/关闭可以通过LCDCON5:3来控制。
也可以自定义其他GPIO用作LCD电源开关,只需将此GPIO设置为禁止上拉(GPxUP相应位写入1),选择output类型(GPxCON相应位写入01),输出为高电平(GPxDAT相应位写入1)打开LCD电源。


3
、设置其他信号线

其他信号线包括VD0-VD23VFRAMEVLINEVCLK等,分别在GPCCON,GPDCON中选择相应功能。


4
、设置LCD的频率(VCLK)

LCDDatasheet上一般会写有一个推荐的频率,比如我使用的屏幕推荐频率为6.4M,我需要通过一些计算选择一个合适的CLKVAL以产生这个频率:

对于TFT LCDS3C2440提供的VCLK的计算公式为:
VCLK = HCLK / ((CLKVAL+1)*2)

可以得出:
CLKVAL = HCLK / (VCLK * 2) - 1

我的HCLK100Mhz(CPU运行在400Mhz, CLKDIV_VAL设置为5Fclk:Hclk:Pclk = 1:4:8)VCLK使用屏幕推荐的6.4M,得到:
CLKVAL = 100000000 / (6400000 * 2) - 1 = 6.8

选择最接近的整数值7,写入LCDCON1:17-8

(VCLK其实就是根据 每秒帧数*帧行数*行像素  计算出来的,帧行数和行像素需要包含空白数和同步数)


5
、设置其他相关参数

LCD相关的参数主要还有这几个:
LINEVAL: LCD
水平像素-1,如320-1 = 319
HOZVAL:  LCD
垂直像素-1,如240-1 = 239
HFPD:   
行开始前的VCLK时钟数(LCD屏幕的Datasheet一般有推荐值)
HBPD:   
行结束后的VCLK时钟数(LCD屏幕的Datasheet一般有推荐值)
HSPW:   
行之间水平同步的无效VCLK时钟数(LCD屏幕的Datasheet一般有推荐值)
VFPD:   
帧数据开始前的空白行数(LCD屏幕的Datasheet一般有推荐值)
VBPD:   
帧数据结束后的空白行数(LCD屏幕的Datasheet一般有推荐值)
VSPW:   
帧之间垂直同步的无效行数(LCD屏幕的Datasheet一般有推荐值)

(相关寄存器LCDCON2, LCDCON3, LCDCON4)


6
、设置视频缓冲区的地址

2440支持虚拟屏幕,可以通过改变LCD寄存器实现屏幕快速移动

PAGEWIDTH:虚拟屏幕一行的字节数,如果不使用虚拟屏幕,设置为实际屏幕的行字节数,如16位宽320像素,设为320 * 2
OFFSIZE:
虚拟屏幕左侧偏移的字节数,如果不使用虚拟屏幕,设置为0

LCDBANK: 视频帧缓冲区内存地址30-22
LCDBASEU:
视频帧缓冲区的开始地址21-1
LCDBASEL:
视频帧缓冲区的结束地址21-1

(相关寄存器LCDSADDR1,LCDSADDR2,LCDSADDR3)


7
、确定信号的极性

2440LCD控制器允许设置VCLKVLINEVFRAME等信号的极性(上升沿有效还是下降沿有效),需要对照LCDDatasheet一一确认。

(相关寄存器LCDCON5)


8
、禁止LPC3600/LCC3600模式!

如果不是使用三星LPC3600/LCC3600 LCD,必须禁止LPC3600/LCC3600模式(写入0TCONSEL)


9
、打开视频输出

ENVID设为1 (LCDCON1:0写入1)



关键函数:

  1. //16bpp,颜色设置,但不知则么搭配颜色?

  2. #define RGB565(r, g, b) ((r >> 3) << 11 | (g >> 2) << 5 | (b >> 3))

  1. //扔进里面的东西即可显示,显存
  2. volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];

  1. /**************************************************************
  2. LCD视频和控制信号输出或者停止,1开启视频输出
  3. **************************************************************/
  4. static void Lcd_EnvidOnOff(int onoff)
  5. {
  6.     if(onoff==1)
  7.         rLCDCON1|=1; // ENVID=ON
  8.     else
  9.         rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
  10. }

  1. 初始化流程
  2. void TFT_LCD_Test(void)
  3. {
  4.     
  5.     Lcd_Port_Init();
  6.     LCD_Init();
  7.     Lcd_EnvidOnOff(1);        //turn on vedio
  8.     
  9.     //Lcd_PowerEnable(0, 1);
  10.     //LcdBkLtSet( 70 ) ;
  11.     
  12. 具体的应用程序
  13. ......


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP