OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6439|回复: 3

sd iap 遇到的问题

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-1-8
在线时间
0 小时
发表于 2015-7-23 21:27:21 | 显示全部楼层 |阅读模式
5金钱
写了一个利用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);
}


最佳答案

查看完整内容[请看2#楼]

堆栈太大,自然死机。 不想用全局变量,可以考虑用内存管理。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2015-7-23 21:27:22 | 显示全部楼层
堆栈太大,自然死机。
不想用全局变量,可以考虑用内存管理。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-1-8
在线时间
0 小时
 楼主| 发表于 2015-7-24 08:20:25 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢,原子哥,但是我如果将
u32 iapbuf[512];
u32 ia_read[512];
定义成全局的或采用动态申请的办法,flash就写入错误,如果是定义成局部变量,然后把栈加大到8K,就没问题。
搞不明白怎么回事。
另外,问一下:
1)stm32的内存是不是这样分配的:堆+栈+全局变量区?
2)iap升级后,再执行iap_load_app(FLASH_APP1_ADDR);是不是和rest一样,堆+栈+全局变量都被重新初始化了?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2015-7-26 22:20:31 | 显示全部楼层
回复【3楼】egang:
---------------------------------
 这我也不明白你的了,呵呵。
1,你可以看这里:http://www.openedv.com/posts/list/24152.htm
2,不一样,内存的数据,没有清掉的,可能会存在。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-20 16:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表