关于STM32中断向量表的位置 、重定向问题

关于STM32中断向量表的位置 、重定向问题

关于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、进到

相关主题
相关文档
最新文档