OpenEdv-开源电子网

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

STM32 启动疑问

[复制链接]

36

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2015-11-24
在线时间
162 小时
发表于 2019-5-9 17:00:53 | 显示全部楼层 |阅读模式
20金钱
看了很多资料,现有疑问如下(假设程序从flash启动):

1、第一条指令到底在什么位置?
  无论是网上的博客还是正点的教程,都是复位后从0x08000000取第一条指令,但是看内核编程手册,MSP和PC都是从0x00000000取指(0x08000000被映射到0x00000000),那么到底从什么地方取指?希望知道的大神给点资料解惑。


2、中断发生后,PC指针指向何处?是0x00000000还是0x08000000?


3、以上两个问题总结起来就是,启动的开始在哪里?

最佳答案

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

首先你要理解映射的概念,当FLASH地址0x08000000映射到0x00000000后,也就是CPU访问0x00000000地址(可以理解为虚拟地址,不一定存在)时,实际上访问的是0x08000000(物理地址)。这部分是由CPU内核完成的,根据配置,当CPU访问0x00000000地址时,经过内部转换,在地址总线上加载的是0x08000000地址, 读取数据指令。从开发者角度,不需要理解CPU内部的操作,只需要知道外部行为,启动后可以理解为从0x08000000地址开始的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2019-5-9 17:00:54 | 显示全部楼层
首先你要理解映射的概念,当FLASH地址0x08000000映射到0x00000000后,也就是CPU访问0x00000000地址(可以理解为虚拟地址,不一定存在)时,实际上访问的是0x08000000(物理地址)。这部分是由CPU内核完成的,根据配置,当CPU访问0x00000000地址时,经过内部转换,在地址总线上加载的是0x08000000地址, 读取数据指令。从开发者角度,不需要理解CPU内部的操作,只需要知道外部行为,启动后可以理解为从0x08000000地址开始的。
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2019-5-9 17:17:05 | 显示全部楼层
本帖最后由 yuzeyuan1 于 2019-5-9 17:20 编辑

首先,代码是从0x08000000开始,如果你需要固件升级,那这里一般会是bootloader程序,程序里面有升级用的东西,比如主程序运行在08010000,那你就在bootloader中读串口数据存到备份区0x0804 0000中,当取完所有数据就把08040000的东西都转存到08010000中,然后从08010000开始运行新程序。如果检查到读到的串口数据失败,就不把08040000转存到08010000,而是直接重新执行原来的程序,也就是0801 0000为起始的程序。

然后,你代码里会定义这个:
#define NVIC_VectTab_RAM             ((uint32_t)0x20000000)
#define NVIC_VectTab_FLASH           ((uint32_t)0x08000000)
如果有bootloader程序,bootloader程序里就如上定义,然后你的主程序里就应该是下面这样,从08010000起始:
#define NVIC_VectTab_RAM             ((uint32_t)0x20000000)
#define NVIC_VectTab_FLASH           ((uint32_t)0x08010000)

最后,要注意在keil的设置->target->IROM1中,要对应地把主程序代码设成0x8010000,后面的size也得相应减小0x10000,比如从0x80000减成0x70000


还有就是
#define NVIC_VectTab_RAM             ((uint32_t)0x20000000)
这里面的地址好像是叫中断向量表的起始地址,如果它定义的和代码里中断向量表实际起始位置不一样,那中断就不好用了。
这条我不确定,有问题请指正。以前看过网上应该是这么说的。

自在随心
回复

使用道具 举报

36

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2015-11-24
在线时间
162 小时
 楼主| 发表于 2019-5-9 17:20:46 | 显示全部楼层
yuzeyuan1 发表于 2019-5-9 17:17
首先,代码是从0x08000000开始,如果你需要固件升级,那这里一般会是bootloader程序,程序里面有升级用的东 ...

答非所问
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2019-5-9 17:24:59 | 显示全部楼层

兄弟我没理解您的意思,我认为复位后起始在08000000,并且说明了如果有bootloader,启动也在08000000,并且由bootloader起行地址跳转,执行你的主程序。
您的问题是?
自在随心
回复

使用道具 举报

36

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2015-11-24
在线时间
162 小时
 楼主| 发表于 2019-5-9 17:37:09 | 显示全部楼层
yuzeyuan1 发表于 2019-5-9 17:24
兄弟我没理解您的意思,我认为复位后起始在08000000,并且说明了如果有bootloader,启动也在08000000,并 ...

我之前也是这样认为,直到我看到了这个


reset.PNG
reset2.PNG
回复

使用道具 举报

36

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2015-11-24
在线时间
162 小时
 楼主| 发表于 2019-5-10 11:24:21 | 显示全部楼层
别沉啊,有大神解疑吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-5-11 01:40:24 | 显示全部楼层
启动后就是从0X0800 0000开始运行的,不过第一个4字节是栈顶地址,第二个4字节,才是复位中断向量的地址。然后执行复位中断服务函数,然后,进入main函数...
回复

使用道具 举报

36

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2015-11-24
在线时间
162 小时
 楼主| 发表于 2019-5-13 08:53:33 | 显示全部楼层
本帖最后由 gangzilife 于 2019-5-13 08:55 编辑
正点原子 发表于 2019-5-11 01:40
启动后就是从0X0800 0000开始运行的,不过第一个4字节是栈顶地址,第二个4字节,才是复位中断向量的地址。 ...

那对于文档上说的从地址0x00000000取msp,在地址0x00000004取pc如何理解?还有就是向量表在复位时固定在0x00000000如何理解?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-5-14 02:12:57 | 显示全部楼层
gangzilife 发表于 2019-5-13 08:53
那对于文档上说的从地址0x00000000取msp,在地址0x00000004取pc如何理解?还有就是向量表在复位时固定在0 ...

你可以理解为MCU内部,0X0000 0000就是0X0800 0000,他们类似于映射,实际上是一个地址来的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 19:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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