嵌入式linux第八课之LCD实验

本文介绍了S3C2440嵌入式平台的LCD控制器工作原理,包括LCD时序、信号引脚功能、背光信号控制以及参数设置。在LCD实验中,涉及到了时序图分析、分辨率、扫描方向和帧缓冲数据格式。重点讨论了8bpp和16bpp数据格式的处理,尤其是8bpp模式下如何利用调色板将数据转换为LCD所需的16bpp格式。文章还给出了源码分析,包括初始化、LCD测试函数以及核心函数`Tft_Lcd_Init`和`PutPixel`的实现。
摘要由CSDN通过智能技术生成

课程内容:

  1. LCD时序图、操作原理
  2. S3C2440 LCD控制器
  3. 源码分析

LCD原理图分析

LCD的信号引脚:

VSYNC 垂直方向的同步信号

HSYNC 水平方向的同步信号

VDEN 使能信号

LED+和LED- 背光信号

VCLK 时钟信号

背光信号的使用
在这里插入图片描述

背光芯片的使能要将GPIO BL引脚置高电平使能

水平同步信号和垂直同步信号如何如何运用

对该信号引脚的运用看时序图,该时序图在2440的芯片手册里面

对于该开发板用的LCD分辨率为240(宽)*320(长)

LCD的扫描方向,从左到右,从上到下

时序图如下图所示:

在这里插入图片描述

时序图讲解:

一帧的时序:

一开始HSYNC变高电平,表示喷枪(打印光点的位置)回到最上一行,HSYNC第一个上升沿和第二个上升沿之间是扫描行数,扫描的行数是VSPW+1,第二个上升沿和第三个上升沿的时间是VBPD+1,这些时间是可以设置的。直到第三个上升沿开始才是开始打印行光点,之前时序为打印光点做准备。

HSYNC每一次上升沿便是一个新的行开始,即Lineval+1。当行结束后,VFPD+1,然后又从第一行开始打印光点。

行时序:

行打印前的准备工作,HSYNC信号持续时间为HSPW+1,HSYNC变低电平后与开始打印行光点的时间为HBPD+1.每行的观点个数也是可以控制的,有HOZVAL决定。然后因为HSYNC上升沿,喷枪再跳回行的第一个光点处。HBPD表示无效的像素点,和HFPD相同,表示黑色边框。一个VCLK对应一个像素。

一行内的像素有效由VDEN表示,HSYNC表示一行开始。

因此写程序时有HSYNC、HBPD、HOZVAL、HFPD、VSPW、VBPD、VFPD这些参数要设置,还有VCLK这个时钟。

参数设置

2440有LCD控制器,2440里面会开一块内存,里面的数据对应LCD上的像素,每个像素两个字节。要显示图片前会将图片数据写到内存里面,然后通过设置的参数驱动LCD并显示图片。

程序流程

  1. 打开背光。
  2. 时序设置。
  3. 在FRAM BUFFER里面写数据。(数据的格式如下所示)

Frame Buffer的数据格式:
在这里插入图片描述

图上有两种存放方法,因为是32位的内存,而像素是16位的,所以像素的存放存在大小端

在这里插入图片描述

打算如上的方式存放时,也是符合我们正常的思维的存放方式时,BSWP=0,HWSWP=1。

8bpp存放格式时

要确定一点,LCD选定后,像素宽度是固定的,开发板上的LCD已经是确定了的16bpp,而要用8bpp就要涉及到一个新的概念,调色板。

Frame Buffer=>2440LCD控制器=>LCD。LCD每个像素一定是16bpp,但是如果FrameBuffer的数据是8bpp的格式,要转变成16bpp的方法就是用调色板。

调色板存256种颜色,2^8=256,颜色的存放是以两个字节的格式存放的。此时,要将8bpp转换成16bpp,此时8bpp的图像数据就已经不是像素,而是去调色板进行索引的数字。

源码分析

head.s的代码如下所示:

Reset:                  
    ldr sp, =4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈
    bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启
    bl  clock_init          @ 设置MPLL,改变FCLK、HCLK、PCLK
    bl  memsetup            @ 设置存储控制器以使用SDRAM
    bl  nand_init           @ 初始化NAND Flash
    
                            @ 复制代码到SDRAM中
    ldr r0, =0x30000000     @ 1. 目标地址 = 0x30000000,这是SDRAM的起始地址
    mov r1, #4096           @ 2. 源地址   = 4096,运行地址在SDRAM中的代码保存在NAND Flash 4096地址开始处
    mov r2, #16*1024        @ 3. 复制长度 = 16K,对于本实验,这是足够了
    bl  CopyCode2SDRAM      @ 调用C函数CopyCode2SDRAM
    
    bl  clean_bss           @ 清除bss段,未初始化或初值为0的全局/静态变量保存在bss段

    msr cpsr_c, #0xd2       @ 进入中断模式
    ldr sp, =0x31000000     @ 设置中断模式栈指针

    msr cpsr_c, #0xdf       @ 进入系统模式
    ldr sp, =0x34000000     @ 设置系统模式栈指针,

    ldr lr, =ret_initirq    @ 设置返回地址    
    ldr pc, =init_irq       @ 调用中断初始化函数
ret_initirq:
    msr cpsr_c, #0x5f       @ 设置I-bit=0,开IRQ中断

    ldr lr, =halt_loop      @ 设置返回地址
    ldr pc, =main           @ 调用main函数
halt_loop:
    b   halt_loop

HandleIRQ:
    sub lr, lr, #4                  @ 计算返回地址
    stmdb   sp!,    { r0-r12,lr }   @ 保存使用到的寄存器
                                    @ 注意,此时的sp是中断模式的sp
                                    @ 初始值是上面设置的4096
    
    ldr lr, =int_return             @ 设置调用IRQ_Handle函数后的返回地址  
    ldr pc, =IRQ_Handle             @ 调用中断分发函数,在interrupt.c中
int_return:
    ldmia   sp!,    { r0-r12,pc }^  @ 中断返回, ^表示将spsr的值复制到cpsr
    

程序过程

  1. 常规初始化
  2. 进入main函数(初始化串口,lcd以8bbp或者16bbp的形式来进行测试)

核心函数是Test_Lcd_Tft_16Bit_240320和Test_Lcd_Tft_8Bit_240320

Test_Lcd_Tft_8Bit_240320的内容

void Test_Lcd_Tft_8Bit_240320(void)
{
   
    Lcd_Port_Init();                     // 设置LCD引脚
    Tft_Lcd_Init(MODE_TFT_8BIT_240320);  // 初始化LCD控制器
    Lcd_PowerEnable(0, 1);               // 设置LCD_PWREN有效,它用于打开LCD的电源
    Lcd_EnvidOnOff(1);                   // 使能LCD控制器输出信号

    Lcd_Palette8Bit_Init();     // 初始化调色板
    ClearScr(0x0);              // 清屏
    printf("[TFT 64K COLOR(16bpp) LCD TEST]\n");

    printf("1. Press any key to draw line\n");
    getc();
    DrawLine(0  , 0  , 239, 0  , 0);    // 颜色为DEMO256pal[0]
    DrawLine(0  , 0  , 0  , 319, 1);    // 颜色为DEMO256pal[1]
    DrawLine(239, 0  , 239, 319, 2);    // ……
    DrawLine(0  , 319, 239, 319, 4);
    DrawLine(0  , 0  , 239, 319, 8);
    DrawLine(239, 0  , 0  , 319, 16);
    DrawLine(120, 0  , 120, 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值