关于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、进到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(nvic_vecttab_flash,0);
3、跳到c时把中断向量表拷贝到0x20000000
stm32单片机中文官网
意法半导体/st/stm

高合HiPhi X是华人运通旗下首款量产可进化超跑SUV
RA6T2的16位模数转换器操作 [1] 简介,A/D转换器概述
台积电南科18工厂一周以来发生的第三次工作安全事故了
CS8384八通道PCI数据采集卡在核辐射探测器中的应用
EMCP物联网云平台解决方案的详细介绍
关于STM32中断向量表的位置 、重定向问题
HyperXPredatorRGB内存评测 值不值得买
小米Play首推买流量送手机模式 每月10GB的高速流量真的够用吗
曙光智算IT基础设施服务的智慧化应用
笔记本电池换芯详解
中国联通为小家电行业打造余姚智能家电行业云平台
5G工业智能网关概述及作用
区块链怎样加强税收治理
三种总线的逻辑结构描述及在片上系统中的应用
松下推出进口新品 为消费者创造更好的冰箱使用体验
如何通过NOOK简易触摸使用任何电话或通用电池
LED显示屏谐波治理方案
三星或从2019年6月份开始量产7纳米EUV制程
热缩套管修复电缆的施工方法具体是怎样的
一加8 Pro真机疑似曝光 竖排三摄模组与一加7T Pro几乎一致