OpenEdv-开源电子网

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

关于中断向量表重定义的问题

[复制链接]

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2018-9-27 17:01:28 | 显示全部楼层 |阅读模式
10金钱
参照原子的IAP实验学习IAP升级,过程中遇到一个问题不能理解:1、设置代码写入flash起始地址:0x08019000,大小0x10000,main函数处重定义中断向量表:SCB->VTOR = FLASH_BASE | 0x8019000; option for target中linker勾选如下图,.map文件查看写入flash 0x08019000成功如图所示,但是程序不运行,仿真发现没有进入main函数,即没有跳转到指定地址读取flash中代码。

2、设置代码写入flash起始地址:0x08000000,大小0x10000,main函数处同样重定义中断向量表:SCB->VTOR = FLASH_BASE | 0x8019000,.map文件查看写入:0x08000000成功,根据目前理解程序应该不运行才对,但是却正常运行。

总结:根据这两个现象只能推断SCB->VTOR = FLASH_BASE | 0x8019000;这句代码失效,但是具体原因不明白,如果没解决这个问题IAP就不能成功,有经验的大佬能提供点思路吗?以下为相关图片:

微信图片_20180927164757.png 微信图片_20180927164722.png 微信图片_20180927164820.png

微信图片_20180927164639.png

最佳答案

查看完整内容[请看2#楼]

你没有Bootloader这部分程序,那你直接偏移的话程序肯定跑飞了。你可以看STM32加入IAP之后程序运行流程图。他是从0x08000000 开始运行的。所以你设置0x08000000时才能进入主程序
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-9-27 17:01:29 | 显示全部楼层
你没有Bootloader这部分程序,那你直接偏移的话程序肯定跑飞了。你可以看STM32加入IAP之后程序运行流程图。他是从0x08000000 开始运行的。所以你设置0x08000000时才能进入主程序
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2018-9-27 17:03:19 | 显示全部楼层
补一张图片
微信图片_20180927170244.png
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2018-9-27 17:55:04 | 显示全部楼层
IAP跑马灯.zip (2.57 MB, 下载次数: 35)
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14433
金钱
14433
注册时间
2018-8-3
在线时间
1157 小时
发表于 2018-9-27 20:48:26 | 显示全部楼层
你这芯片是什么,FLASH容量多少,这个设置这块 原子的文档有详细的说明 你每一步先看了先,也有视频教学 建议你先去看下。
啊哈~加油!!
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2018-9-28 08:45:50 | 显示全部楼层
翼行园子 发表于 2018-9-27 20:48
你这芯片是什么,FLASH容量多少,这个设置这块 原子的文档有详细的说明 你每一步先看了先,也有视频教学 建 ...

大容量,STM32F103RET6 64K+512K  视频教程没看,原子的例程看了,谢谢你的建议!
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-9-28 08:52:43 | 显示全部楼层
F1有重映射的函数的 NVIC_SetVectorTable  了解一下
还可以参考一下这个F0的,没有上述函数的情况下的用法 :https://www.cnblogs.com/outs/p/4948134.html
猪猪熊呢?
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2018-9-28 17:26:07 | 显示全部楼层
323232 发表于 2018-9-28 08:52
F1有重映射的函数的 NVIC_SetVectorTable  了解一下
还可以参考一下这个F0的,没有上述函数的情况下的用法 ...

这个函数我也试过,多谢指点!
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-9-28 17:32:27 | 显示全部楼层
陈皮皮 发表于 2018-9-28 17:26
这个函数我也试过,多谢指点!

应该是你target里没设置对吧
猪猪熊呢?
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2018-9-28 17:46:42 | 显示全部楼层
本帖最后由 陈皮皮 于 2018-9-28 17:49 编辑

做了各种测试去解决这个现象也没搞定!
再重新叙述一下吧,大家看看是不是我理解有问题:
设置代码下载flash起始位置,用SCB->VTOR = FLASH_BASE | 0x08007800或者使用NVIC_SetVectorTable(0x8007800,0x10000);
我的理解:设置了代码写入flash位置,然后在程序启动前重新设置中断向量表的偏移地址=>程序正常运行
但是出现的结果是程序跑飞!!但是当我把flash地址改为0x08000000时,中断向量表偏移地址依旧 为0x08007800,按理说=>程序不运行
但是程序正常运行!!

相关图片比较多,打扰了:

芯片型号:F103RET6 64K+512K
微信图片_20180928172935.png

程序存放flash地址
微信图片_20180928172954.png

中断向量表地址偏移重设
微信图片_20180928173039.png

.map文件中可见写入成功

微信图片_20180928173144.png


程序运行跑飞在0xFFFFFFFE

微信图片_20180928173245.png

0x08007800代码数据有
微信图片_20180928173308.png

0x08000000代码数据无
微信图片_20180928173401.png

这么多图片真的是打扰了......

回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2018-9-28 18:00:40 | 显示全部楼层
323232 发表于 2018-9-28 17:32
应该是你target里没设置对吧

应该对的吧,大佬看看楼上我的图片指点一下,我是怀疑自己哪理解错了!!
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-9-29 08:30:10 | 显示全部楼层
NVIC_SetVectorTable这个函数不是说把偏移量放上去,他表述有误吧,第一个参数是中断向量表的地址,第二个参数是要偏移到的地址。比如说中断向量表在0x08000000,想偏移到0x08004000去,就应该这么用:NVIC_SetVectorTable(0x08000000,0x08004000);
猪猪熊呢?
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2018-9-29 09:57:20 | 显示全部楼层
323232 发表于 2018-9-29 08:30
NVIC_SetVectorTable这个函数不是说把偏移量放上去,他表述有误吧,第一个参数是中断向量表的地址,第二个 ...

是的,这个函数我使用有误,但是出现这个情况的原因还是没找到!中断向量表偏移重设始终未成功!
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2018-9-30 09:19:09 | 显示全部楼层
这个帖子怕是凉凉了,等我解决了会吧答案写在这!多些各位指点的大侠
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-9-30 10:22:13 | 显示全部楼层
IAP 的Bootloader 你是怎么设置的??
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2018-9-30 10:55:57 | 显示全部楼层
douxiaolingyun 发表于 2018-9-30 10:22
IAP 的Bootloader 你是怎么设置的??

现在遇到的问题都没有用到Bootloader程序,直接是在app程序中存在的不理解问题。我是直接在APP中把程序写到指定Flash,然后重新设置中断向量表地址,按道理是可以运行程序的,但是不运行!
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-9-30 11:17:34 | 显示全部楼层
没有第一部分的Bootloader啊?那怎么能够运行第二部分的APP???
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2018-9-30 11:31:34 | 显示全部楼层
douxiaolingyun 发表于 2018-9-30 11:21
你没有Bootloader这部分程序,那你直接偏移的话程序肯定跑飞了。你可以看STM32加入IAP之后程序运行流程图。 ...

你的意思是APP使用地址偏移之后只能通过Bootloader来读取运行?我理解的是APP程序直接更改中断向量地址后就可以运行!应该是我这里理解错了,再测试一下,谢谢你的提醒!!
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2018-10-8 14:44:57 | 显示全部楼层
休整了一个小长假,再回来看代码,梳理逻辑后经过半天的调试分析,找到了问题所在。
做IAP升级一定要注意在跳转前关闭中断,防止在APP中程序跑飞进入HardFault_Handler();
参照帖子:http://www.stmcu.org.cn/module/forum/thread-612166-1-1.html
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 14:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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