历史上的今天
返回首页

历史上的今天

今天是:2024年12月11日(星期三)

正在发生

2018年12月11日 | STM32中断向量表的位置,重定向

2018-12-11 来源: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


推荐阅读

史海拾趣

CalAmp公司的发展小趣事

在某年第一季度,CalAmp公司发布了其财报数据。根据财报,该季度公司实现营收7089.1万美元,虽然比市场预期的7566万美元略低6.30%,但仍然展现了稳健的增长态势。同时,公司的每股收益为-0.11美元,低于预期的0.04美元,这可能与公司在研发和市场拓展方面的持续投入有关。尽管如此,CalAmp公司在无线通信解决方案应用领域的广泛布局和深厚的客户基础,使得其整体业绩依然保持稳健。

Exclara Inc公司的发展小趣事

Exclara Inc.自创立之初就致力于研发创新技术,以满足电子行业对高性能、低功耗产品的需求。公司通过不断的技术突破,成功开发出了一系列具有竞争力的产品。例如,其采用HVX技术构成的驱动电源在T8型LED市场中脱颖而出,相比同规格方案,能够降低30%的BOM成本,这一技术革新不仅提升了产品的竞争力,也为公司赢得了市场的广泛认可。

AVAGO公司的发展小趣事

随着公司规模的扩大和技术的不断积累,AVAGO公司开始寻求多元化的发展道路。除了继续深耕半导体领域外,公司还积极拓展其他相关领域,如传感器、无线通信等。同时,公司还与其他行业的领军企业建立了紧密的战略合作关系,共同推动技术创新和市场拓展。

Chiplus Semiconductor Corp公司的发展小趣事

在21世纪初,全球半导体行业蓬勃发展,台湾地区的IC设计领域也呈现出勃勃生机。在这样的背景下,晶发半导体的创始人蒲文豪怀揣着对低功率SRAM领域的深厚热情,于2002年创立了Chiplus Semiconductor Corp.(晶发半导体)。蒲文豪曾在一家专攻低功率SRAM的公司工作,深知这一领域的潜力和市场需求。他立志要做低功率SRAM领域的领军者,为全球客户提供卓越的产品和服务。

Cristek Interconnects Inc公司的发展小趣事

面对日益复杂的供应链环境,Cristek Interconnects Inc公司进行了深入的供应链优化。公司与多家优质供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和质量可靠。同时,公司还引入先进的供应链管理系统,提高了供应链的透明度和效率,为公司的快速发展提供了有力保障。

ALPS公司的发展小趣事

随着市场竞争的加剧,Cristek Interconnects Inc公司意识到质量管理的重要性。于是,公司投入大量资源,建立了一套完善的质量管理体系,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把关。这种严谨的质量管理态度,使得Cristek的产品在行业中享有良好的声誉,赢得了客户的信赖。

问答坊 | AI 解惑

锂离子电池智能充电器硬件的设计

锂离子电池具有较高的能量重量和能量体积比,无记忆效应,可重复充电次数多,使用寿命长,价格也越来越低。一个良好的充电器可使电池具有较长的寿命。利用C8051F310单片机设计的智能充电器,具有较高的测量精度,可很好的控制充电电流的大小,适时 ...…

查看全部问答>

天下最有才的辞职信

  亲爱的老板:    昨天外面下了一场雨嗳,这让我想起我国著名诗人汪国真的诗句:“总有些这样的时候,正是为了爱,才悄悄躲开,躲开的是身影,躲不开的,却是那份,默默的情怀。……“    领导你看,他写得多好啊,我一边读他的诗,一边 ...…

查看全部问答>

容阻降压电路输出电流过小

咖啡机降压电路为容阻降压,怎样解决容阻降压电路输出电流过小的问题,一般只能有几十mA…

查看全部问答>

mobile5.0下如何把ToolBar移动到顶部(vc2005)?

大家好,为什么mobile下面无法将工具栏放在顶部?有没有哪位遇到过类似问题?…

查看全部问答>

verilog HDL程序错误问题

一个数字跑表程序,clk:时钟信号;clr:异步复位信号;pause:暂停信号;msh,msl:百分秒高位和低位:sh,sl:秒高位和低位;mh,ml:分高位和低位module paobiao(msh,msl,sh,sl,mh,ml,clk,clr,pause);output [3:0]msh,msl,sh,sl,mh,ml;input&nbs ...…

查看全部问答>

工作,唉。

上学的时候吧想工作,一直认为上班好,可上班了觉得还是上学好啊,呵呵。开始的时候觉得工作了很新鲜,慢慢的就变得麻木啦,开始的时候还在想要不要换工作,最后还是决定坚持下去,不三心二意的换来换去的,没了换工作的烦恼,缺有了新的烦恼,那就 ...…

查看全部问答>

新手求救!定义bit变量!

我用c写程序的时候想定义一个可位操作的变量,可是430不支持bit指令,请高手赐教怎么实现?…

查看全部问答>

【共享】芯嵌stm32入门教程 + 视频

(一)芯嵌stm32入门视频,下载地址:http://pan.baidu.com/share/link?shareid=2052956608&uk=3942664303 芯嵌stm32入门视频之一《stm32入门初探》 芯嵌stm32入门视频之二《芯嵌stm32使用指南》 芯嵌stm32入门视频之三《JLink的安装和使用》 ...…

查看全部问答>

MDK474编译老出错

       领的LPC1500的板子之后,最近才抽得空出来玩NXP,可是编程环境一直弄不出来,急死我了!!!!!!! 在官网下了 MSK 474,装好之后也破解了 在论坛里在了个例程想看下板子能不能工作,可是编译一直不通过,老是提示 ...…

查看全部问答>

已知磁芯 如何选择骨架?

新手在此弱弱地请教一个问题  已知磁芯 如何选择骨架?是每个对应的磁芯可以能找到相对应的骨架吗? \0\0\0eeworldpostqq…

查看全部问答>