初级会员
- 积分
- 108
- 金钱
- 108
- 注册时间
- 2014-5-20
- 在线时间
- 23 小时
|
最近看到群里有大神写了关于F4的SD卡IAP升级,移植了看看,挺好用的,非常感谢。
想进一步做到远程升级,思路如下:
1、F4写入2个程序,一个IAP,一个APP,IAP用于更新,APP用于接收网络数据,分包发送,每个包1024长度;
2、APP接收网络数据,存入WQ25,并保存状态,重启
3、IAP读取状态,确认更新,读取WQ25数据,写入flash。
4、更新完毕,跳转;
那问题来了,跳转失败!最后查看到,在下面代码部分失败:
..............................................................
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
printf("栈顶地址((*(vu32*)appxaddr)&0x2FFE0000) => %x %x\r\n",(*(vu32*)appxaddr),((*(vu32*)appxaddr)&0x2FFE0000));
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
printf("\r\n");
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
else
{
printf("栈顶地址非法\r\n");
}
}
..............................................................
实际打印为:((*(vu32*)appxaddr)&0x2FFE0000) => 3631 0
正确打印为:((*(vu32*)appxaddr)&0x2FFE0000) => 2001fda0 20000000
怀疑是升级文件问题,将升级文件放到SD卡中,通过IAP读取,分包,每包1024,写入WQ25。全部写入完毕后,然后再从WQ25中读取出来,竟然是跳转OK的!!!!
这是我想不明白的地方,现求助原子大哥!
部分代码如下:
********************************************************************
#define UPDATA_APP_CMD (1024*1024*12 + 800)
#define UPDATA_APP_DATA (1024*1024*12 + 820)
********************************************************************
file:///C:\Users\lenovo\AppData\Roaming\Tencent\Users\362342450\QQ\WinTemp\RichOle\L)_P9GGM5NT1${R4YXO)O}R.png
****************************************************************
file:///C:\Users\lenovo\AppData\Roaming\Tencent\Users\362342450\QQ\WinTemp\RichOle\L)_P9GGM5NT1${R4YXO)O}R.png
********************************************************************
|
|