打印
[STM32F1]

STM32F103ZET6 IAP与APP来回跳转的问题

[复制链接]
4995|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
墨白色雨天|  楼主 | 2016-1-26 15:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我写了个类似于IAP程序升级的程序,是基于原子的IAP串口程序写的,但是现在遇到了这样的问题,上电之后IAP运行正常,串口中断可以使用,然后跳转到APP程序,APP程序也正常,串口也可以使用,  然后跳回IAP程序,IAP串口中断不能使用,再跳回APP后,APP的中断也不能用了,这是怎么回事呢?
沙发
ccw1986| | 2016-1-26 20:32 | 只看该作者
你这个iap的程序是固化到片内flash里面吗

使用特权

评论回复
板凳
墨白色雨天|  楼主 | 2016-1-27 08:58 | 只看该作者
ccw1986 发表于 2016-1-26 20:32
你这个iap的程序是固化到片内flash里面吗

我把IAP程序放在了flash的起始地址。就是0x08000000那里

使用特权

评论回复
地板
zhuotuzi| | 2016-1-27 11:40 | 只看该作者
那个最好来个中断或者按键程序,出发后,就跳转指令:goto

使用特权

评论回复
5
墨白色雨天|  楼主 | 2016-1-28 09:13 | 只看该作者
zhuotuzi 发表于 2016-1-27 11:40
那个最好来个中断或者按键程序,出发后,就跳转指令:goto

他现在是能够完成一次跳转,IAP->APP,这个时候APP的中断可以响应, 然后我在通过APP串口中断接收指令,接收到跳转指令后,APP->IAP 这个时候IAP里的中断就不能执行了,串口中断无法接收数据,但是流水灯可以运行

使用特权

评论回复
6
huangqi412| | 2016-1-28 11:32 | 只看该作者
墨白色雨天 发表于 2016-1-28 09:13
他现在是能够完成一次跳转,IAP->APP,这个时候APP的中断可以响应, 然后我在通过APP串口中断接收指令,接 ...

能跳转不能响应中断,  问题肯定是在中断开关和中断向量偏移 上

使用特权

评论回复
7
yklstudent| | 2016-1-28 11:44 | 只看该作者
因为串口多半挂了,在线跑监控下串口数据就会知道出啥问题了

使用特权

评论回复
8
墨白色雨天|  楼主 | 2016-1-28 11:49 | 只看该作者
huangqi412 发表于 2016-1-28 11:32
能跳转不能响应中断,  问题肯定是在中断开关和中断向量偏移 上

在APP跳转到IAP时中断向量表也设置了啊,void JumpToBootLpader(u32 appxaddr)
{
                if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.
                {                       

                        BootLoader = (iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)

                        __set_MSP(*(volatile unsigned int*) appxaddr);                //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)

                       
                        printf("跳转至IAP\r\n");       
                        BootLoader();
        }                       

}这是跳转的代码,appxaddr的值给的0x08000000;那个你说的中断开关的问题,在IAP的mai函数中的初始化解决不了么?

这是我改的代码,有点乱

APP.rar

319.09 KB

IAP-Bootloader V1.0.rar

323.4 KB

使用特权

评论回复
9
墨白色雨天|  楼主 | 2016-1-28 14:32 | 只看该作者
yklstudent 发表于 2016-1-28 11:44
因为串口多半挂了,在线跑监控下串口数据就会知道出啥问题了

串口还有外部中断都不能用了,,,感觉应该是中断的问题。但是不知道从哪里入手。。。

使用特权

评论回复
10
yklstudent| | 2016-1-28 17:24 | 只看该作者
在线调试啊,给你工具干啥用的

使用特权

评论回复
11
dongnanxibei| | 2016-1-30 12:40 | 只看该作者
在线跑监控下串口数据就会知道出啥问题了

使用特权

评论回复
12
小狗爱吃骨头| | 2016-1-30 15:20 | 只看该作者
zhuotuzi 发表于 2016-1-27 11:40
那个最好来个中断或者按键程序,出发后,就跳转指令:goto

不是说用goto指令对程序不好吗

使用特权

评论回复
13
13528471454| | 2016-1-30 15:50 | 只看该作者
把中断关闭和清除一次中断标志。

使用特权

评论回复
14
huangcunxiake| | 2016-1-31 20:13 | 只看该作者
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.
                {                        

                        BootLoader = (iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)

                        __set_MSP(*(volatile unsigned int*) appxaddr);                //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)

                        
                        printf("跳转至IAP\r\n");        
                        BootLoader();
        }                        

使用特权

评论回复
15
zchong| | 2016-2-1 22:49 | 只看该作者
IAP跳转app前最好关闭所有中断,跳转到app后,需要重新设置中断相量偏移地址

使用特权

评论回复
16
xlong_06| | 2016-2-2 15:07 | 只看该作者
在跳转的过程中,看是不是将串口有关的初始化被其他程序覆盖了,或者有多次的初始化,按道理说你在IAP中初始化一次串口程序就好了!

使用特权

评论回复
17
webkit_| | 2016-2-4 15:32 | 只看该作者
是不是这里的问题: NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); 跳出IAP前关中断 进入APP后应该重新初始化RCC,NVIC(DEINIT)并注意前面那个函数的具体参数,

使用特权

评论回复
18
zhuotuzi| | 2016-2-6 17:26 | 只看该作者
小狗爱吃骨头 发表于 2016-1-30 15:20
不是说用goto指令对程序不好吗

用的多了,怕你跳转乱了不好,这种操作都是用的GOTO,汇编里也有这个指令

使用特权

评论回复
19
zhuotuzi| | 2016-2-6 17:30 | 只看该作者
不要因为有的函数要求慎用,你就不用,慎用是不让随便用,该用的时候要去用,

使用特权

评论回复
20
shiqianjue| | 2020-6-19 18:39 | 只看该作者
你好,看到你关于iap的帖子,我也遇到了同样的问题,请问你解决了吗?

使用特权

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

本版积分规则

1

主题

8

帖子

0

粉丝