历史上的今天
今天是:2024年12月11日(星期三)
2018年12月11日 | STM32向量表详细分析
2018-12-11 来源:eefocus
预备知识:
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的内容为
0x20000660
0x0800027D
0x08000281
0x08000283
……
刚好可以和map文件对应,也刚好可以和启动文件的向量表对应。
按照Cortex-M3权威指南,在复位后,有如下动作:


我这里是选择从flash启动,根据寄存器映射,Address从0x00000000映射到0x08000000。所以hex档的内容刚好满足复位序列的设定。
由此从启动文件到.map文件再到.hex文档,再到CM3复位启动的脉络就理清了。
下一篇:STM32向量表-串口1中断
史海拾趣
|
已知一个8-bit循环移位(左移)电路的功能表如下。信号S是移位数,Y是移位前的并行输入,Y*是移位后的并行输出。 以该移位电路为核心,扩展设计一个能完成算术左移、算术右移、逻辑左移、逻辑右移、循环左移、循环右移的通用移位电路。 (算术左 ...… 查看全部问答> |
|
正在画一PCB图 但是找了很久都没有那种电源插孔的封装 而且自己画的时候不知道怎么画了 它的孔(hole)是椭圆的 !! 由于是第一次 做PCB制版 所以 十分辛苦 麻烦哪位 大虾 解 ...… 查看全部问答> |
|
驱动程序启动失败,在[HKEY_LOCAL_MACHINE\Drivers\Active]下,DLL的号码并不连贯: 我写了一个GPIO的驱动,可以顺利编译并集成到OS中,查看 启动后查看[HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn]下的DLL的信息很正常。但是DLL没有被启动 查看 [HKEY_LOCAL_MACHINE\\Drivers\\Active]下,DLL的号码并不连贯: 9后面的就是11了 ...… 查看全部问答> |
|
由FPGA 做的电子钟,可是输出全为0(六位),希望大家帮忙看一下 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY clock IS PORT( CLK : IN STD_LOGIC; REST: IN STD_LOGIC;//复位键 MIN : IN ...… 查看全部问答> |
|
官方库里面貌似是没有那个DFN10封装貌似比较奇怪.看资料说是一面的.我记得实际器件好像是两面都有焊接.器件是CN3066一个锂电池充电保护的芯片.麻烦各位高手给看看啦 … 查看全部问答> |




