|  | 
 
| 自己写的NandFlash驱动内存冲突,nandread函数将读出的512b数据放在数组nand中。可以读出,但会把其他函数和断点覆盖。以下是所有代码,请高手指点。。。 
 
 INCLUDE 2410addr.inc
 
 AREA  Init,CODE,READONLY
 ENTRY
 
 import Main
 
 ldr r0,=WTCON                ;关看门狗
 ldr r1,=0x0
 str r1,[r0]
 
 ldr r0,=GPHCON                ;设置I/0                                ;一下设置串口
 ldr r1,=0xa0
 str r1,[r0]
 ldr r0,=GPHUP
 ldr r1,=0x0c
 str r1,[r0]
 
 ldr r0,=ULCON0                ;正常模式/无奇偶/每帧一位/每帧8-bits
 ldr r1,=0x03
 str r1,[r0]
 
 ldr r0,=UCON0                ;中断请求或表决模式/中断请求或表决模式
 ldr r1,=0x05
 str r1,[r0]
 
 ldr r0,=UFCON0                ;不使用FIFO
 ldr r1,=0x00
 str r1,[r0]
 
 ldr r0,=UMCON0                ;不使用流控制
 ldr r1,=0x00
 str r1,[r0]
 
 ldr r0,=UBRDIV0                ;设置波特率
 ldr r1,=0x0c
 str r1,[r0]
 
 ldr sp, =0x40000000        ;设置堆栈
 
 ldr r0,=BWSCON                ;设置内存
 ldr r1,=0x22111110
 str r1,[r0]
 
 ldr r0,=BANKCON6
 ldr r1,=0x18005
 str r1,[r0]
 ldr r0,=BANKCON7
 str r1,[r0]
 
 ldr r0,=REFRESH
 ldr r1,=0x8e0000
 str r1,[r0]
 
 ldr r0,=BANKSIZE
 ldr r1,=0xb1
 str r1,[r0]
 
 ldr r0,=MRSRB6
 ldr r1,=0x30
 str r1,[r0]
 ldr r0,=MRSRB7
 STR R1,[R0]
 
 b Main
 
 end
 
 
 
 #include "2410addr.h"
 
 char int2char(unsigned int);        //声明int2char函数
 void uart_send(char *c);                //声明发送函数
 static char key=' ';
 static unsigned int nand[200];                //定义从NandFlash读出的数据存放的数组
 unsigned int n;
 void nandread(unsigned int);
 void nanderase(unsigned int);
 void out(void);
 unsigned int e;
 
 void Main(void)
 {
 rGPFCON=0x5555;                        //设置端口为输出        此部分应根据实际需要改动或去掉
 rGPFUP=0xffff;                        //断开上拉电阻
 rGPFDAT=0xffff;                        //输出0xffff(灯全灭)
 while(1)
 {
 
 rGPFDAT=~(1<<4);//LED
 
 nandread(0x00);    //读取nandflash
 out();              //输出
 
 rGPFDAT=~(1<<5);//LED
 
 nanderase(0x00);    //擦除nandflash
 nandread(0x00);      //再次读取nandflash
 out();             //输出
 
 rGPFDAT=~(1<<6);//LED
 
 while(1){}
 }
 }
 
 void nanderase(unsigned int a)
 {
 rNFCONF=0xF830;
 rNFCONF&=~0x800;                //使能NandFlash
 rNFCMD=0x60;
 rNFADDR=a&0xff;
 rNFADDR=(a>>8)&0xff;
 rNFADDR=(a>>16)&0xff;
 rNFCMD=0xd0;
 while((rNFSTAT&0x01)==0){}
 }
 
 void nandread(unsigned int dz)
 {
 unsigned int a,b,c,d;
 
 rNFCONF=0xF830;
 rNFCONF&=~0x800;                        //使能NandFlash
 rNFCMD=0x0ff;                                //复位命令
 while((rNFSTAT&0X1)==0){}                //等待NFSTAT位0==1
 rNFCMD=0x00;                                //读命令
 rNFADDR=dz&0xff;                                //以下写入地址
 rNFADDR=(dz>>9)&0xff;
 rNFADDR=(dz>>17)&0xff;
 rNFADDR=(dz>>25)&0xff;
 while((rNFSTAT&0X01)==0){}                //等待NFSTAT位0==1
 n=0;
 while(n!=128)
 {
 a=rNFDATA&0xff;                //连续读NFDATA寄存器512次,得到一页(512B)数据
 b=rNFDATA&0xff;
 c=rNFDATA&0xff;
 d=rNFDATA&0xff;
 
 nand[n]=a|(b<<8)|(c<<16)|(d<<24);
 n++;
 }
 rGPFDAT=~(1<<7);//LED
 }
 
 void out(void)
 {
 n=0;
 while(n!=128)
 {
 uart_send("\n");
 
 e=(nand[n]>>28)&0x0f;
 key=int2char(e);
 uart_send(&key);
 
 e=(nand[n]>>24)&0x0f;
 key=int2char(e);
 uart_send(&key);
 
 e=(nand[n]>>20)&0x0f;
 key=int2char(e);
 uart_send(&key);
 
 e=(nand[n]>>16)&0x0f;
 key=int2char(e);
 uart_send(&key);
 
 e=(nand[n]>>12)&0x0f;
 key=int2char(e);
 uart_send(&key);
 
 e=(nand[n]>>8)&0x0f;
 key=int2char(e);
 uart_send(&key);
 
 e=(nand[n]>>4)&0x0f;
 key=int2char(e);
 uart_send(&key);
 
 e=nand[n]&0x0f;
 key=int2char(e);
 uart_send(&key);
 
 n++;
 }
 
 uart_send("\n END");
 }
 
 void uart_send(char *c)                //发送函数
 {
 for (;*c!='\0';c++)
 {
 while(!(rUTRSTAT0&0x02)) ;     //不断查询,直到可以发送数据
 rUTXH0=*c ;                    //发送数据
 }
 }
 
 char int2char(unsigned int a)
 {
 if(a==0)
 {
 return ('0');
 }
 else if(a==1)
 {
 return ('1');
 }
 else if(a==2)
 {
 return ('2');
 }
 else if(a==3)
 {
 return ('3');
 }
 else if(a==4)
 {
 return ('4');
 }
 else if(a==5)
 {
 return ('5');
 }
 else if(a==6)
 {
 return ('6');
 }
 else if(a==7)
 {
 return ('7');
 }
 else if(a==8)
 {
 return ('8');
 }
 else if(a==9)
 {
 return ('9');
 }
 else if(a==0x0a)
 {
 return ('a');
 }
 else if(a==0x0b)
 {
 return ('b');
 }
 else if(a==0x0c)
 {
 return ('c');
 }
 else if(a==0x0d)
 {
 return ('d');
 }
 else if(a==0x0e)
 {
 return ('e');
 }
 else
 {
 return ('f');
 }
 }
 | 
 |