打印
[ARM入门]

LPC2478 自带LCD控制器驱动4.3TFT新手求问

[复制链接]
2802|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sol1122|  楼主 | 2013-11-1 10:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本人刚接触ARM,最近网上下的例程学习用LPC2478自带LCD控制器驱动4.3TFT,例程中有设置像素点颜色、清屏函数 如下:
//////////////////////////////////////////////////
    #define    SECTION_X(x, y)    x
    #define    SECTION_Y(x, y)    y
/////////////////////////////////////////////////////
extern __align(8) volatile unsigned short LCD_BUFFER[272][480];
///////////////////////////////////////////////////////

#define   lcd_SetPixel(x, y, uicolor)                                                                    \
              do {                                                                                       \
                  if((x < 480) &&  (y < 272)) {                                          \
                      LCD_BUFFER[SECTION_Y(x, y)][SECTION_X(x, y)] = (unsigned short)uicolor;            \
                  }                                                                                      \
              } while (0)
///////////////////////////////////////////////////////////////////////////////////////
void lcd_Clear (unsigned int uicolor)
{
    int ix, iy;
    for (iy = 0; iy <272; iy++) {
    for (ix = 0; ix < 480; ix++) {
            LCD_BUFFER[SECTION_Y(ix, iy)][SECTION_X(ix, iy)] = (unsigned short)uicolor;
        }
    }
}
这两个个函数并未操作LPC相关寄存器啊,他是怎么讲数据传到TFT上的。。。。

还有 我手头有块LG4.3TFT液晶 他的datasheet里只提供了一个Blank Period   我知道  Blank Period = Back porch+Front porch+Pulse width
但是这三个 “Back porch”  “Front porch” “Pulse width”咋算出来

新手茫茫然探索中........还望各位高手有使用过的高手不吝赐教!!
不胜感激。。。。。。

LG 4.3TFT 时序.bmp (709.44 KB )

LG 4.3TFT 时序.bmp

相关帖子

沙发
阿南| | 2013-11-1 11:17 | 只看该作者
这两个函数只是在LCD缓冲区中写数据,该缓冲区就是一段内存,往这块内存里写数据后,LCD控制器自动会将这些数据通过LCD数据线输出到LCD中,这块缓冲区地址及大小是在LCD控制器初始化函数中设定的,不是这两个函数。
另外还有那些时钟配置也在那里设定的

使用特权

评论回复
板凳
huangxz| | 2013-11-1 15:20 | 只看该作者
使用了DMA技术

使用特权

评论回复
地板
sol1122|  楼主 | 2013-11-1 16:33 | 只看该作者
阿南 发表于 2013-11-1 11:17
这两个函数只是在LCD缓冲区中写数据,该缓冲区就是一段内存,往这块内存里写数据后,LCD控制器自动会将这些 ...

南工你好,非常感谢你的回复,南工说的LCD控制器初始化是不是这个函数:
void lcd_Init( void)   
{   
    PCONP    |= (1 << 20);  //enable LCD controller power
    PINSEL0  |= 0x00055500;   
    PINSEL3  |= 0x05555500;   
    PINSEL4  |= 0x054FFFFF;
    PINSEL5  |= 0x00000000;        
    PINSEL9  |= 0x0A000000;   
    PINSEL10 &= 0xFFFFFFF7;   
    PINSEL11   = (int)(0xfffffffll << 4)    /*  Reserved,should write 1     */
               | (5 << 1)                   /*  TFT 16-bit (5:6:5 mode)     */
               | (1 << 0);                  /*  lcd port is enable          */   
    DelayNS(15);
       
    LCD_CTRL   = 0;          //power disable
    DelayNS(20);

    LCD_CFG = 0x09;          // pixel clock 9MHZ
   
    LCD_TIMH = (0x08 << 24)| //设置水平后沿
           (0x08 << 16)| //设置水平前沿
           (0x1d << 8 )| //设置水平同步脉宽
           (0x1D << 2);  //设置每行有多少个像素点  =(pex/16)-1
       
    LCD_TIMV = (0x02 << 24)| //设置垂直后沿
           (0x02 << 16)| //设置垂直前沿
           (0x0a << 10)| //设置垂直同步脉宽
           (0x10F);      //设垂直像素点 =pex-1
       
    LCD_POL  = (0x01 << 26)| //设置旁路时钟分频器
           (0x1DF<< 16)| //设置每行时钟数
           (0x00 << 14)| //设置LCD使能 高电平有效
           (0x01 << 13)| //设置数据在LCDCLK的下降沿输出
           (0x01 << 12)| //设置HSYNC低电平有效
           (0x01 << 11)| //设置VSYNC低电平有效
           (0x0<<5);       //设置HCLK
                                                         
    LCD_CTRL = (0x01 << 5)|  //设置为TFT液晶
              (0x06 << 1)|  //设置16bbp,5:6:5mode
            (1);            使能LCD控制信号
               LCD_INTMSK = 0;          //禁止LCD中断

LCD_CTRL  |= 0x01;               
   LCD_CTRL  |= (1 << 11);  //使能LCD power               
}  

初始化完这个函数,再在主函数里写
int main(void)
{
        ConfigurePLL ();//将LPC2478时钟设置为72MHz
        lcd_Init();
        lcd_Clear (LCD_BLACK);// #defne LCD_BLACK  0x0000;
        while (1);
}

就可以将数据送到TFT上 ,我这些问题问的很白,请见谅!!!!!!!!!!!!!!!

使用特权

评论回复
5
阿南| | 2013-11-1 18:34 | 只看该作者
是的。如果硬件也没问题,理论上讲就可以了,你可以试试。或把Main改成
int main(void)
{
        ConfigurePLL ();//将LPC2478时钟设置为72MHz
        lcd_Init();
       while (1) {
        lcd_Clear (LCD_BLACK);// #defne LCD_BLACK  0x0000;
        Delay 2秒;
        lcd_Clear (0xffff);
        Delay 2秒;
      }
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
sol1122 + 1 很给力!
6
sol1122|  楼主 | 2013-11-19 14:56 | 只看该作者
本帖最后由 sol1122 于 2013-11-19 14:58 编辑
阿南 发表于 2013-11-1 11:17
这两个函数只是在LCD缓冲区中写数据,该缓冲区就是一段内存,往这块内存里写数据后,LCD控制器自动会将这些 ...


南工,你好!再次求问,
你说的设置缓冲区地址及大小,我看到的例程大部分是用外部SDRAM地址做缓存
如果我想仅仅用 清屏函数 实现简单的红色清屏、蓝色清屏,那么LPC2478内部RAM是否可以划分一块做缓存?
我现在清屏函数没设任何地址,屏幕白屏,用示波器测量只有时钟脚有9Mhz的输出,其它脚如R、G、B、EN使能、均无输出,感觉是LCD控制器没有收到显示数据。

我看LPC2478datasheet有段介绍如图
我理解的是可以用on-chip SRAM on AHB1做缓存  不知道理解的对不对

未命名22.bmp (234.03 KB )

未命名22.bmp

使用特权

评论回复
7
阿南| | 2013-11-19 20:32 | 只看该作者
清屏函数,你就往缓存里写数据就可以了,白屏应该不是写什么数据的问题,应该是LCD控制器没初始化好,如果初始化好而数据不对应该会是花屏,而不是白屏

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

1

粉丝