写了一个利用sd卡升级f407的程序,基本上就是照着原子哥的串口iap改的,关键code如下:
如果u32 iapbuf[512];
u32 ia_read[512];定义为全局变量或动态申请内存,则升级错,跟踪发现是 flash 擦除 或写入 出现错误,如果
定义成 局部变量就没问题。望各路大侠指点迷津!
void FirmwareUpdate(void)
{
FIL *ftemp;
u8 res;
u32 br=0,i;
u32 iapbuf[512];
u32 ia_read[512];
//u32 * iapbuf;
//u32 * ia_read;
u8 flag=0;
//
u32 appsize=0,t=0;
u32 num=0,last=0,j=0,k=0;
u32 temp;
u32 fwaddr=FLASH_APP1_ADDR;
FILINFO fno;
//
//iapbuf=(u32*)mymalloc(SRAMIN,512*4);
//ia_read=(u32*)mymalloc(SRAMIN,512*4);
//
ftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL));
buf=mymalloc(SRAMIN,STM_PAGE_SIZE);
res=f_stat((TCHAR*)fname, &fno);
if((res==FR_OK)&&(buf))
appsize=fno.fsize;
LCD_ShowString(0,200,12*19,24,24,fname);
LCD_ShowString(0,200+24,12*14,24,24,"size: B");
LCD_ShowNum(0+12*6,200+24,appsize,7,24);
//
res=f_open(ftemp,(TCHAR*)fname,FA_READ)
appsize=f_size(ftemp);
LCD_ShowNum(0+12*6,200+24*2,appsize,7,24);
// if((res==FR_OK)&&(buf)&&(ftemp))
if((res==FR_OK)&&(ftemp))
{
num=appsize/STM_PAGE_SIZE;
last=appsize%STM_PAGE_SIZE;
if(num==0)//app size :0--2047B *bin
{
//
fupd_prog(0,300,24,appsize,0);
//
i=0;
f_read(ftemp,buf,appsize,(UINT*)&br);//
for(t=0;t<appsize;t+=4)
{
temp=(u32)buf[t+3]<<24;
temp|=(u32)buf[t+2]<<16;
temp|=(u32)buf[t+1]<<8;
temp|=(u32)buf[t+0];
//dfu+=4;//????4??×???
iapbuf[i++]=temp;
}
if(i)
STMFLASH_Write(fwaddr,iapbuf,i);
//
STMFLASH_Read(fwaddr,ia_read,appsize/4);
for(k=0;k<appsize/4;k++)
{
if(ia_read[k]!=iapbuf[k])
flag=1;
}
//
fupd_prog(0,300,24,appsize,appsize);
//
}
else
{
if(last==0)//app size : 2048 4096 ...
{
for(j=0;j<num;j++)
{
i=0;
f_read(ftemp,buf,STM_PAGE_SIZE,(UINT*)&br);//
for(t=0;t<STM_PAGE_SIZE;t+=4)
{
temp=(u32)buf[t+3]<<24;
temp|=(u32)buf[t+2]<<16;
temp|=(u32)buf[t+1]<<8;
temp|=(u32)buf[t+0];
//dfu+=4;//????4??×???
iapbuf[i++]=temp;
if(i==512)
{
i=0;
STMFLASH_Write(fwaddr,iapbuf,512);
//
STMFLASH_Read(fwaddr,ia_read,512);
for(k=0;k<512;k++)
{
if(ia_read[k]!=iapbuf[k])
flag=1;
}
//
fwaddr+=STM_PAGE_SIZE;//????2048 512*4=2048
}
}
//
fupd_prog(0,300,24,appsize,j*2048);
//
}
//
fupd_prog(0,300,24,appsize,appsize);
//
}
else// app size : num*2048+x
{
for(j=0;j<num;j++)
{
i=0;
f_read(ftemp,buf,STM_PAGE_SIZE,(UINT*)&br);//
for(t=0;t<STM_PAGE_SIZE;t+=4)
{
temp=(u32)buf[t+3]<<24;
temp|=(u32)buf[t+2]<<16;
temp|=(u32)buf[t+1]<<8;
temp|=(u32)buf[t+0];
//dfu+=4;//????4??×???
iapbuf[i++]=temp;
if(i==512)
{
i=0;
STMFLASH_Write(fwaddr,iapbuf,512);
//
STMFLASH_Read(fwaddr,ia_read,512);
printf("\r\n%x",iapbuf[0]);
printf("\r\n%x",ia_read[0]);
for(k=0;k<512;k++)
{
if(ia_read[k]!=iapbuf[k])
flag=1;
}
//
fwaddr+=STM_PAGE_SIZE;
}
}
//
fupd_prog(0,300,24,appsize,j*2048);
//
}
i=0;
f_read(ftemp,buf,last,(UINT*)&br);//
for(t=0;t<last;t+=4)
{
temp=(u32)buf[t+3]<<24;
temp|=(u32)buf[t+2]<<16;
temp|=(u32)buf[t+1]<<8;
temp|=(u32)buf[t+0];
//dfu+=4;//????4??×???
iapbuf[i++]=temp;
}
if(i)
STMFLASH_Write(fwaddr,iapbuf,i);
//
STMFLASH_Read(fwaddr,ia_read,last/4);
for(k=0;k<last/4;k++)
{
if(ia_read[k]!=iapbuf[k])
flag=1;
}
//
//
fupd_prog(0,300,24,appsize,appsize);
//
}
}
}
else
{
//
LCD_ShowString(0,200,12*17,24,24,"no update file!!!");
//
}
if(flag==0)
{
LCD_ShowString(0,400+24,12*13,24,24,"update ok!");
}
else
{
LCD_ShowString(0,400+24,12*13,24,24,"update error!");
}
f_close(ftemp);
myfree(SRAMIN,buf);
myfree(SRAMIN,ftemp);//??·?????
//myfree(SRAMIN,iapbuf);
//myfree(SRAMIN,ia_read);
}
|