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;那么图片就缩小了一半哦。很简单吧?
还有很多的。 待续………………………………………………………………
2.第二个实验。依次显示六张图片的问题。想必大家碰到过一下几个问题。
3.关于LED流水灯。这个很简单。我就说说对其中的一些理解吧。
4.
void Lcd_TFT_Init(void)
{
Lcd_Init();
Lcd_PowerEnable(0, 1);
Lcd_EnvidOnOff(1);
Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) );
#define LCD_BLANK
#define C_UP
#define C_RIGHT
#define V_BLACK
}
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;
}
6。 一个裸奔三部曲的一个错误。要纠正下。54页。就是关于触摸屏纠正中画方格的循环式错误的。得不到结果。以320*240
的屏幕纠正。原文:
for(i=1;i<10;i++){
};
纠正后:
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)
{
}
ydata=514-ydata;
xdata=-500+xdata;
Uart_Printf("count=d
//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中后。启动没有反应。搞了一上午。终于发现是连接顺序问题。解决如下。
9.pwm的理解
手册解释的我就不多说了。说大家不一定知道的。
定时器输入频率=PCLK/(预分频值+1)/(分频值+1)
预分频值范围0~255.分频值2,4,8,16就这四个。
TCFG0是一个32位的控制寄存器。每一位的功能在s3c2440英文手册的322页有介绍。是一个表格。很简单的。篇幅有限,就不写了。
程序上的
rGPBCON |= 2;
rTCFG0 &= ~0xff;
rTCFG0 |= 15;
rTCFG1 &= ~0xf;
rTCFG1 |= 2;
rTCNTB0 = (PCLK>>7)/freq; //缓存寄存器,
rTCMPB0 = rTCNTB0>>1;
rTCON &= ~0x1f;
rTCON |= 0xb;
rTCON &= ~2;
10. 关于对删除其中的除了包含 mmu.c在内的前六个和 LCD_TFT.c以外的所有的程
序编译并生成会发现有 10 个错误的理解。
这句话歧义大。我就说那些不删除吧。2440init.s 2440slib.s nand.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);
方法2:在2440test文件中找到MMU.C的函数添加进来,然后到2440init.s入口处(即ENTRY下面)添加
__ENTRY
在道主函数中调用MMU_Init();即可。
具体为什么要这样做,希望初学者多看看地址映射方面的内容就明白了。
15.关于配色的问题。当前主流工具都只支持24位色的配色。那么我们用的是16位的。配色就麻烦多了。怎么解决呢?其实很简单,就是一个比例的问题。举个例子: 24位RGB(24,100,120)配色比例是(24/255,100/255,120/255)
注意:因为移位会丢失数据。所以颜色有可能有偏差。如果要减小偏差,最好办法是用除法。
16、关于图片放大和缩小的问题。
其实在裸奔中可以实现图片的任意放大和缩小。我现在在实习,没网。也没时间写代码( 有空我会放上来的。敬请关注)。我给大家讲下原理。大家都会懂的。
放大;
缩小。更简单了。只要在图片数组中相隔一定距离取数据,那么图片就缩小了。我记得那个显示图片的循环是++。那么你可以写成i=i+2;那么图片就缩小了一半哦。很简单吧?
还有很多的。 待续………………………………………………………………