打印
[STM32F1]

请教stm32 IAP多个app的问题

[复制链接]
4504|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我目前系统里有一个IAP,2个APP,称为APP1和APP2,分别在FLASH的两个不同区域,我写的IAP只是根据不同的情况在上电后选择跳转到APP1或者APP2,本身不具有升级功能,升级功能是写在APP1和APP2里的。2个APP都有对另一个APP升级的功能,比如当前运行的是APP1,那么就可以对APP2进行升级,反之亦然。现在程序的升级没有问题,但就是从一个APP跳转到另一个APP时会有问题。说起来可能有点乱,举例说明:比如当前运行在APP1,在某时刻对APP2进行升级,升级完毕后通过代码跳转到APP2,结果失败。必须重新复位(硬件复位或者调用复位函数复位)后才能通过IAP跳转到APP2。这证明了APP2的升级是完全正确的。只是必须通过复位来实现跳转,而不能通过在APP1中写代码实现跳转。很奇怪,我在APP1跳转到APP2的时候也已经关闭了所有中断。难道一定要复位吗?应该不是吧。请教各位。
沙发
zhuomuniao110| | 2016-10-20 18:21 | 只看该作者
升级完成后,这个时候其实还是在APP1里的,你这个时候进行判断是否完成升级,完成,那么接下来进入你的goto函数,跳转拿到APP2,应该可以实现。

使用特权

评论回复
板凳
terminator-04|  楼主 | 2016-10-20 20:25 | 只看该作者
zhuomuniao110 发表于 2016-10-20 18:21
升级完成后,这个时候其实还是在APP1里的,你这个时候进行判断是否完成升级,完成,那么接下来进入你的goto ...

你好!我用的就是ST的官方代码:
  if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)  
        {  
            JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);  
            Jump_To_Application = (pFunction) JumpAddress;  
            __set_MSP(*(__IO uint32_t*) ApplicationAddress);  
            Jump_To_Application();  
        }  
我仿真看了,跳转的地址,和栈顶值都是对的,而且我的IAP中的跳转代码也是一样的,在IAP中就可以,但在app1中就不成功,怎么回事呢?

使用特权

评论回复
地板
z00| | 2016-10-20 21:23 | 只看该作者
应该要进行复位

使用特权

评论回复
5
xmshao| | 2016-10-20 21:31 | 只看该作者
会不会是在从APP1跳往APP2过程中哪个地址变量出错了。

毕竟从IAP区跳倒APP2 跟 从APP1跳到APP2区本质上没差别。

使用特权

评论回复
6
terminator-04|  楼主 | 2016-10-20 23:32 | 只看该作者
xmshao 发表于 2016-10-20 21:31
会不会是在从APP1跳往APP2过程中哪个地址变量出错了。

毕竟从IAP区跳倒APP2 跟 从APP1跳到APP2区本质上没 ...

APP1跳到APP2最先不是先跳到APP2复位函数里吗?我仿真了一下,地址是对的。
我还有一个疑问,APP1和APP2的RAM区可以公用吗?我现在是公用的,如果说不能公用,那APP1跳到APP2后不都已经执行了APP2的复位函数了吗?堆和栈都应该已经重新初始化了呀,怎么回事呢。

使用特权

评论回复
7
yklstudent| | 2016-10-21 10:32 | 只看该作者
不复位也可以吧,试试从APP1跳转到APP2之前,把APP1内所有开启的硬件模块都关闭/复位,然后再执行跳转

使用特权

评论回复
8
wenunit| | 2016-10-21 14:55 | 只看该作者
就应该复位,不同程序间切换,不复位怎么合适.

使用特权

评论回复
9
qbasicljx| | 2016-10-21 15:12 | 只看该作者
参考 IAP 的最后跳转步骤啊

使用特权

评论回复
10
lxp1986xp| | 2016-10-21 16:16 | 只看该作者
解决了吗?感觉不是大问题。
1.三个flash分区确定分对了吗?在更新其中一个APP,擦除flash时,不要把IAP和另一个APP的flash擦除掉。
2.RAM是可以共用的。
3.可以看一下仿真一下,看一下memory中IAP、APP1和APP2是否和.bin一致。
4.在仿真时,从APP1跳转到APP2后,查看LR寄存器的值有没有异常;定位出问题的APP2程序在flash中的位置,和.bin对比一下。

使用特权

评论回复
11
terminator-04|  楼主 | 2016-10-21 16:24 | 只看该作者
lxp1986xp 发表于 2016-10-21 16:16
解决了吗?感觉不是大问题。
1.三个flash分区确定分对了吗?在更新其中一个APP,擦除flash时,不要把IAP和 ...

