没有硬件,自己觉得逻辑上是对着的。大家给调调错误
void main(void)
{
UINT8 *pBUF_env , *pBUF_file;
UINT8 flag , size_file;
UINT8 sector;
UINT8 readByte = 0;
UINT8 i , j;
UINT8 verify_file;
initSPI();
initTimer0();
InitIAP();
//读标志和升级文件的大小.pBUF_flash的第一个参数定义为升级的标志参数,第二个为升级文件的大小
FlashRead(EXT_ENV_ADDR , pBUF_env , 2);
//取得升级标志
flag = pBUF_env[0];
// flag =1; //flag test
//取得升级文件大小
size_file = pBUF_env[1];
// size_IAP = 65500;//size test
if(size_file > 65536)
{
//更新程序超出PC计数范围————报错
printf("\nsys>error the size of down load program");
while(1);
}
else
{
while(flag)
{
//取得扇区数量
if(size_file % 128)
{
sector = size_file / 128 + 1;
}
else
{
sector = size_file / 128;
}
//擦除相应扇区
for(i=0;i<sector;i++)
{
for(j=0;j<128;j++)
{
if(byte_verify(BLOCK0_64K_ADDR + j) == 0xff)
{
continue;
}
else
{
sector_erase(BLOCK0_64K_ADDR + i * 128);
}
}
}
//读取升级文件
FlashRead(EXT_APP_ADDR , pBUF_file , size_file);
//下载新程序
for(j=0;j<size_file;j++)
{
byte_program(BLOCK0_64K_ADDR + j , pBUF_file[j]);
verify_file = byte_verify(BLOCK0_64K_ADDR + j);
if(verify_file != pBUF_file[j])
{
printf("\nsys>error verify of down load program");
while(1);
}
}
//更改标志
flag = 0;
}
//更改映射
SFCF = SFCF | 0x03;
}
return;
}