OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16454|回复: 14

IAP跳转到APP后,APP中systick中断处理程序不能进入,为何?

[复制链接]

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2012-10-13
在线时间
0 小时
发表于 2012-10-13 11:23:34 | 显示全部楼层 |阅读模式

参照ST的IAP例程,整个程序分为IAP和APP两部分,前者从0x8000000开始存放、程序二进制文件小于4K字节,后者从0x8004000开始存放、程序二进制文件接近63K字节。先通过JTAG将APP程序下载到0x8004000开始的地址,再将IAP程序下载到0x8000000开始的地址并在下载后reset,从IAP跳转到APP正常,但是进入APP后在一个依赖systick实现的延时函数中死循环,经查为systick中断处理程序未能进入,导致延时计数器不能递减为0。将APP程序单独下载到0x8000000开始的地址运行,中断响应一切都正常。推测systick中断不能响应要么是中断被屏蔽,要么是中断向量表设置不当,具体原因现在不详,谁遇到过类似问题?

>> IAP程序的关键代码:

#define ApplicationAddress    0x8004000
......
//跳转至用户代码
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;

//初始化用户程序的堆栈指针
__set_MSP(*(__IO uint32_t*) ApplicationAddress);

Jump_To_Application();
......

>> APP程序的关键代码:
......
// MCU初始化
SystemInit();      

 //设置中断向量表的位置在 0x4000
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);
......

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

173

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2441
金钱
2441
注册时间
2014-11-5
在线时间
348 小时
发表于 2016-1-20 14:48:37 | 显示全部楼层
我也遇到了,跳转后哪儿调用延时函数,程序就死在哪儿,怎么解决的??
回复 支持 1 反对 0

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2012-10-13
在线时间
0 小时
 楼主| 发表于 2012-10-13 12:45:17 | 显示全部楼层
查了下0x8000000和0x8004000两个起始地址后面第二个字开始的内容,从数值看两个起始地址后面都是保存有中断向量表的(reset handler的起始地址偏移量分别为0x18D和0x119,实际地址应该是数值减去1,因为0x18D和0x119都是奇数,不符合4字节地址边界对齐的要求),另外单步调试查询了systick中断是被enable的,因此还出现systick不能响应的问题有点蹊跷。





回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-10-13 17:50:11 | 显示全部楼层
可以参考下STM32开发指南的IAP部分。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2012-10-13
在线时间
0 小时
 楼主| 发表于 2012-10-13 19:23:49 | 显示全部楼层
看了STM32开发指南的IAP部分文档和源代码,没发现APP程序中中断不能响应的线索。依你玩STM32的经验,从IAP正常跳转到APP后中断不能响应的最可能原因是什么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-10-13 22:04:00 | 显示全部楼层
回复【4楼】hehe168:
---------------------------------
向量偏移表设置的问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2012-10-13
在线时间
0 小时
 楼主| 发表于 2012-10-15 01:22:03 | 显示全部楼层
回复【5楼】正点原子:

---------------------------------
跟踪了程序从IAP跳转到APP后的NVIC相关寄存器设置(在KEIL调试窗口调取),发现中断向量表的起始地址仍然维持为0x8000000,而APP程序的main函数开始部分调用的设置中断向量表偏移量的操作看起来没生效(通过NVIC_SetVectorTable函数后面的点亮LED语句可判断程序确实执行了NVIC_SetVectorTable函数):
 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);

什么会导致NVIC_SetVectorTable函数设置失败?(设置后中断向量表被复原为0x8000000的可能性也有,但是在C代码级别没有任何对中断向量表寄存器的操作)?

相同的IAP程序,跳转到不同规模的APP程序,文件小于4K的APP中中断响应正常、文件大小接近62K的APP中中断响应异常,文件大小的不同应该只是表面现象。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-10-15 10:04:05 | 显示全部楼层
这就怪了,不过我也没刷过62K的APP,我在战舰版测试,最多就是40多KB的代码,中断响应都无问题的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2012-10-13
在线时间
0 小时
 楼主| 发表于 2012-10-15 10:41:38 | 显示全部楼层
回复【7楼】正点原子:

---------------------------------
这点是比较奇怪,语句看起来没有执行,要么是编译器把代码优化了,要么是哪里的设置把中断向量表偏移量修改了,不过我自己在程序里没有任何的显式操作。

STM32的中断向量表偏移量寄存器可能会在哪些地方被修改?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-10-15 12:23:15 | 显示全部楼层
代码里面只需要修改这里就好了:NVIC_SetVectorTable
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2012-10-13
在线时间
0 小时
 楼主| 发表于 2012-10-15 12:45:35 | 显示全部楼层
回复【9楼】正点原子:

---------------------------------
我在APP程序的main函数开始的位置调用了NVIC_SetVectorTable函数,但是结果显示没设置成功或者在后面设么地方被修改了。

IAP用的3.5版本的库、APP用的3.0版本的库,这会不会导致APP程序中调用NVIC_SetVectorTable函数未能生效? 不过我对比了两个版本库文件中的NVIC_SetVectorTable函数实现是完全一样的。
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2012-10-13
在线时间
0 小时
 楼主| 发表于 2012-10-15 19:42:43 | 显示全部楼层
回复【10楼】hehe168:

---------------------------------
问题解决了,在串口初始化部分重新调用了NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);,导致前面设置的向量偏移量被更新。

因为串口部分驱动代码由其他人负责,因此没注意到这里的重复设置。

现在回头看,STM32的IAP功能确实很简单。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-10-28
在线时间
0 小时
发表于 2013-10-28 09:54:13 | 显示全部楼层
回复【11楼】hehe168:
---------------------------------
nice
回复 支持 反对

使用道具 举报

10

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2013-12-20
在线时间
94 小时
发表于 2016-1-9 15:25:48 | 显示全部楼层
hehe168 发表于 2012-10-15 19:42
回复【10楼】hehe168:

---------------------------------
问题解决了,在串口初始化部分重新调用了NVIC_S ...

感谢分享,也遇到了类似的问题,帮 了大忙
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2018-4-24
在线时间
61 小时
发表于 2020-3-13 13:22:05 | 显示全部楼层
hehe168 发表于 2012-10-15 19:42
回复【10楼】hehe168:

---------------------------------
问题解决了,在串口初始化部分重新调用了NVIC_S ...

感谢,找到原因了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 10:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表