打印
[STM32F1]

STM32复位后,如何知道中断向量表位置的

[复制链接]
9501|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eng588|  楼主 | 2018-7-19 10:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32复位后,其PC指针应该是个定值,然而我们却可以把中断向量表放在任何位置。
比如若设定位flash启动,我们可以把向量表放在0x08000000处,也可以放在0x8000800处,还可以放在flash的任何位置上。那么问题来了,复位后程序还没运行,其PC指针是怎么自动指到向量表的?
沙发
八层楼| | 2018-7-19 11:08 | 只看该作者
是否是有默认配置呢

使用特权

评论回复
板凳
eng588|  楼主 | 2018-7-19 11:10 | 只看该作者
八层楼 发表于 2018-7-19 11:08
是否是有默认配置呢

问题是中断向量表位置可以利用ICF文件放到任意位置啊,怎么默认?

使用特权

评论回复
地板
观海| | 2018-7-19 11:20 | 只看该作者
对入门者,不建议改

使用特权

评论回复
5
观海| | 2018-7-19 11:20 | 只看该作者
stm32复位PC指针指向0x00000000,但这个区域能映射别的区域(bootload,ram或flash取决于boot设置,以下设置flash(0x80000000)),
在0x80000000的字区设置SP的值,后一个字区设置复位中断的地址,程序自动读取这两个数值,跳到复位中断后设置一些堆栈的初始化以及设置中断向量表起始地址和偏移地址(就是开头地址),中断向量表不是固定的存在,是人为设置的一系列跳转地址,但是顺序是固定的,具体由数据手册而定,而中断发生后程序是如何定位到中断向量表的地址,我猜是不是发生相应中断是程序能知道对应中断的偏移地址,然后加上认为设置好的基址找到对应的中断向量入口地址。

使用特权

评论回复
6
ayb_ice| | 2018-7-19 11:34 | 只看该作者
复位后有个默认位置,然后程序可以重新映射中断向量

使用特权

评论回复
7
eng588|  楼主 | 2018-7-19 11:36 | 只看该作者
观海 发表于 2018-7-19 11:20
stm32复位PC指针指向0x00000000,但这个区域能映射别的区域(bootload,ram或flash取决于boot设置,以下设 ...

你没理解意思,中断向量表可以放在flash的任何位置,不是一定要在0x08000000处

使用特权

评论回复
8
磨砂| | 2018-7-19 11:36 | 只看该作者
STM32的内部闪存(FLASH)地址起始于0x08000000,一般情况下,程序文件就从此地址开始写入。此外STM32是基于Cortex-M3内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张“中断向量表”的起始地址是0x08000004,当中断来临,STM32的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。

使用特权

评论回复
9
eng588|  楼主 | 2018-7-19 11:49 | 只看该作者
ayb_ice 发表于 2018-7-19 11:34
复位后有个默认位置,然后程序可以重新映射中断向量

复位后,PC必须指向向量表位置,否则没法运行。

使用特权

评论回复
10
eng588|  楼主 | 2018-7-19 11:52 | 只看该作者
磨砂 发表于 2018-7-19 11:36
STM32的内部闪存(FLASH)地址起始于0x08000000,一般情况下,程序文件就从此地址开始写入。此外STM32是基 ...

我们可以把向量表放在0x08000000处,也可以放在0x8000800处,还可以放在flash的任何位置上。

使用特权

评论回复
11
eng588|  楼主 | 2018-7-19 11:55 | 只看该作者
请香水城[color=Red]

使用特权

评论回复
12
ayb_ice| | 2018-7-19 13:02 | 只看该作者
eng588 发表于 2018-7-19 11:49
复位后,PC必须指向向量表位置,否则没法运行。

没错啊,但程序可以重新映射向量表的位置,有寄存器可以修改

使用特权

评论回复
13
eng588|  楼主 | 2018-7-19 13:04 | 只看该作者
ayb_ice 发表于 2018-7-19 13:02
没错啊,但程序可以重新映射向量表的位置,有寄存器可以修改

PC是怎么知道向量表在哪的?

使用特权

评论回复
14
ayb_ice| | 2018-7-19 13:07 | 只看该作者
eng588 发表于 2018-7-19 13:04
PC是怎么知道向量表在哪的?

都说了有寄存器控制这些,其实就是偏移值而已(复位后偏移是0),这是芯片设计者的事情,搞BOOT一般需要改变这些
当然不是所有芯片都有这些功能,32位机一般有的

使用特权

评论回复
15
eng588|  楼主 | 2018-7-19 13:40 | 只看该作者
ayb_ice 发表于 2018-7-19 13:07
都说了有寄存器控制这些,其实就是偏移值而已(复位后偏移是0),这是芯片设计者的事情,搞BOOT一般需要改 ...

复位之后,程序还没跑,寄存器值从何而来

使用特权

评论回复
16
ayb_ice| | 2018-7-19 13:44 | 只看该作者
eng588 发表于 2018-7-19 13:40
复位之后,程序还没跑,寄存器值从何而来

自己去看手册吧,我水平有限,无法说清楚

使用特权

评论回复
17
一周一天班| | 2018-7-20 10:24 | 只看该作者
需要寄存器修改情况,一般是有用户自己的boot程序。向量是编译程序已经定死了地址,含用户boot情况下,boit占用0,用户只能用后面。启动时不受用户程序自己控制,用户启动第一件事情就是修改寄存器和用户程序自己的匹配。这时没中断产生。有关联的只有复位起点,boot帮你完成。

使用特权

评论回复
18
磨砂| | 2018-7-20 13:11 | 只看该作者
eng588 发表于 2018-7-19 11:52
我们可以把向量表放在0x08000000处,也可以放在0x8000800处,还可以放在flash的任何位置上。 ...

请问这个是如何设置的呢

使用特权

评论回复
19
八层楼| | 2018-7-20 13:18 | 只看该作者
eng588 发表于 2018-7-19 11:10
问题是中断向量表位置可以利用ICF文件放到任意位置啊,怎么默认?

不对他操作的时候会自动生成一个icf文件啊

使用特权

评论回复
20
MCU单片机STM| | 2018-7-21 00:56 | 只看该作者
学习了

使用特权

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

本版积分规则

82

主题

179

帖子

0

粉丝