天嵌 ARM开发社区

 找回密码
 注册
查看: 30444|回复: 45

裸奔总结。。。。。。持续更新中

  [复制链接]
raominping 发表于 2012-2-25 22:29:16 | 显示全部楼层 |阅读模式
本帖最后由 raominping 于 2012-3-4 11:10 编辑

1,第一个实验。。。显示自己的图片。。。老是不成功。两个原因
                  第一。DNW设置下载地址为:30000000
                  第二.在LCD_TFT.h中。关于显示屏的定义。要改成自己的哦。要注意,一定要去看看。默认好像是#define LCD_Type                          LCDW43

2.第二个实验。依次显示六张图片的问题。想必大家碰到过一下几个问题。
                                  第一。第一张图片能顺利显示,第二张显示一般。后面就是一条一条的。

                                  第二。显示挺多的。但是到后面几张是花的。
      解决办法:两种。
               第一:在nand.c中找到最后一个函数
                      void RdNF2SDRAM( )
                        {
                                  U32 i;
                                 U32 start_addr = 0x0;
                                 unsigned char * to = (unsigned char *)0x30000000;
                                 U32 size = 0x100000;
                        
             把这个U32 size改大一点就好了。上面是1M。改成0x200000.。本人亲自试过,效果不明显。大家也可以试试

              第二种:下载的时候选择a。下载到nand 中后。从nand启动。就可以了。

3.关于LED流水灯。这个很简单。我就说说对其中的一些理解吧。
        led1~led4对应通用输入输出B口的gpio_B 5~8.
         所以rGPBDAT = (rGPBDAT & ~(0xf<<5)) | ((~data & 0xf)<<5); 的理解可以这样。0xf左移五位。然后取反与
         rGPBDAT相与。都为0.然后与data数据位相或可以得到LED的亮灭数据。然后就可以控制LED灯了。

         #define rGPBDAT    (*(volatile unsigned *)0x56000014) //Port B data
          这个理解很简单了。看s3c2440手册的第248页。有介绍。
                 Register          Address      R/W          Description Reset            Value
                 |GPBDAT | 0x56000014 | R/W | The data register for port B | Unde
       显而易见了。等于重定义。
4.       关于图片的一些解释。
   大家有没有发现。每次液晶显示的时候。总是一个彩色条杠。你知道在哪儿嘛。。在main函数中。第
      242行。有个lcd_TFT_Init();的函数。右键。进入查看。发现如下代码。那么从Glib_Fi开始到最后都是为了画彩色条杠。所以,   注释掉,那么彩色条杠不见了。变成黑色的了。如果不喜欢。可以用Paint_Bmp放自己的图片哦。
void Lcd_TFT_Init(void)
{
Lcd_Init();
Lcd_PowerEnable(0, 1);
Lcd_EnvidOnOff(1);  //turn on vedio
Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) );  
#define LCD_BLANK  12
#define C_UP  ( LCD_XSIZE_TFT - LCD_BLANK*2 )
#define C_RIGHT  ( LCD_XSIZE_TFT - LCD_BLANK*2 )
#define V_BLACK  ( ( LCD_YSIZE_TFT - LCD_BLANK*4 ) / 6 )
/*Glib_FilledRectangle( LCD_BLANK, LCD_BLANK, ( LCD_XSIZE_TFT - LCD_BLANK ), ( LCD_YSIZE_TFT - LCD_BLANK ),0x0000);  //fill a Rectangle with some color
Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*0), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*1),0x001f);  //fill a Rectangle with some color
Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*1), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*2),0x07e0);  //fill a Rectangle with some color
Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*2), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*3),0xf800);  //fill a Rectangle with some color
Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*3), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*4),0xffe0);  //fill a Rectangle with some color
Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*4), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*5),0xf81f);  //fill a Rectangle with some color
Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*5), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*6),0x07ff);  //fill a Rectangle with some color
Glib_Line( LCD_BLANK,LCD_BLANK, (LCD_XSIZE_TFT-LCD_BLANK), (LCD_YSIZE_TFT-LCD_BLANK), 0x0000 ) ;
Glib_Line( LCD_BLANK,(LCD_YSIZE_TFT-LCD_BLANK), (LCD_XSIZE_TFT-LCD_BLANK), LCD_BLANK, 0x0000 ) ;
Glib_Line( (LCD_XSIZE_TFT/2),(LCD_BLANK*2 + V_BLACK*0), (LCD_XSIZE_TFT/2), (LCD_BLANK*2 + V_BLACK*6), 0x0000 ) ;
*/
}
5.
大家有没有想过。为什么图片缩小是p=p+640(k-1);这个640是哪儿来的饿呢?
大家可以看。两个内嵌循环的内循环是干什么的?是显示行的。外循环是显示列的。那么应该这么理解。
p=p+320*2*(k-1);也就是显示完一行以后。那么要移动多少才能到下一行呢。答案是320*2.大家可以到图上画画看哦。我在线面提供一张。其实缩小就是只显示部分点。抛弃大部分的点。不显示。为什么是K-1呢?我试了试。K-2也可以,没什么问题。但是如果改成K就不行。图片就交叉显示了。为什么是K-1.。大家想想。如果k=2.那么图片缩小一半。那么显示该怎么办呢,也就是行要隔一行显示。那么要移动多少?那就是320*2正好等于640*(2-1),其余的同理。。
void Paint_Bmp1(int x0,int y0,int h,int l,int k,unsigned char bmp[])
{
int x,y;
U32 c;
int p = 0;
l=l/k;
h=h/k;
    for( y = 0 ; y < l ; y++ )
    {
     for( x = 0 ; x < h ; x++ )
     {
      c = bmp[p+1] | (bmp[p]<<8) ;
   if ( ( (x0+x) < SCR_XSIZE_TFT) && ( (y0+y) < SCR_YSIZE_TFT) )
    LCD_BUFFER[y0+y][x0+x] = c ;
   
      p = p + 2*k ;
     }
     p=p+640*(k-1);
    }
}

