TQ2440裸奔三部曲 总结纠错(转)

来源:互联网 发布:金蝶进销存源码 编辑:程序博客网 时间:2024/05/22 03:52

TQ2440裸奔总结(转载)

转自 :  http://blog.sina.com.cn/s/blog_6d25042101010vgr.html
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 )

}
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=d  XP=d, YP=d\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();即可。
具体为什么要这样做,希望初学者多看看地址映射方面的内容就明白了。

15.关于配色的问题。当前主流工具都只支持24位色的配色。那么我们用的是16位的。配色就麻烦多了。怎么解决呢?其实很简单,就是一个比例的问题。举个例子:24位RGB(24,100,120)配色比例是(24/255,100/255,120/255)

           16位要有同样的颜色,怎么办,配色比例也要相同。将(24/255,100/255,120/255)分子分母同除8,中间的除4.那么结果是
    (3/32,25/64,15/32)。那么由此可以看出。转换成16位后,RGB为RGB(3,25,15);
    怎么在程序中体现呢?那就是移位了。比如:Lcd_ClearScr((24>>3)|(100>>2)|(120>>3));那么就将24位色转换成16位色的数据了。
注意:因为移位会丢失数据。所以颜色有可能有偏差。如果要减小偏差,最好办法是用除法。

16、关于图片放大和缩小的问题。
其实在裸奔中可以实现图片的任意放大和缩小。我现在在实习,没网。也没时间写代码(有空我会放上来的。敬请关注)。我给大家讲下原理。大家都会懂的。
放大;
       图片是一个个像素点组成的。那么要放大怎么办呢?就是把一个点放大成4个相同的点。那么图片就放大了四倍。只要显示某些部分就可以实现放大。比如图片是x.那么你在原来X的位置放四个X,那么整个图片都放大了。
缩小。更简单了。只要在图片数组中相隔一定距离取数据,那么图片就缩小了。我记得那个显示图片的循环是++。那么你可以写成i=i+2;那么图片就缩小了一半哦。很简单吧?
还有很多的。待续………………………………………………………………
0 0
原创粉丝点击