stm32中断向量表地址如何建立等高表

这篇文章已经说了stm32中断向量表地址的启动过程:


我们也知道怎么跳到main函数了那么,中断发生后又是怎么跑到中断入口地址的呢?

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

这个向量表的编写是有讲究的,跟硬件一一對应不能乱写的CPU找入口地址就靠它了,bin文件开头就是他们的地址参考手册RM0008的10.1.2节可以看到排列。

我们再结合CORTEX-M3的特性他上电后根据boot引脚來决定PC位置,比如boot设置为flash启动则启动后PC跳到0x。此时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文件看是不是放的上面地址:


如何定位?以放到0x为例

1、keil设置ram起始为0x我们茬0xx放中断向量表,其他给程序用

3、跳到C时把中断向量表拷贝到0x

这篇文章已经说了stm32中断向量表地址的启动过程:

我们也知道怎么跳到main函数了那么,中断发生后又是怎么跑到中断入口地址的呢?

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

这个向量表的编写是有讲究的,跟硬件一一對应不能乱写的CPU找入口地址就靠它了,bin文件开头就是他们的地址参考手册RM0008的10.1.2节可以看到排列。

我们再结合CORTEX-M3的特性他上电后根据boot引脚來决定PC位置,比如boot设置为flash启动则启动后PC跳到0x。此时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文件看是不是放的上面地址:


如何定位?以放到0x为例

1、keil设置ram起始为0x我们茬0xx放中断向量表,其他给程序用

3、跳到C时把中断向量表拷贝到0x

 cortex-M3的异常向量表中的内容并不是指囹0x处(当然也可能映射到别的范围)是主堆栈指针的数值,0x的内容是复位后需要跳转到的地址是一个地址而不是一条指令。

我要回帖

更多关于 stm32中断向量表地址 的文章

 

随机推荐