主题 : 购买的是Tiny210开发板+7寸电容屏,裸机LCD程序跑不起来 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 93351
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
贡献值: 0 点
综合积分: 8 分
注册时间: 2013-06-20
最后登录: 2017-09-13
楼主  发表于: 2013-06-24 16:09

 购买的是Tiny210开发板+7寸电容屏,裸机LCD程序跑不起来

裸奔例程19和21给出的程序貌似是4.3寸屏的,现在实际上卖的都是7寸电容屏,这两个裸奔例程运行起来UART是好的,但是屏幕全亮什么反应都没有。
请问友善有7寸电容屏的裸奔例程么?或者有没有大侠告诉我应该怎么改啊?
按照网上一些说法,我进行了修改。可是效果没有变化,仍然是全亮。
lcd.c我写成了这样

#define GPF0CON            (*(volatile unsigned long *)0xE0200120)
#define GPF1CON            (*(volatile unsigned long *)0xE0200140)
#define GPF2CON            (*(volatile unsigned long *)0xE0200160)
#define GPF3CON            (*(volatile unsigned long *)0xE0200180)

#define GPD0CON            (*(volatile unsigned long *)0xE02000A0)
#define GPD0DAT            (*(volatile unsigned long *)0xE02000A4)

#define CLK_SRC1        (*(volatile unsigned long *)0xe0100204)
#define CLK_DIV1        (*(volatile unsigned long *)0xe0100304)
#define DISPLAY_CONTROL    (*(volatile unsigned long *)0xe0107008)

#define VIDCON0            (*(volatile unsigned long *)0xF8000000)
#define VIDCON1            (*(volatile unsigned long *)0xF8000004)
#define VIDTCON2        (*(volatile unsigned long *)0xF8000018)
#define WINCON0         (*(volatile unsigned long *)0xF8000020)
#define WINCON2         (*(volatile unsigned long *)0xF8000028)
#define SHADOWCON         (*(volatile unsigned long *)0xF8000034)
#define VIDOSD0A         (*(volatile unsigned long *)0xF8000040)
#define VIDOSD0B         (*(volatile unsigned long *)0xF8000044)
#define VIDOSD0C         (*(volatile unsigned long *)0xF8000048)

#define VIDW00ADD0B0     (*(volatile unsigned long *)0xF80000A0)
#define VIDW00ADD1B0     (*(volatile unsigned long *)0xF80000D0)

#define VIDTCON0         (*(volatile unsigned long *)0xF8000010)
#define VIDTCON1         (*(volatile unsigned long *)0xF8000014)

#define HSPW             (0)
#define HBPD            (45)
#define HFPD             (209)
#define VSPW            (0)
#define VBPD             (22)
#define VFPD             (21)

// FB地址
#define FB_ADDR            (0x23000000)
#define ROW                (480)
#define COL                (800)
#define HOZVAL            (COL-1)
#define LINEVAL            (ROW-1)

// 初始化LCD
void lcd_init(void)
{
    // 配置引脚用于LCD功能
    GPF0CON = 0x22222222;
    GPF1CON = 0x22222222;
    GPF2CON = 0x22222222;
    GPF3CON = 0x22222222;

    // 打开背光
    GPD0CON &= ~(0xf<<4);
    GPD0CON |= (1<<4);
    GPD0DAT |= (1<<1);

    // 10: RGB=FIMD I80=FIMD ITU=FIMD
    DISPLAY_CONTROL = 2<<0;

    // bit[26~28]:使用RGB接口
    // bit[18]:RGB 并行
    // bit[2]:选择时钟源为HCLK_DSYS=166MHz
    VIDCON0 &= ~( (3<<26)|(1<<18)|(1<<2) );

    // bit[1]:使能lcd控制器
    // bit[0]:当前帧结束后使能lcd控制器
    VIDCON0 |= ( (1<<0)|(1<<1) );

    // bit[6]:选择需要分频
    // bit[6~13]:分频系数为15,即VCLK = 166M/(14+1) = 11M
    VIDCON0 |= 14<<6 | 1<<4;


    // H43-HSD043I9W1.pdf(p13) 时序图:VSYNC和HSYNC都是低脉冲
    // s5pv210芯片手册(p1207) 时序图:VSYNC和HSYNC都是高脉冲有效,所以需要反转
    VIDCON1 |= 1<<5 | 1<<6;

    // 设置时序
    VIDTCON0 = VBPD<<16 | VFPD<<8 | VSPW<<0;
    VIDTCON1 = HBPD<<16 | HFPD<<8 | HSPW<<0;
    // 设置长宽
    VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);

    // 设置windows1
    // bit[0]:使能
    // bit[2~5]:24bpp
    WINCON0 |= 1<<0;
    WINCON0 &= ~(0xf << 2);
    WINCON0 |= (0xB<<2) | (1<<15);

#define LeftTopX     0
#define LeftTopY     0
#define RightBotX   799
#define RightBotY   479

    // 设置windows1的上下左右
    VIDOSD0A = (LeftTopX<<11) | (LeftTopY << 0);
    VIDOSD0B = (RightBotX<<11) | (RightBotY << 0);
    VIDOSD0C = (LINEVAL + 1) * (HOZVAL + 1);


    // 设置fb的地址
    VIDW00ADD0B0 = FB_ADDR;
    VIDW00ADD1B0 = (((HOZVAL + 1)*4 + 0) * (LINEVAL + 1)) & (0xffffff);

    // 使能channel 0传输数据
    SHADOWCON = 0x1;
}


