您的位置 首页 硬件

STM32学习记载12 中断向量表

从stm32f10x.s可以看到,已经定义好了一大堆的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地址,例如:AREARE…

从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、进到C言语后会先装备NVIC,NVIC_SetVectorTable()里边能够装备中止向量表的开始地址和偏移,主要是告知CPU该向量表是坐落Flash仍是Ram,偏移是多少。例如设置为坐落Flash内,偏移便是烧入的程序地址,可在Keil target中设置。这样CPU就知道进口地址了。

4、产生中止后,CPU找到中止向量表地址,然后依据偏移(对号入座)再找到中止地址,这样就越过去了。

咱们截一个图阐明一下,map文件:

对应的bin文件,看是不是放的上面地址:

明显,200039c0便是栈顶地址,而08006F21便是reset_handler地址!

怎么定位?以放到0x20000000为例

1、keil设置ram开始为0x20000100,咱们在0x20000000~0x20000100放中止向量表,其他给程序用

2、设置NVIC_SetVectorTable(NV%&&&&&%_VectTab_FLASH,0);

3、跳到C时把中止向量表拷贝到0x20000000

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/272535.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部