[STM32F1] STM32F103ZET6 IAP与APP来回跳转的问题

[复制链接]
 楼主| 墨白色雨天 发表于 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
 楼主| 墨白色雨天 发表于 2016-1-28 09:13 | 显示全部楼层
zhuotuzi 发表于 2016-1-27 11:40
那个最好来个中断或者按键程序,出发后,就跳转指令:goto

他现在是能够完成一次跳转,IAP->APP,这个时候APP的中断可以响应, 然后我在通过APP串口中断接收指令,接收到跳转指令后,APP->IAP 这个时候IAP里的中断就不能执行了,串口中断无法接收数据,但是流水灯可以运行
huangqi412 发表于 2016-1-28 11:32 | 显示全部楼层
墨白色雨天 发表于 2016-1-28 09:13
他现在是能够完成一次跳转,IAP->APP,这个时候APP的中断可以响应, 然后我在通过APP串口中断接收指令,接 ...

能跳转不能响应中断,  问题肯定是在中断开关和中断向量偏移 上
yklstudent 发表于 2016-1-28 11:44 | 显示全部楼层
因为串口多半挂了,在线跑监控下串口数据就会知道出啥问题了
 楼主| 墨白色雨天 发表于 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, 下载次数: 31

IAP-Bootloader V1.0.rar

323.4 KB, 下载次数: 39

 楼主| 墨白色雨天 发表于 2016-1-28 14:32 | 显示全部楼层
yklstudent 发表于 2016-1-28 11:44
因为串口多半挂了,在线跑监控下串口数据就会知道出啥问题了

串口还有外部中断都不能用了,,,感觉应该是中断的问题。但是不知道从哪里入手。。。
yklstudent 发表于 2016-1-28 17:24 | 显示全部楼层
在线调试啊,给你工具干啥用的
dongnanxibei 发表于 2016-1-30 12:40 | 显示全部楼层
在线跑监控下串口数据就会知道出啥问题了
小狗爱吃骨头 发表于 2016-1-30 15:20 | 显示全部楼层
zhuotuzi 发表于 2016-1-27 11:40
那个最好来个中断或者按键程序,出发后,就跳转指令:goto

不是说用goto指令对程序不好吗
13528471454 发表于 2016-1-30 15:50 | 显示全部楼层
把中断关闭和清除一次中断标志。
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();
        }                        
zchong 发表于 2016-2-1 22:49 | 显示全部楼层
IAP跳转app前最好关闭所有中断,跳转到app后,需要重新设置中断相量偏移地址
xlong_06 发表于 2016-2-2 15:07 | 显示全部楼层
在跳转的过程中,看是不是将串口有关的初始化被其他程序覆盖了,或者有多次的初始化,按道理说你在IAP中初始化一次串口程序就好了!
webkit_ 发表于 2016-2-4 15:32 | 显示全部楼层
是不是这里的问题: NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); 跳出IAP前关中断 进入APP后应该重新初始化RCC,NVIC(DEINIT)并注意前面那个函数的具体参数,
zhuotuzi 发表于 2016-2-6 17:26 | 显示全部楼层
小狗爱吃骨头 发表于 2016-1-30 15:20
不是说用goto指令对程序不好吗

用的多了,怕你跳转乱了不好,这种操作都是用的GOTO,汇编里也有这个指令
zhuotuzi 发表于 2016-2-6 17:30 | 显示全部楼层
不要因为有的函数要求慎用,你就不用,慎用是不让随便用,该用的时候要去用,
shiqianjue 发表于 2020-6-19 18:39 | 显示全部楼层
你好,看到你关于iap的帖子,我也遇到了同样的问题,请问你解决了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部