// 描点
void lcd_draw_pixel(int row, int col, int color)
{
    unsigned long * pixel = (unsigned long  *)FB_ADDR;

    *(pixel + row * COL + col) = color;

}

// 清屏
void lcd_clear_screen(int color)
{
    int i, j;

    for (i = 0; i < ROW; i++)
        for (j = 0; j < COL; j++)
            lcd_draw_pixel(i, j, color);

}

// 划横线
void lcd_draw_hline(int row, int col1, int col2, int color)
{
    int j;

    // 描第row行,第j列
    for (j = col1; j <= col2; j++)
        lcd_draw_pixel(row, j, color);

}

// 划竖线
void lcd_draw_vline(int col, int row1, int row2, int color)
{
    int i;
    // 描第i行,第col列
    for (i = row1; i <= row2; i++)
        lcd_draw_pixel(i, col, color);

}

// 划十字
void lcd_draw_cross(int row, int col, int halflen, int color)
{
    lcd_draw_hline(row, col-halflen, col+halflen, color);
    lcd_draw_vline(col, row-halflen, row+halflen, color);
}




main.c我改成了这样

#include "lib\stdio.h"
#include "lcd.h"

#define WIDTHEIGHT    800
#define HEIGHT    480

void uart_init(void);

int main(void)
{
    int c = 0;

    // 初始化串口
    uart_init();

    // 初始化LCD
    lcd_init();

    // 打印菜单
    while(1)
    {
        printf("\r\n###############LCD Test##############\r\n");
        printf("[1] lcd_clear_screen\r\n");
        printf("[2] lcd_draw_cross\r\n");
        printf("[3] lcd_draw_hline\r\n");
        printf("[4] lcd_draw_vline\r\n");
        printf("[5] lcd_draw_circle\r\n");
        printf("Enter your choice:");
        c = getc();
        printf("%c\r\n",c);
        switch(c)
        {
            case '1':
                // 清屏
                lcd_clear_screen(0x000000);                                    // 黑
                break;
            case '2':
                // 划十字
                lcd_draw_cross(50, 50, 20, 0x0000ff);                        // 蓝
                break;
            case '3':
                // 划横线
                lcd_draw_hline(HEIGHT/2, 100, WIDTHEIGHT-100, 0xff0000);    // 红
                break;
            case '4':
                // 划竖线
                lcd_draw_vline(WIDTHEIGHT/2, 50, HEIGHT-50, 0x00ff00);        // 绿
                break;
            default:
                break;
        }
    }
    return 0;
}



自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
贡献值: 27 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
1楼  发表于: 2013-06-24 16:44
根据77寸屏的Linux/WinCE驱动改下参数就行了
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
贡献值: 27 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
2楼  发表于: 2013-06-24 16:45
主要是改这些:
#define HSPW             (0)
#define HBPD            (45)
#define HFPD             (209)
#define VSPW            (0)
#define VBPD             (22)
#define VFPD             (21)

// FB地址
#define ROW                (480)
#define COL                (800)
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
级别: 新手上路
UID: 96979
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
贡献值: 0 点
综合积分: 30 分
注册时间: 2013-10-08
最后登录: 2015-07-21
3楼  发表于: 2014-02-20 17:34
楼主你好!我买的也是tiny210+7寸屏。把光盘里的程序按楼上大侠的修改后,还是有个奇怪的问题:
从(0,0)左上角开始,往右方向连续画5个像素点,会发现前四个(x坐标0,1,2,3)显示正确,第5个点跑到了第六个位置(本来应该是x坐标4)。假如连续画10个点或者更多的话,所有显示又是正常的,因此画长线或清屏函数貌似都ok。但显示字符的话,是歪歪扭扭的样子,只能大概分辨出是什么文字。显示图片的话,图像有点模糊。
硬件肯定是ok的,我运行linux都是正常的。不知道你们是不是这样的。
级别: 新手上路
UID: 96979
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
贡献值: 0 点
综合积分: 30 分
注册时间: 2013-10-08
最后登录: 2015-07-21
4楼  发表于: 2014-02-21 10:06
回去好好读了数据手册,时序是ok的,原来例程里把WINCON0的WSWP_F 打开了
级别: 新手上路
UID: 105563
精华: 0
发帖: 6
金钱: 30 两
威望: 6 点
贡献值: 0 点
综合积分: 12 分
注册时间: 2014-06-27
最后登录: 2014-09-18
5楼  发表于: 2014-08-08 17:08
裸机LCD循环显示两张图片,图片更新的时候会有点卡,你们试过了没有?请教如何解决
级别: 侠客
UID: 113147
精华: 0
发帖: 107
金钱: 535 两
威望: 107 点
贡献值: 0 点
综合积分: 214 分
注册时间: 2015-03-05
最后登录: 2015-09-16
6楼  发表于: 2015-03-19 11:10
請問lcd source code是放在A,B資料夾中的何處?
级别: 新手上路
UID: 111040
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
贡献值: 0 点
综合积分: 32 分
注册时间: 2014-12-12
最后登录: 2018-03-03
7楼  发表于: 2015-04-16 15:01
楼主您好,请问你的屏幕是什么型号的?