IAP和两个APP在Flash中的分区是对的,我在Flash的最后一个页存了一个标志位,通过不同的标志位来跳转到不同的程序,就是说APP1和APP2都是同时存在的,我在IAP中仿真,跳转到APP1,或跳转到APP2都是可以的,这个应该可以说明APP1和APP2在Flash中的位置是对的吧。现在就是在APP中互相跳转不行,我之前以为是RAM区共用了的原因,但最后分开了也是一样,很奇怪。

使用特权

评论回复
12
lxp1986xp| | 2016-10-21 16:35 | 只看该作者
terminator-04 发表于 2016-10-21 16:24
IAP和两个APP在Flash中的分区是对的,我在Flash的最后一个页存了一个标志位,通过不同的标志位来跳转到不 ...

你先试一下不重启状态下,APP1到IAP到APP2这样能行吗?

使用特权

评论回复
13
lxp1986xp| | 2016-10-21 16:42 | 只看该作者
terminator-04 发表于 2016-10-21 16:24
IAP和两个APP在Flash中的分区是对的,我在Flash的最后一个页存了一个标志位,通过不同的标志位来跳转到不 ...

能看一下APP1和APP2的.bin前8个字节是什么吗?还有你在生成.bin文件时,VECT_TAB_OFFSET设置了吗?

使用特权

评论回复
14
terminator-04|  楼主 | 2016-10-21 17:11 | 只看该作者
lxp1986xp 发表于 2016-10-21 16:42
能看一下APP1和APP2的.bin前8个字节是什么吗?还有你在生成.bin文件时,VECT_TAB_OFFSET设置了吗? ...


VECT_TAB_OFFSET在APP1和APP2的开始都根据自己的情况设置了。如果不设的话跳过去也运行不正常吧。

使用特权

评论回复
15
terminator-04|  楼主 | 2016-10-21 17:22 | 只看该作者
lxp1986xp 发表于 2016-10-21 16:16
解决了吗?感觉不是大问题。
1.三个flash分区确定分对了吗?在更新其中一个APP,擦除flash时,不要把IAP和 ...

这是我在APP1运行时,读取APP2的bin文件并烧写到Flash中的结果,我只截取了其实和结束部分,我APP2是从FLash的0x8026000开始的。IAP和APP1我也照此方法对比了一下,都是没错的。

RTX截图未命名2.JPG (721.52 KB )

RTX截图未命名2.JPG

1.JPG (719.58 KB )

1.JPG

使用特权

评论回复
16
lxp1986xp| | 2016-10-21 17:28 | 只看该作者
terminator-04 发表于 2016-10-21 17:11
VECT_TAB_OFFSET在APP1和APP2的开始都根据自己的情况设置了。如果不设的话跳过去也运行不正常吧。

...

你APP1是从多少开始的?VECT_TAB_OFFSET不设不行。

使用特权

评论回复
17
lxp1986xp| | 2016-10-21 17:29 | 只看该作者
lxp1986xp 发表于 2016-10-21 17:28
你APP1是从多少开始的?VECT_TAB_OFFSET不设不行。

你试一下APP1跳转IAP跳转APP2行不行?

使用特权

评论回复
18
terminator-04|  楼主 | 2016-10-21 17:44 | 只看该作者
本帖最后由 terminator-04 于 2016-10-21 17:47 编辑
lxp1986xp 发表于 2016-10-21 17:29
你试一下APP1跳转IAP跳转APP2行不行?

IAP从0x08000000开始,APP1从0x800D000开始,APP2从0x8026000开始。
中断偏移我在APP1和APP2的开始都设了的:代码如下:
    if ((*(uint16_t *)(APP_FLAG_ADDRESS)) != 0xAAAA)                    //有效程序存储在程序区1
    {
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, APPLICATION_1_ADDRESS);
    }
    else                                                                                             //有效程序存储在程序区2
    {
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, APPLICATION_2_ADDRESS);
    }   
我试了一下,从APP1也不能跳到IAP,更不谈再跳到APP2了,但是从IAP跳到APP1和APP2都是可以的。很奇怪。
所以我目前的处理就是在对APP升级后进行一次系统复位,也就是用NVIC_SystemReset()函数,这样从IAP开始,再根据标志位跳转到相应的APP。

使用特权

评论回复
19
zhuomuniao110| | 2016-10-21 21:15 | 只看该作者
或许内存被APP1占用的导致的失败?或者你直接设置的重启函数,玩出后,自动重启,计算机升级后都需要不停的重启的。

使用特权

评论回复
20
Thor9| | 2016-10-21 21:44 | 只看该作者
从APP1跳转到APP2之前,把APP1内所有开启的硬件模块都关闭/复位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

0

粉丝