STM32向量表详细分析

2019-07-24 12:49发布

STM32向量表详细分析
预备知识:DCD指令:用于分配一片连续的字存储单元(32bit),并将表达式的值初始化给该字存储单元,类似于C中定义数组并初始化。比如: DCD 0 的意思是:分配一个字存储单元,并将该单元初始化为0。分析:在STM32的启动文件中可以看到有如下代码:    EXPORT __Vectors__Vectors    DCD __initial_sp ; Top of Stack    DCD Reset_Handler    DCD NMIException    DCD HardFaultException    DCD MemManageException    DCD BusFaultException    DCD UsageFaultException    DCD 0 ; Reserved    DCD 0 ; Reserved    DCD 0 ; Reserved    DCD 0 ; Reserved    DCD SVCHandler    DCD DebugMonitor    DCD 0 ; Reserved    DCD OSPendSV……这一段是分配STM32的中断向量表。从DCD后面表达式的名称可以看出第一个字存储单元分配给了栈顶,其值为__initial_sp。第二个字分配给了复位地址,其值为Reset_Handler,后面接着分配给其他异常或中断。这里的Reset_Handler,NMIException等,其实是一个地址值,也就是中断处理函数的入口地址。在函数实现时,由编译器分配一个地址值。那么这里就有两个问题。第一个是为什么是这样的分配顺序?第二个是DCD后面表达式的值,即各个中断函数的地址值如Reset_Handler,NMIException是如何分配的?第一个问题的答案好找,我们参考《STM32参考手册》:可以看到,启动文件中的向量表的分配的顺序是按照固定的规则来的。第二个问题。随意打开一份编译过的工程,工程配置如下:我们可以看到.map文件有这样一段:同时使用J-Link打开.hex文件可以看到
从hex档,我们可以看到Flash的起始区域0x8000000的内容为0x200006600x0800027D0x080002810x08000283……刚好可以和map文件对应,也刚好可以和启动文件的向量表对应。按照Cortex-M3权威指南,在复位后,有如下动作:


    我这里是选择从flash启动,根据寄存器映射,Address从0x00000000映射到0x08000000。所以hex档的内容刚好满足复位序列的设定。由此从启动文件到.map文件再到.hex文档,再到CM3复位启动的脉络就理清了。嵌入式学习交流群:769843038参考资料:http://www.makeru.com.cn/


0条回答

一周热门 更多>