📄 flash.c
字号:
#define FLASH_BASE 0x00000000
#define BOOTLEN 0x8000
#define FLASH_RES (*(volatile unsigned long *)(0x000000))
#define FLASH_555 (*(volatile unsigned long *)(0x1554 + FLASH_BASE))
#define FLASH_2AA (*(volatile unsigned long *)(0x0AA8 + FLASH_BASE))
#define FLASH_MANU (*(volatile unsigned long *)(0x0000 + FLASH_BASE))
#define FLASH_CODE (*(volatile unsigned long *)(0x0004 + FLASH_BASE))
int flashtest();
extern unsigned long code[];
const unsigned long topSize[] = {
0x0,
0x10000,
0x20000
};
const unsigned long bottomSize[] = {
0x0,
0x4000,
0x6000,
0x8000,
0x10000,
0x20000
};
int c_entry()
{
int i = 0;
int t = 0;
init_serial();
flashtest();
while(1)
{
;
}
}
//wzx modify 2004.5.26
int flashtest()
{
unsigned char s[10]; //printf buffer
unsigned long k=0;
unsigned long dbuffer1;
unsigned long dbuffer2;
unsigned long dataq;
unsigned long testdata;
unsigned long getdata;
unsigned int counter;
volatile unsigned long delayi;
volatile unsigned long *src=code;
volatile unsigned long *P=(unsigned long*)0x00;
*P=0x00f000f0;
puts("\n\nFlash program Star \n");
puts("Flash Begin Erase\n"); //erase flash
FLASH_555 = 0x00aa00aa;
FLASH_2AA = 0x00550055;
FLASH_555 = 0x00800080;
FLASH_555 = 0x00aa00aa;
FLASH_2AA = 0x00550055;
FLASH_555 = 0x00100010;
for (;;)
{
dataq =*P;
dataq =dataq&0x00800080;
if(dataq) //polling DQ7
{
break; //if DQ7=1 quit
}
}
puts("Flash Erase over\n");
puts("Wait for 15s\n");
P=(unsigned long*)0x00; //Reset flash
for(delayi=0;delayi<=10000000;delayi++)
{;}
//program flash
puts("Flash Program \n");
for(counter=0;counter<=0x8000;counter++)
{
FLASH_555 = 0x00aa00aa;
FLASH_2AA = 0x00550055;
FLASH_555 = 0x00a000a0;
*P=*src;
for(;;) //Wait for data write
{
getdata=*P;
if((getdata&(0x00800080))==(*src&(0x00800080))) //polling DQ7
break; //write ok
if((getdata&(0x00200020))==0x00200020) //polling DQ5
{
getdata=*P;
if((getdata&(0x00800080))==(testdata&(0x00800080)))
break; //write ok
else
{
puts("\nFlash Write Fail\n");
puts("\nThe Fail Address=");
sprintf(s,"x%x",P);
puts(s);
return(1); //Write fail
}
}
}
getdata=*P;
if(getdata!=*src)
{
sprintf(s,"x%x",P);
puts("\nVerify Error The Error Address=");
puts(s);
sprintf(s,"x%x",*src);
puts("\nThe Correct Data =");
puts(s);
sprintf(s,"x%x",getdata);
puts("\nThe Read Data =");
puts(s);
dbuffer1=getdata&0x0000ffff;
dbuffer2=*src&0x0000ffff;
if(dbuffer1!=dbuffer2)
{
puts("\nThe Error Chip is U21\n");
}
dbuffer1=getdata&0xffff0000;
dbuffer2=*src&0xffff0000;
if(dbuffer1!=dbuffer2)
{
puts("\nThe Error Chip is U22\n");
}
return(1);
}
src=src+1; //Write next data
P=P+1;
if((counter&0x3ff)==0)
{
uart_putc('.');
}
}
puts("#Flash Program Ok\n");
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -