请教原子哥和做过IAP的人:在ST的官方IAP里,更新程序下载完成之后进入主菜单,我现在不让他进入主菜单,而是更新完成后直接进入更新后的程序,通过在download.c里的if(size>0)中添加
SerialPutString("Execute the new Program\r\n\n");
//跳转至新用户代码
JumpAddress = *(__IO uint32_t*) (ApplicationAddress1+ 4);
Jump_To_Application = (pFunction) JumpAddress;
//初始化新用户程序的堆栈指针
__set_MSP(*(__IO uint32_t*) ApplicationAddress1);
Jump_To_Application();
可以实现,但是需要修改更新程序地址,即此处的ApplicationAddress1。但是系统重启后如何进入更新后的程序我还是不太清除。我知道通过修改上面代码中的用户地址可以实现,但是这样做在以后的升级中会很麻烦,更新一次就要改一次用户程序地址。我想过在内部FLASH的最高两页预留出来存放一个指针指向更新的程序地址,内次更新完成后改变此指针内容;系统重启后读取此指针内容,这样可以解决如何获取更新程序的地址问题。但是这里有两点我不了解,第一,融合将此指针准确定位到某地址处,如0x0803 F800,这个我不会写(基础比较差,不好意思);第二,更改指针内容肯定在更新代码下载完成以后,我把此指针放在哪里(具体哪个子文件里)可以在系统重启后获得正确的更新代码存放地址。
在此解释一下,我把FLASH分为三部分,分别存放IAP、APP1、APP2,APP1和APP2轮流存放新、旧程序,以防在升级失败后还能执行旧程序。所以存在系统重启后如何准确定位到更新代码处的问题。
|