6。一个裸奔三部曲的一个错误。要纠正下。54页。就是关于触摸屏纠正中画方格的循环式错误的。得不到结果。以320*240
的屏幕纠正。原文:
for(i=1;i<10;i++){
    Glib_Line(0,48*i,480,48*i,0x0000);
    Glib_Line(27*i,0,27*i,272,0x0000);
};
纠正后:
Glib_Line(i*32,0,i*32,240,128);
Glib_Line(0,i*24,320,i*24,128);
7.关于触摸屏纠正的问题。手册讲的过于高深了点。如果数学没学好。就不好办了。这儿我有个简单的办法。就是改变中心点。大家可以试试把中心的放到屏幕的中心哦。那么对于手指触摸的定位更简单。都不需要定位纠正了。
下面以320*240的屏幕为例。只需加两条代码就可以。
在Main.c文件中的中断函数中。加入下面蓝色部分就可以
while(1)  //to check Pen-up state
{
  if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with
  {
   //Uart_Printf("Stylus Up Interrupt~!\n");
   break; //if Stylus is up(1) state
  }
}  

ydata=514-ydata;
xdata=-500+xdata;

Uart_Printf("count=%03d  XP=%04d, YP=%04d\n", count++, xdata, ydata);   
//X-position Conversion data            
rADCDLY=saveAdcdly;  
rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.
rSUBSRCPND|=BIT_SUB_TC;
rINTSUBMSK=~(BIT_SUB_TC);// Unmask sub interrupt (TC)      
ClearPending(BIT_ADC);
}

8.突然。自己建的工程用a下载到nand中后。启动没有反应。搞了一上午。终于发现是连接顺序问题。解决如下。
  点击Link Order.在里面调整顺序。前三个一定要按照这个顺序才行哦。依次为2440init.s    2440slib.s     nand.c   2440lib.c


9.pwm的理解
手册解释的我就不多说了。说大家不一定知道的。
定时器输入频率=PCLK/(预分频值+1)/(分频值+1)
预分频值范围0~255.分频值2,4,8,16就这四个。
TCFG0是一个32位的控制寄存器。每一位的功能在s3c2440英文手册的322页有介绍。是一个表格。很简单的。篇幅有限,就不写了。
程序上的

  rGPBCON &= ~3;   //设置定时器0.同时设置为停止。
rGPBCON |= 2;

rTCFG0 &= ~0xff;  //  的意思是把低八位取零。然后低八位为二进制1110.
rTCFG0 |= 15;   //prescaler = 15+1。 对应手册的意思是定时器0,1的预分频值。

rTCFG1 &= ~0xf;
rTCFG1 |= 2;   //分频器。根据手册是低四位为0010.   1/8的意思。
rTCNTB0 = (PCLK>>7)/freq; //缓存寄存器,
rTCMPB0 = rTCNTB0>>1;  // 比较器。。。他是要和上面寄存器进行比较的。这个是低电平占有率
rTCON &= ~0x1f;   //定时器控制寄存器。对所有寄存器都一样。低5位针对定时器0.
rTCON |= 0xb;   //去掉死区功能,自动更新计数器,关掉变频器,开始定时器0.
rTCON &= ~2;   //清楚人工更新位。

10.关于对删除其中的除了包含 mmu.c在内的前六个和 LCD_TFT.c以外的所有的程
序编译并生成会发现有 10 个错误的理解。

