OpenEdv-开源电子网

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

stm32 中断向量表偏移+启动过程

[复制链接]

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
发表于 2015-9-7 11:09:34 | 显示全部楼层 |阅读模式
5金钱
关于启动模式和启动文件的资料在网上很多,不在赘述。
假设配置BOOT[0,1]在sram中启动,并把程序代码烧录在0x2000 0000处。那代码的中断向量表就定位在了0x2000 0004处。芯片上电后,会自动从0x2000 0004处取resethandle()的入口地址并执行,然后紧接着就是systeminit()、__main()、main()。并且在systeminit()或main()中配置中断向量表偏移量。这样程序就能正常运行了。
我的疑问是:
1.中断响应时,硬件固定的在0x0000 0004处寻找对应的入口地址吗(就是说芯片认为“中断向量表固定在了0x0000 0004处”)?这么理解对吗?
2.如果我对1理解的对的话,那在“pc从0x2000 0004处取resethandle()的入口地址”到配置偏移量“这个过程中,将不会发生任何中断(包括内部系统异常中断和IRQ)?【我之所以这么问是因为我觉得在这个过程中位于0x2000 0004处的”真实的“中断向量表还没有映射到0x0000 0004处(即0x0000 0004处的中断向量表是空的),如果发生了中断响应,那是不可能从0x0000 0004处获得对应的中断入口地址的。】
3.延伸一下,如果把程序代码烧录在main flash(但不是0x0800 0000) 或SRAM(但不是0x2000 0000),那程序代码就不能启动?【仅仅考虑只在芯片中烧录一个程序代码的情况,因为我知道还有个IAP功能的APP代码可以烧录在main flash 或SRAM的任何位置,通过bootloader来定位APP的位置】

最佳答案

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

1,在0X2000 0004才对,在RAM运行代码的时候。 2,是的,不会响应。因为这个时候,严格的说,MCU还没完全运行起来。 3,不能直接启动,但是通过IAP,可以,参见:我们的 IAP实验。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-7 11:09:35 | 显示全部楼层
1,在0X2000 0004才对,在RAM运行代码的时候。
2,是的,不会响应。因为这个时候,严格的说,MCU还没完全运行起来。
3,不能直接启动,但是通过IAP,可以,参见:我们的 IAP实验。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
 楼主| 发表于 2015-9-7 12:42:25 | 显示全部楼层
自己先顶一下!有求必应的论坛,我需要机枪的扫射!谢谢
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
 楼主| 发表于 2015-9-7 22:10:29 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
感谢原子的回答。您对问题1的回答,我还是有些疑问。请示意a。
如果配置BOOT[0,1]从SRAM中启动,硬件将pc定位到0x2000 0004处。在配置偏移量之前,硬件认为中断向量表位于0x0000 0004处,在配置中断向量表之后,硬件就认为中断向量表由0x0000 0004处移动到了0x2000 0004处了,此时与程序代码中真实的中断向量表位置就吻合了。基于此,在代码执行过程若是响应中断的话,就从0x2000 0004处的中断向量表取对应入口地址。您对问题1的回答是这个意思吗?
1.如果是的话,那在IAP章节的示意图(APP在Flash中运行)中,为什么说APP期间发生中断时从0x0000 0004处(而不是APP代码烧录的地址处)的中断向量表取对应中断函数的入口地址呢?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-7 22:18:14 | 显示全部楼层
回复【4楼】roarghy:
---------------------------------
如果你这么配置(BOOT[0,1]),直接就无法运行代码了。。。。
你可以自己试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-6-25
在线时间
11 小时
发表于 2018-9-19 20:15:46 | 显示全部楼层
正点原子 发表于 2015-9-7 22:18
回复【4楼】roarghy:
---------------------------------
如果你这么配置(BOOT[0,1]),直接就无法运行代 ...

这个问题我也注意到了     原子哥请详细解释一下  
配置BOOT从SRAM中启动为什么代码不能启动   
这个不能启动的代码是什么代码  是BootLoader代码还是APP代码?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 01:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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