打印
[STM32F3]

ARM cortex-M3权威指南书中的疑问

[复制链接]
2386|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在看到权威指南中的异常时,书中写了向量表默认地址是从0x0000_0000开始的,但是看到下面这段话后觉得难以理解。本人正在学习STM32F103系列MCU。望高手给予解答。


沙发
icecut| | 2014-5-20 20:14 | 只看该作者
本帖最后由 icecut 于 2014-5-20 20:19 编辑

你就按照说的去做...我现在不知道你不懂什么?难以理解就认为是规定,因为硬件和软件用的不同设计语言,出现特殊的要求很正常.

使用特权

评论回复
板凳
dirtwillfly| | 2014-5-21 08:39 | 只看该作者
楼主应该说说那一部分不理解,或者你是怎么理解的

使用特权

评论回复
地板
爱炫小王子|  楼主 | 2014-5-21 09:35 | 只看该作者
dirtwillfly 发表于 2014-5-21 08:39
楼主应该说说那一部分不理解,或者你是怎么理解的

STM32中有三种启动模式,从flash启动是从地址0X8000_0000处开始执行代码的,而0x8000_0000地址是映射到0x0000_0000的,因为CM3是从0x0000_0000执行的,CM3不知道实际代码是从flash启动的。权威指南中说了,向量表默认在0x0000_0000处(flash中0x8000_0000处),但是下面紧跟着又说了地址0处应该存储引导代码。这样我就有了疑惑了。这是官方原文。

使用特权

评论回复
5
想做大牛的小马| | 2014-5-21 23:30 | 只看该作者
看英文原版是正道啊个人觉得,呵呵~这个架构的我也刚接触,你看看这样理解如何:一上电,core总会去0地址去中断向量表(其实是4上电复位),然后执行那个函数把core带起来~而0地址其实是被flash或sysmem或sram空间映射的,不是个实在的东东!~希望对你理解有帮助~

使用特权

评论回复
6
爱炫小王子|  楼主 | 2014-5-22 18:37 | 只看该作者
有理,确实不存在0地址。STM32也说了,从0访问的是flash区(从flash启动)。不过还是有点牵强

使用特权

评论回复
7
爱炫小王子|  楼主 | 2014-5-22 18:39 | 只看该作者
想做大牛的小马 发表于 2014-5-21 23:30
看英文原版是正道啊个人觉得,呵呵~这个架构的我也刚接触,你看看这样理解如何:一上电,core总会去0地址去 ...

可能写写汇编就知道怎么回事了

使用特权

评论回复
8
icecut| | 2014-5-23 09:28 | 只看该作者
爱炫小王子 发表于 2014-5-22 18:37
有理,确实不存在0地址。STM32也说了,从0访问的是flash区(从flash启动)。不过还是有点牵强 ...

0地址就是flash的地址.那上电就从flash启动.
有些芯片是通过地址重映射的方式吧0地址映射到ram.
但是看起来,m3有新的办法直接把中断地址映射到ram,就是配置这个vector table寄存器.

使用特权

评论回复
9
想做大牛的小马| | 2014-5-23 10:53 | 只看该作者
不同架构的cpu有不同的启动逻辑,有的从低地址,有的从高地址,有的可以设定!
无论如何,启动嘛,肯定是去执行相应的函数!对于arm-cortex而言,从低地址启动是不可更改的!但是用户可以配置将flash或sram或sysram的空间映射到0地址,然后启动啦~映射,要理解这个概念先哈!

使用特权

评论回复
10
香水城| | 2014-5-23 13:05 | 只看该作者
就是说:Cortex-M3内核上电后总是去逻辑地址4的地方取复位向量的地址。

而对于STM32的实现来说,它在0x0800 0000的地方实现了物理的用户flash,在0x2000 0000的地方实现了物理SRAM。

上电时,根据BOOT引脚的电平,会把SRAM或用户Flash或系统Flash(就是出厂前放置bootloader的地方)映射到逻辑0地址。也就是所谓的从SRAM Flash 和bootloader启动。

运行起来之后,vector table的地址可以动态地通过VTOR这个内核寄存器来修改。就是说,程序里可以有多个中断向量表(比如bootloader有自己的一套ISR,升级后的应用程序也有自己的一套ISR)。那么任意时候,究竟哪个中断向量表起作用,即发送中断时内核去哪里获取中断入口地址,则是看这个VTOR指向的地方了。

使用特权

评论回复
11
爱炫小王子|  楼主 | 2014-6-4 08:53 | 只看该作者
香水城 发表于 2014-5-23 13:05
就是说:Cortex-M3内核上电后总是去逻辑地址4的地方取复位向量的地址。

而对于STM32的实现来说,它在0x080 ...

是的,明白了。cm3默认的从地址0处是中断向量表。而权威指南中说since the address 0x0 should be boot code是说Cm3设计师认为微控制器设计者(STM32)在0地址到以后的一段地址中放的是启动代码,就是所谓的bootloader。若STM32从系统存储区启动的话,那么中断向量表就会在系统存储区了,此时就要用中断向量偏移寄存器使得向量表重定位。这样才能执行用户的中断程序。而在flash启动就不需要重定位了,因为flash启动,直接映射到地址0,执行的就是用户代码。
感谢香水城的回答。不知上述理解是否正确 。

使用特权

评论回复
12
香水城| | 2014-6-4 09:44 | 只看该作者
爱炫小王子 发表于 2014-6-4 08:53
是的,明白了。cm3默认的从地址0处是中断向量表。而权威指南中说since the address 0x0 should be boot c ...

理解不准确。

【若STM32从系统存储区启动的话】,一般通过设置BOOT引脚电平来实现。一旦设置好后,位于系统存储区0x1fff,xxxx的地址的内容就映射到地址0x0000 0000了。因此上电后,内核还是从逻辑地址0那里去取复位ISR的地址,也就是执行的是系统存储区里的复位向量。

【而在flash启动】也是一样,BOOT引脚电平设置好后,位于Flash的0x0800 0000开始的内容就映射到地址0x0000 0000了。上电后,内核从逻辑地址0那里去取复位ISR地址,就是执行Flash低端地址处的复位向量。

使用特权

评论回复
13
爱炫小王子|  楼主 | 2014-6-4 10:13 | 只看该作者
香水城 发表于 2014-6-4 09:44
理解不准确。

【若STM32从系统存储区启动的话】,一般通过设置BOOT引脚电平来实现。一旦设置好后,位于 ...

恩恩,是的,boot启动原理是知道的。向量表与传统的向量入口地址不一样,以前在执行代码之前一定是jump跳过中断入口地址的,而在cm3中,这个向量表的灵活性既是优点,也难免带来学习的难度。
还是感谢你的回答,非常到位!

使用特权

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

本版积分规则

22

主题

110

帖子

0

粉丝