历史上的今天
返回首页

历史上的今天

今天是:2025年04月26日(星期六)

2019年04月26日 | STM32 中断向量表的位置 、重定向

2019-04-26 来源:eefocus

篇文章已经说了STM32的启动过程:

http://blog.csdn.NET/lanmanck/article/details/8252560

我们也知道怎么跳到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


推荐阅读

史海拾趣

Bias Power公司的发展小趣事

随着全球化进程的加速,Bias Power公司积极寻求国际合作,以拓展更广阔的市场。公司与国际知名电子企业建立了战略合作关系,共同研发新产品,分享技术和市场资源。通过国际合作,Bias Power公司成功打入欧洲、亚洲等多个地区的市场,实现了业务的快速增长。

此外,Bias Power公司还积极参与国际展览和交流活动,展示其最新技术和产品,与全球同行进行深入交流。这些活动不仅提升了公司的知名度,还为公司的进一步发展奠定了坚实基础。

客益(Guestgood)公司的发展小趣事

在竞争激烈的电子行业中,Bias Power公司始终坚持质量至上的原则。公司建立了严格的质量控制体系,从原材料采购到生产加工、产品测试等各个环节都进行严格把关。此外,公司还引入了先进的生产设备和技术,确保产品的稳定性和可靠性。

由于公司对产品质量的严格把控,Bias Power公司的产品在市场上享有很高的声誉。许多知名企业都选择与其合作,将其产品应用于关键领域和重要项目中。这种信赖和认可为Bias Power公司的发展提供了有力支持。

Alpha-Micro Electronics公司的发展小趣事

Bias Power公司深知研发实力是企业发展的核心。因此,公司投入大量资源用于研发工作,建立了完善的研发团队和实验设施。通过不断的技术创新和研发投入,Bias Power公司成功推出了一系列具有竞争力的新产品,巩固了其在电子行业的领先地位。

同时,公司还注重知识产权的保护,积极申请专利,保护其核心技术不被侵犯。这些专利的申请和授权不仅提升了公司的技术实力,还为公司的发展提供了有力保障。

Crystal Semiconductor Corp公司的发展小趣事

随着产品质量的提升和技术创新的积累,Crystal Semiconductor Corp开始积极拓展国内外市场。公司加强了与全球知名企业的合作,通过参加国际展会、举办技术研讨会等方式提升品牌知名度。同时,公司还注重客户服务,积极解决客户在使用过程中遇到的问题,赢得了良好的口碑。

意华(CZT)公司的发展小趣事

为了提高产品质量,意华先后通过了ISO9001、ISO14001、IECQC080000等多项国际质量管理体系认证。这些认证不仅证明了公司的质量管理水平,也为客户提供了更可靠的产品保障。通过持续的质量改进和过程控制,意华的产品质量得到了显著提升,赢得了更多客户的认可。

Enable Semiconductor Corp公司的发展小趣事

面对竞争激烈的半导体市场,Enable Semiconductor Corp公司明智地选择了细分市场作为突破口。公司通过对市场的深入调研,发现智能手机、可穿戴设备等领域对高性能半导体产品的需求日益增长。于是,公司及时调整产品策略,加大在这些领域的研发和市场投入。这一战略布局使得公司能够快速响应市场需求,赢得客户的信赖。

问答坊 | AI 解惑

能推荐个好的gps模块吗

最近要用gps模块做同步授时,哪位用过给推荐下。天线越小越好…

查看全部问答>

PCI封装 规范

各位高手好。 最近在做PCI卡,小弟请教一下您PCI卡的尺寸/规范,以及电路封装。 谢谢您的帮助。 我的邮箱:wangwei4611@163.com …

查看全部问答>

linux c嵌入汇编编译报错

__asm__(\"ldw 0(%0), %%r0\" : : \"r\" (addr)); 就这段代码,是从内核中拿来用的。 20   21#define ARCH_HAS_PREFETCH   22static inline void prefetch(const void *addr)   23{   24  &nbs ...…

查看全部问答>

如何检测西门子gprs模块收到数据?

用西门子的gprs手机模块实现tcp连接时,用什么方式知道已经收到数据,可以读出来了? 谢谢…

查看全部问答>

s7-200 如何实现正弦曲线的输出

PLC  西门子 S7-200 PLC经过PID调节,输出变频器的频率控制容器压力。 现在想在升压的过程中,让压力值按照正弦曲线上升,如何编程?请给个思路。…

查看全部问答>

USB加密狗用的单片机CPU

请问大家,一般USB加密狗中用的CPU是什么型号,最便宜最可靠的是哪个型号。谢谢…

查看全部问答>

CE下USB-WIFI模块必须启动CE以后拔插一下才能使用...

WIFI是VT6656模块.USB接口的.重新编译NK.bin,添加注册表,烧写进目标,启动机器.插上USB网卡..一切OK...但是问题是如果已经插好USB.启动系统.就没反映了.必须要拔插一下才能识别硬件..CE系统是启动以后才会给USB分配中断么?..我试验了一下USB鼠标倒是 ...…

查看全部问答>

[新手问题]philips的LPC系列ARM启动代码相关问题

在初始化堆栈的时候 ... InitStack:               # MOV     R1, LR                 LDR   &nb ...…

查看全部问答>

msp430下载问题

手里有块利尔达的msp430F2274板子,板子上有个并行接口,也提供了并口线。应该可以通过电脑从并口下载程序,但是在debug这步出现了问题,提示:初始化失败,让检查硬件是否连接,检查驱动是否安装,还有重启电脑什么的。我都试过了,硬件连接肯定 ...…

查看全部问答>