关于
STM32
中断向量表的位置
、重定向问题
首先我们需要跳到
main
函数,这个就不多说了。那么,中断发生后,又
是怎么跑到中断入口地址的呢?从
stm32f10x.s
可以看到,已经定义好了一大堆
的中断响应函数,这就是中断向量表,标号
__Vectors
,表示中断向量表入口地
址,例如:
AREA RESET, DATA, READONLY ;
定义只读数据段,实际上是在
CODE
区(假设
STM32
从
FLASH
启动,则此中断向量表起始地址即为
0x8000000
)
EXPORT
__Vectors
IMPORT
OS_CPU_SysTickHandler
IMPORT
OS_CPU_PendSVHandler__Vectors
DCD
__initial_sp
;
Top
of
Stack
DCD
Reset_Handler
;
Reset
Handler
DCD
NMI_Handler
;
NMI
Handler
DCD
HardFault_Handler
;
Hard
Fault
Handler
DCD
MemManage_Handler
;
MPU
Fault
Handler
DCD
BusFault_Handler
;
Bus
Fault
Handler
DCD
UsageFault_Handler
;
Usage
Fault
Handler
这个向量表的编写是有讲究的,跟硬
件一一对应不能乱写的,
CPU
找入口地址就靠它了,
bin
文件开头就是他们的
地址,参考手册
RM0008
的
10.1.2
节可以看到排列。我们再结合
CORTEX-M3
的特性,他上电后根据
boot
引脚来决定
PC
位置,比如
boot
设置为
flash
启动,
则启动后
PC
跳到
0x08000000
。此时
CPU
会先取
2
个地址,第一个是栈顶地址,
第二个是复位异常地址,故有了上面的写法,这样就跳到
reset_handler
。那么
这个
reset_handler
的实际地址是多少
.
?下面的一堆例如
Nmi_handler
地址又是
多少呢?发生中断是怎么跑到这个地址的呢?下面挨个讲解。
1
、我们可以通
过反向来得知这些入口地址,查看工程下的
map
文件就可以看到了,这个地址
跟
keil
里面设置的
target->flash
起始地址息息相关,实际上我们不太需要关心,
让编译器分配,中断向量表放的就是他们的地址。
2
、对比
ARM7/ARM9
内核,
Cortex-M3
内核则是固定了中断向量表的位置而起始地址是可变化的。
3
、进到