这句话歧义大。我就说那些不删除吧。2440init.s 2440slib.s nand.c   2440lib.c  main.c LCD_TFT.c.其他都删除。然后添加字库。
11.关于现实字母。手册上面漏掉了一点。那就是函数Lcd_PutASCII().这个函数在UCOS的LCD。c文件中。吧整个代码复制到LCD_TFT.c中。就可以了。要不然。main没发调用。
12.关于汉字库的问题。手册完全没说。其实你编译的时候肯定报错。但是手册没说。告诉你。是因为少加了个头文件。
在LCD_TFT.c开头添加#include "stdarg.h"就可以了。
13.关于汉字编码的问题。在附件中。看完了。你什么都懂了。。。
14.超级终端错误Touch Screen test Dummy_isr error, interrupt number: 31, INTMSK = 0x7fffffff
主要问题还是出在MMU上,具体MMU资料还是希望初学者去看看,这里我想说说裸机在SDARM中实现中断的步骤,希望对像我这样刚拿到板子的自学兄弟们有帮助。
方法1: 在2440test文件中找到MMU.C的函数添加进来,找到(MMU_SetMTT(0x00000000,0x03f00000,(int)__ENTRY,RW_CB);  //bank0),将(int)__ENTRY改为0X30000000,然后在主程序中调用MMU_Init();即可。
方法2:在2440test文件中找到MMU.C的函数添加进来,然后到2440init.s入口处(即ENTRY下面)添加
    EXPORT  __ENTRY  
__ENTRY                       (要顶格写)
在道主函数中调用MMU_Init();即可。
具体为什么要这样做,希望初学者多看看地址映射方面的内容就明白了。

字数满了:现在接到下一篇:http://www.armbbs.net/forum.php? ... amp;extra=#pid72665










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 6 +30 收起 理由
hxf0223 + 10 赞一个!
附近顺口溜 + 10 很给力!
随心 + 6 很给力!
xiaoya + 2 赞一个!
hanyanlong86 + 1 赞一个!

查看全部评分

1097174341 发表于 2012-2-26 11:28:09 | 显示全部楼层
恩,的确。这是个问题,不过还希望能再给出技术部分的指导~!!
无人地铁 发表于 2012-2-26 22:04:22 | 显示全部楼层
以前看见还有很多问题,再发多几个解决的问题吧~
scfishfish 发表于 2012-2-27 20:58:53 | 显示全部楼层
非常不错,支持lz!
Liodvaen 发表于 2012-2-27 22:31:39 | 显示全部楼层
o(∩_∩)o 哈哈

评分

参与人数 1 +2 收起 理由
赵万国 + 2 很给力!

查看全部评分

李华伟 发表于 2012-2-29 10:01:30 | 显示全部楼层
请问版主,我遇到显示六张图片时,只能显示四张,后两张显示不了,只显示了空白。怎么办?
 楼主| raominping 发表于 2012-2-29 11:10:19 | 显示全部楼层
上面有介绍啊。你选择a选项,下载到NAND FLASH。然后从NAND启动就好了哦。
 楼主| raominping 发表于 2012-2-29 11:12:31 | 显示全部楼层
李华伟 发表于 2012-2-29 10:01
请问版主,我遇到显示六张图片时,只能显示四张,后两张显示不了,只显示了空白。怎么办?

上面有介绍啊。你选择a选项,下载到NAND FLASH。然后从NAND启动就好了哦。
~悟`~念~ 发表于 2012-3-1 13:14:00 | 显示全部楼层
:lol明白了
dwtntaf 发表于 2012-3-1 13:52:42 | 显示全部楼层
跟 学 一 下:)
李华伟 发表于 2012-3-1 14:51:23 | 显示全部楼层
raominping 发表于 2012-2-29 11:12
上面有介绍啊。你选择a选项,下载到NAND FLASH。然后从NAND启动就好了哦。

谢谢,现在可以了。但是又有另外一个问题,为什么我把程序烧进去之后,用电源开关重启板子时就显示不完六张图片,若是用复位开关重启板子就可以显示六张图片?
 楼主| raominping 发表于 2012-3-1 16:09:29 | 显示全部楼层
李华伟 发表于 2012-3-1 14:51
谢谢,现在可以了。但是又有另外一个问题,为什么我把程序烧进去之后,用电源开关重启板子时就显示不完六 ...

复位是一样的。和重启一个意思。如果你吧程序烧到sdram中。复位就没了。所以不行
Mingrui 发表于 2012-3-1 16:27:55 | 显示全部楼层
总结的不错!
李华伟 发表于 2012-3-1 19:11:50 | 显示全部楼层
raominping 发表于 2012-3-1 16:09
复位是一样的。和重启一个意思。如果你吧程序烧到sdram中。复位就没了。所以不行

我刚才又试了试,还是不行。调到nand flash后,用复位键重启可以显示出六张,用电源开关重启只能显示前三张,后三张是白屏。
 楼主| raominping 发表于 2012-3-1 20:27:50 | 显示全部楼层
李华伟 发表于 2012-3-1 19:11
我刚才又试了试,还是不行。调到nand flash后,用复位键重启可以显示出六张,用电源开关重启只能显示前三 ...

好奇怪啊。。。。。。不清楚什么情况。没碰到过。。

评分

参与人数 1 +8 收起 理由
conwin + 8 赞一个!

查看全部评分

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

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-19 02:13 , Processed in 1.046882 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表