OpenEdv-开源电子网

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

请教各位大佬,stm32F1 SCB->VTOR开机默认是0,请问这个怎么理解?

[复制链接]

8

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
789
金钱
789
注册时间
2019-8-15
在线时间
423 小时
发表于 2020-12-20 10:02:57 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 鲸鱼niko 于 2020-12-20 10:31 编辑

1.使用stm32cubemx生成新的f1工程,SystemInit函数中默认没有设置SCB->VTOR,则SCB->VTOR默认为0,程序正常运行。
2.在设计IAP的时候,为社么在app程序中需要设置SCB->VTOR,而bootloader中不需要?
3.程序的SCB->VTOR = 0x0800 0000 | offset;
4.那么对于bootloader来说,只是offset = 0而已,为什么连0x0800 0000都可以不设了呢?
5.想请教各位大佬,这个应该怎么理解?

DVW`0V3L`R[Z_@XAER`M)LF.png

最佳答案

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

ARM Cortex-M3内核永远从0x00000000启动,STM32在这里取了个巧,它在0x00000000开始的一段地址空间是虚拟的,可以通过设置BOOT[1:0]管脚状态,在启动时动态将另外一段地址空间映射到这部分上面去。 当arm复位之后,读到的0x00000000内容已经是被STM32重映射之后的了,所以它可以system boot模式启动、还是Flash启动、还是内存启动。 如果是正常的Flash启动,则会将0x08000000映射到0x00000000,因此arm以为自己还在操作0x0000000 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2020-12-20 10:02:58 | 显示全部楼层
ARM Cortex-M3内核永远从0x00000000启动,STM32在这里取了个巧,它在0x00000000开始的一段地址空间是虚拟的,可以通过设置BOOT[1:0]管脚状态,在启动时动态将另外一段地址空间映射到这部分上面去。
当arm复位之后,读到的0x00000000内容已经是被STM32重映射之后的了,所以它可以system boot模式启动、还是Flash启动、还是内存启动。
如果是正常的Flash启动,则会将0x08000000映射到0x00000000,因此arm以为自己还在操作0x00000000,其实是在操作0x08000000,已经被STM32偷梁换柱了,当然,此时直接操作0x08000000也是可以的,二者完全等价。

因此,SCB->VTOR保持为0x00000000完全没有任何问题。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

8

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
789
金钱
789
注册时间
2019-8-15
在线时间
423 小时
 楼主| 发表于 2020-12-20 10:16:08 | 显示全部楼层
本帖最后由 鲸鱼niko 于 2020-12-20 10:33 编辑

请各位大佬帮帮我
回复

使用道具 举报

8

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
789
金钱
789
注册时间
2019-8-15
在线时间
423 小时
 楼主| 发表于 2020-12-21 11:11:38 | 显示全部楼层
大佬们,拜托
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2020-12-21 11:27:15 | 显示全部楼层
本帖最后由 ricefat 于 2020-12-21 11:31 编辑

如果没有定义,只是没有编译那句,但不代表VECT_TAB_BASE_ADDRESS没有值,这个常量在别的文件已经有了定义。
而且最新版本的cubemx生成的工程有了这句。
QQ截图20201221112447.png
回复

使用道具 举报

8

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
789
金钱
789
注册时间
2019-8-15
在线时间
423 小时
 楼主| 发表于 2020-12-21 14:37:19 | 显示全部楼层
ricefat 发表于 2020-12-21 11:27
如果没有定义,只是没有编译那句,但不代表VECT_TAB_BASE_ADDRESS没有值,这个常量在别的文件已经有了定义 ...

片机是f103rc,cubemx版本是6.1.1,cubemx中f1的库版本是1.8.3,生成出来确实是没有。通过仿真器下载仿真,并且将SCB添加到watch中进行观察,SCB->VTOR始终是0。但是程序是正常运行,中断也是正常进入。(补充一点,f103c8生成出来是有的SCB->VTOR=0x08000000)
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2020-12-21 16:06:32 | 显示全部楼层
本帖最后由 ricefat 于 2020-12-21 16:10 编辑

这个向量表偏移量配置应该是进入调试之前就完成了,所以调试开始以后中间不会有变化。system_init的函数在启动文件s中已经执行过了后才会进入main函数。而且这段代码只是提供一个可以修改vector的接口,并不是单片机初始化过程本身。
回复

使用道具 举报

8

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
789
金钱
789
注册时间
2019-8-15
在线时间
423 小时
 楼主| 发表于 2020-12-22 09:46:40 | 显示全部楼层
xkwy 发表于 2020-12-21 18:44
ARM Cortex-M3内核永远从0x00000000启动,STM32在这里取了个巧,它在0x00000000开始的一段地址空间是虚拟的 ...

感谢大佬
回复

使用道具 举报

8

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
789
金钱
789
注册时间
2019-8-15
在线时间
423 小时
 楼主| 发表于 2020-12-22 09:47:03 | 显示全部楼层
ricefat 发表于 2020-12-21 16:06
这个向量表偏移量配置应该是进入调试之前就完成了,所以调试开始以后中间不会有变化。system_init的函数在 ...

感谢大佬
回复

使用道具 举报

7

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2017-6-14
在线时间
44 小时
发表于 2022-9-29 17:45:22 | 显示全部楼层
请教个问题,SCB->VTOR这个register中的位15bit(ENDIANESS)不是只读吗?怎么写然后设置向量表偏移的
回复

使用道具 举报

8

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
789
金钱
789
注册时间
2019-8-15
在线时间
423 小时
 楼主| 发表于 2022-9-30 09:47:18 | 显示全部楼层
多吃蔬菜少吃肉 发表于 2022-9-29 17:45
请教个问题,SCB->VTOR这个register中的位15bit(ENDIANESS)不是只读吗?怎么写然后设置向量表偏移的

没看到哪里描述了位15bit是只读的啊?能不能贴个图,或者指明哪个手册描述的?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 01:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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