天线|RF射频
直播中

刘建华

7年用户 219经验值
私信 关注
[经验]

基于F4的LWIP网络升级思路分享!

最近看到群里有大神写了关于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 %xrn",(*(vu32*)appxaddr),((*(vu32*)appxaddr)&0x2FFE0000));
        if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.
        {
                printf("rn");
                jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)               
                MSR_MSP(*(vu32*)appxaddr);                        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
                jump2app();                                        //跳转到APP.
        }
        else
        {
                printf("栈顶地址非法rn");
        }
}                 
..............................................................
实际打印为:((*(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:UserslenovoAppDataRoamingTencentUsers362342450QQWinTempRichOleL)_P9GGM5NT1${R4YXO)O}R.png
****************************************************************
file:///C:UserslenovoAppDataRoamingTencentUsers362342450QQWinTempRichOleL)_P9GGM5NT1${R4YXO)O}R.png
********************************************************************

回帖(2)

刘斌

2019-11-5 08:57:34
自己顶!
举报

于敏

2019-11-5 09:10:56
Mark一下
举报

更多回帖

发帖
×
20
完善资料,
赚取积分