OpenEdv-开源电子网

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

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

[复制链接]

6

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-5-20
在线时间
2 小时
发表于 2014-5-20 16:54:55 | 显示全部楼层 |阅读模式
5金钱
在看到权威指南中的异常时,书中写了向量表默认地址是从0x0000_0000开始的,但是看到下面这段话后觉得难以理解。本人正在学习STM32F103系列MCU。望高手给予解答。


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-20 23:15:41 | 显示全部楼层
这段话内容很多,具体点.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-5-20
在线时间
2 小时
 楼主| 发表于 2014-5-21 09:34:37 | 显示全部楼层
STM32中有三种启动模式,从flash启动是从地址0X8000_0000处开始执行代码的,而0x8000_0000地址是映射到0x0000_0000的,因为CM3是从0x0000_0000执行的,CM3不知道实际代码是从flash启动的。权威指南中说了,向量表默认在0x0000_0000处(flash中0x8000_0000处),但是下面紧跟着又说了地址0处应该存储引导代码。这样我就有了疑惑了。这是官方原文,还请原子哥能够解答下。

回复

使用道具 举报

0

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-5-21 10:21:26 | 显示全部楼层
楼猪不明白的地方应该是在向量表的重映射,我简单说一下我的理解:
首先三种启动方式:
1、SRAM启动,中断向量表定位于SRAM区,起始地址为0x20000000,复位后PC指针位于0x20000000处;
2、FLASH启动,也称用户闪存启动,中断向量表定位于FLASH区,起始地址为0x08000000,复位后PC指针位于0x08000000处;
3、系统存储器启动,也称bootloader启动,中断向量表定位于bootloader区,起始地址可设置,复位后PC指针位于起始地址处;
 默认情况下,0x0000_0000处存放着中断向量表,即0x0000_0000处存放MSP,0x0000_0004存放中断复位向量,0x0000_0008处存放不可屏蔽中断(NMI),0x0000_000C处存放硬件错误中断,然后接着每4个字节存放一个中断(后面的多是用户的外设中断,且默认越往后优先级越低)。
NVIC中有个寄存器可以设置向量表的重映射和偏移地址,可以通过宏灵活设置,代码如下:
#ifdef VECT_TAB_RAM
   NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);  //SRAM启动
  #else
  NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);  //FLASH启动
  #endif
如果设置了向量表存放在FLASH或者SRAM中,那么楼猪无需关心0x0000_0000处到底放着什么东东,根据CORTEX-M3的特性,他上电后根据boot引脚来决定PC位置,比如boot设置为flash启动,则启动后PC跳到0x08000000。此时CPU会先取2个地址,第一个是栈顶地址,第二个是复位异常地址,这样就跳到reset_handler。至于系统什么时候通过什么方式把中断向量表搬到0x08000000,权威指南第11章有专门讲动态设置中断向量表偏移的代码,楼猪学有余力的情况下可以了解一下。
回复

使用道具 举报

0

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-5-21 10:32:31 | 显示全部楼层


楼猪仔细对照一下上面两幅图,看看能发现什么?
简而言之:向量表默认存在于绝对地址的0x00000000处,但是系统根据boot引脚状态在启动过程中把中断向量表从0x00000000处拷贝到0x08000000处,然后复位后直接从0x08000000处取堆栈指针然后跳转到0x08000004处。

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 20:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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