STM32中断向量表的位置,重定向

发布者:cxd88988最新更新时间:2018-12-11 来源: eefocus关键字:STM32  中断向量表  重定向 手机看文章 扫描二维码
随时随地手机看文章

这篇文章已经说了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


关键字:STM32  中断向量表  重定向 引用地址:STM32中断向量表的位置,重定向

上一篇:STM32F103C8T6实现串口IAP方式升级固件
下一篇:STM32向量表详细分析

推荐阅读最新更新时间:2024-03-16 16:19

STM32的TIMx如何设置成普通定时器
实现的功能是让开发板上的LED周期性的发光 下面以stm32的TIM2作为实例一步步配置成为定时器: 1:对定时器的基本配置 TIM_TimeBaseStructure.TIM_Period = 65535; //设置自动装载寄存器 TIM_TimeBaseStructure.TIM_Prescaler = 100; //分频计数 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择向上计数 TIM_TimeBaseInit(TIM2,
[单片机]
STM32基本定时器TIM6和TIM7
1. STM32上定时器的分类 前面学习了STM32系统定时器SysTick,它的主要作用是为OS提供系统滴答,当然我们也可以利用它实现了精准延时。在STM32单片机中,除了属于CM3内核中的一个外设的系统定时器外,还有几个属于片上外设的定时器:基本定时器(TIM6和TIM7)、通用定时器(TIM2/3/4/5)和高级定时器(TIM1和TIM8)。强调,这里指的是除互联型的STM32F1系列单片机。 它们各自具有的功能特点可以详见《STM32中文参考手册_V10.pdf》-P298,这里简单描述: (1)基本定时器(TIM6和TIM7):16位的只能向上计数的定时器,只能实现定时,没有外部IO通道与它关联。
[单片机]
<font color='red'>STM32</font>基本定时器TIM6和TIM7
usmart_dev.init(SystemCoreClock/1000000); stm32 战舰的usmart 程序
usmart_dev.init(SystemCoreClock/1000000); //初始化USMART 对初始化程序的解析。对应 stm32 战舰的usmart 程序来分析 usmart_dev是_m_usmart_dev结构体的变量, usmart_dev结构体变量的初始化如下 struct _m_usmart_dev usmart_dev= { usmart_nametab, usmart_init, usmart_cmd_rec, usmart_exe, usmart_scan, sizeof(usmart_nametab)/sizeof(struct _m_usmart_nametab),//函数数量
[单片机]
STM32固件库实现led亮灭闪烁和音频发生器设计
概述 本文使用STM32F10X,软件为Keil uVision5,仿真软件Proteus 8 Professional 电路图 8个led亮灭实现代码 实现代码 //8¸öledÈ«ÁÁÈ«Ãð #include stm32f10x.h int main() { GPIO_InitTypeDef star; //配置开启GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //设置GPIO输出模式 //stm32F1提供了4种输出模式(推挽输出、开漏输出 、复用推挽输出 、复用开漏输出)和3种输出速度;一般配置LED采用推挽输出;
[单片机]
<font color='red'>STM32</font>固件库实现led亮灭闪烁和音频发生器设计
实操经验分享——在STM32上移植Linux
刚从硬件跳槽为嵌软时,没有任何一丝的准备。一入职,领导就交代了一项特难的任务——在stm32上移植linux! 瞬间我就懵了,没办法硬着头皮上吧,先搜集资料,我之前跑的是ok6410的板子上运行的linux,现在是在stm32上移植,以前stm32倒是玩过,研究生期间就捣鼓过它,但现在还没从抓烙铁的硬件当中缓过神来,就转到嵌入式软件的开发,更头疼的是stm32没有MMU!没有MMU!找了一下,好吧,有个uClinux! 于是开始学习各种相关的知识,了解到linux的启动一般是u-boot——》liunx内核——》根文件系统,那么首先要做个基于stm32的u-boot,先初始化时钟、外设、中断什么的,看了韦东山老师的视频感觉
[单片机]
STM32基础知识2-分享PWM输入模式捕捉4路PWM波形的周期和占空比
前几天分享过一个帖子,因为网速原因没有上传源码,看到有人回复我说实验不成功,那么好吧!这是我的错误,这次就将源码和我的心得体会分享出来,供大家下载测试和成长。我其实也是菜鸟一个,如果讲解的地方有啥不对,或是程序设计的不好,欢迎大家提出意见,让我们一起来学习进步。 PWM输入是输入捕获的一个特殊应用,输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中。你可以开启捕获中断然后在中断处理函数中读出保存的计数值。 与输入捕获不同的是PWM输入模式会将同一个输入信号(TI1或TI2)连接到两个捕获装置(IC1和IC2)。这两个捕获装置一个捕获上升沿一个捕获下降沿。TI1FP1、TI2
[单片机]
<font color='red'>STM32</font>基础知识2-分享PWM输入模式捕捉4路PWM波形的周期和占空比
STM32的BOOT1与BOOT0设置
OOT1与BOOT0分别由0,1两种值,可以组合成3种启动模式: BOOT1=X,BOOT0=0 启动模式:User Flash Memory 从用户闪存启动 BOOT1=0,BOOT0=0 启动模式:System Memory 从系统存储器启动 BOOT1=1,BOOT0=0 启动模式:Embedded SPAM 从内置SRAM启动 意思为这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序 一般设置为BOOT1=0,BOOT0=0,只是在ISP下载时设置为BOOT1=0,BOOT0=1 第三种模式一般不用
[单片机]
STM32低功耗唤醒方式
MCU进入低功耗之后,以极低的功耗维持着系统“活着”,但是醒过来是需要一定条件的,比如定个“闹钟”,按键“按一下”等,目前常用的“正常的”唤醒方式有以下几种: 1、RTC定时唤醒; 2、外部中断唤醒(按键或者通讯唤醒); 3、特殊唤醒引脚唤醒(某些引脚具有专门的唤醒功能)。 下面,我们再来看一看如何通过RTC和外部中断唤醒MCU。 1、RTC定时唤醒 依然是从手册中我们可以看到,所有的RTC时间都可以把MCU从低功耗模式中唤醒: 介绍使用RTC的定时功能实现,定时1S唤醒一次,使用cubemx进行对RTC进行配置: 生成代码的时候,勾选这个选项,可以把不用的引脚配置为模拟输入模式,降低功耗: RTC的配置如图,使能RTC,
[单片机]
<font color='red'>STM32</font>低功耗唤醒方式
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved