关于stm32(cotex-m3)向量表初始化的总结笔记(含一个未解决问题)
2013-12-26 19:19
435 查看
最近学习lm3s811的时候,看到启动代码发现跟STM32的启动代码有不少区别,然后就开始详细的看启动代码,最后总结出如下几个点,其实并没有本质 上的区别,由于用lm3s811是为了最近的比赛,所以快速的用库进行了开发,就没有对具体TI公司怎么来设计进行细看,所以就以STM32来说。
1,首先STM32启动代码里面AREA RESET,
DATA, READONLY ;由于是Readonly,所以其实是放到了CODE区
__Vectors应该就是0了,因为编译器本身分配是从头开始的。
2,而软件仿真时添加__Vectors到Watch1里面观察是x20000688,但是由于其不是变量,所以数值是不可预测的,这里应该是涉及到编译器与仿真器之间的关联了,(问题)以后再研究为啥会是这个数(实际上是从头开始的地址)。
3,软件仿真时发现system_stm32f10x.c这个文件中SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;(其中FLASH_BASE的值为0x08000000,VECT_TAB_OFFSET为0x0)这么 一句话让VTO寄存器变成了0x08000000,所以其第28:7位的TBLOFF应该是0x100000,第29位TBLBASE为0,意思是向量表
被重定位到VT0寄存器的值即0x08000000,即STM32F10X系列(其他系列不知道,应该是ARM规定的类似的内存映射)中FLASH起始位 置。另外这里第29位TBLBASE为1的话,整个VTO变成了0x28000000即RAM的起始位置。
而ST公司重定位向量表的库函数:
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)
{
assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
assert_param(IS_NVIC_OFFSET(Offset));
SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
}
其中NVIC_VectTab要么是FLASH要么是RAM的起始位置,Offset: Vector Table base offset field. This value must be a multiple of 0x200,这里先是IS_NVIC_OFFSET(OFFSET) ((OFFSET) < 0x000FFFFF)断言机制,ST公司技术支持给我的回信是这么说的“The
max flash size is 1MB, that is 0x100000, so the vector table must be placed within this address range, so ((OFFSET) < 0x000FFFFF) is checked.”f10x 内置flash最大也就512K,SRAM内置是64k,并没有看到官方人员说的1MB,我想这些断言机制恐怕也是为了给很多芯片共同使用而写的,也就是说实际还是要自己小心着用啊~
然后(Offset & (uint32_t)0x1FFFFF80)事实上就是取了Offset的[28:7]位。但是你还是需要人为让其为0x200的倍数,至于为什么,
在ARM官方给出的Cortex-m3 technial reference manul中是这么说的:
The Vector Table Offset Register positions the vector table in CODE or SRAM space.
The default, on reset, is 0 (CODE space). When setting a position, the offset must be
aligned based on the number of exceptions in the table. This means that the minimal
alignment is 32 words that you can use for up to 16 interrupts. For more interrupts, you
must adjust the alignment by rounding up to the next power of two. For example, if you
require 21 interrupts, the alignment must be on a 64-word boundary because table size
is 37 words, next power of two is 64.
所以由于人家规定要对齐向量表,由于stm32的中断向量一共有68+16=84个,应该把这个数增加到下一个2的整数倍即128,然后换算成地址范围128*4=512,就得到了0x200。
IS_NVIC_OFFSET(Offset)
另外看到一个网友“京剧娃娃”这一句话我觉得很不错:
“学STM32的过程中觉得看手册一点很重要,就是区分各个官方手册的等级:
"ARMv7-M Architecture Application Level Reference Manual(November 2010)" (ARM官方发布) 这是理论框架,涵盖范围最广..........(I)
"Cortex-M3 Technical Reference Manual.r2p1" (ARM官方发布) 这是技术构架,涵盖范围次之.........................................................(II)
"PM0056 Programming manual Rev4" & "Reference manual_Rev13"(ST官方发布)这是产品实现,范围最小,定位到特定系列产品.....(III) ”
1,首先STM32启动代码里面AREA RESET,
DATA, READONLY ;由于是Readonly,所以其实是放到了CODE区
__Vectors应该就是0了,因为编译器本身分配是从头开始的。
2,而软件仿真时添加__Vectors到Watch1里面观察是x20000688,但是由于其不是变量,所以数值是不可预测的,这里应该是涉及到编译器与仿真器之间的关联了,(问题)以后再研究为啥会是这个数(实际上是从头开始的地址)。
3,软件仿真时发现system_stm32f10x.c这个文件中SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;(其中FLASH_BASE的值为0x08000000,VECT_TAB_OFFSET为0x0)这么 一句话让VTO寄存器变成了0x08000000,所以其第28:7位的TBLOFF应该是0x100000,第29位TBLBASE为0,意思是向量表
被重定位到VT0寄存器的值即0x08000000,即STM32F10X系列(其他系列不知道,应该是ARM规定的类似的内存映射)中FLASH起始位 置。另外这里第29位TBLBASE为1的话,整个VTO变成了0x28000000即RAM的起始位置。
而ST公司重定位向量表的库函数:
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)
{
assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
assert_param(IS_NVIC_OFFSET(Offset));
SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
}
其中NVIC_VectTab要么是FLASH要么是RAM的起始位置,Offset: Vector Table base offset field. This value must be a multiple of 0x200,这里先是IS_NVIC_OFFSET(OFFSET) ((OFFSET) < 0x000FFFFF)断言机制,ST公司技术支持给我的回信是这么说的“The
max flash size is 1MB, that is 0x100000, so the vector table must be placed within this address range, so ((OFFSET) < 0x000FFFFF) is checked.”f10x 内置flash最大也就512K,SRAM内置是64k,并没有看到官方人员说的1MB,我想这些断言机制恐怕也是为了给很多芯片共同使用而写的,也就是说实际还是要自己小心着用啊~
然后(Offset & (uint32_t)0x1FFFFF80)事实上就是取了Offset的[28:7]位。但是你还是需要人为让其为0x200的倍数,至于为什么,
在ARM官方给出的Cortex-m3 technial reference manul中是这么说的:
The Vector Table Offset Register positions the vector table in CODE or SRAM space.
The default, on reset, is 0 (CODE space). When setting a position, the offset must be
aligned based on the number of exceptions in the table. This means that the minimal
alignment is 32 words that you can use for up to 16 interrupts. For more interrupts, you
must adjust the alignment by rounding up to the next power of two. For example, if you
require 21 interrupts, the alignment must be on a 64-word boundary because table size
is 37 words, next power of two is 64.
所以由于人家规定要对齐向量表,由于stm32的中断向量一共有68+16=84个,应该把这个数增加到下一个2的整数倍即128,然后换算成地址范围128*4=512,就得到了0x200。
IS_NVIC_OFFSET(Offset)
另外看到一个网友“京剧娃娃”这一句话我觉得很不错:
“学STM32的过程中觉得看手册一点很重要,就是区分各个官方手册的等级:
"ARMv7-M Architecture Application Level Reference Manual(November 2010)" (ARM官方发布) 这是理论框架,涵盖范围最广..........(I)
"Cortex-M3 Technical Reference Manual.r2p1" (ARM官方发布) 这是技术构架,涵盖范围次之.........................................................(II)
"PM0056 Programming manual Rev4" & "Reference manual_Rev13"(ST官方发布)这是产品实现,范围最小,定位到特定系列产品.....(III) ”
相关文章推荐
- 有一个关于collectiview的问题,弄了很久自己也没有解决
- 关于WebBrowser控制新窗口[_blanck]问题解决总结
- [问题解决]一个关于图片的问题,在android studio上的
- struts2有关通配符的总结,一个小万能的公式解决大问题
- 关于在myeclipse中用jsp访问实体bean的一个问题的解决(Exception sending context initialized event to listener instance of class)
- 一个关于MFMessageComposeViewController的ios7中的诡异问题 收件人视图黑色 和解决方式
- 【阅读笔记】关于Direct3D初始化的一个完整工程及介绍
- 解决一个mysql关于按文章以及评论的最早时间的排序问题
- 关于修复VS2008提示加载安装组件出现问题和点击VS的设计窗口出现一个WINDOW installer的提示的问题的解决办法
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- 关于String s1 = new String("abc") 创建一个对象问题和Java常量池总结
- 关于指针问题的一个笔记加牢骚
- 一个关于时间的故事(通过历史分析解决程序问题)
- Xcode学习笔记中关于如何定义宏问题解决
- 关于各大浏览器的兼容问题解决方案(总结)
- 【Div+Css笔记】 0x06 Div+Css入门总结[待解决问题]
- JDCB学习笔记 -- day05 实现一个用户的登录功能及解决SQL注入问题
- javaEE异常总结——更换工作空间向同一个tomcat上部署同一个项目时出现问题解决
- 关于解决mysql和jsp乱码问题的总结
- 请帮我解决一个关于AUTOCAD的问题,谢谢!