STM32学习记录12 中断向量表

发布者:sky0001最新更新时间:2016-08-28 来源: eefocus关键字:STM32  学习记录  中断向量表 手机看文章 扫描二维码
随时随地手机看文章
从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学习记录12 中断向量表

上一篇:STM32学习记录13 ucosII移植
下一篇:STM32学习记录12 中断向量表

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

STM32单片机学习手记
   STM学习笔记——用定时器实现荧火虫灯   在第6篇笔记中,我用软件延时的方法实现了荧火虫,学了定时器,当然就要用一用定时器了,这里仍是用荧火虫灯为例。   用ST库所带的例子Tim中的TimBase为例来修改,这个例子的位置以及如何建立工程请参考第7篇笔记,这里就不再重复了,下面简述一下修改的过程。   (1) 由于我的板子上的灯是由PD8~PD11来控制的,因此,要将   void RCC_Configuration(void)   中的:   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //打开GPIOC的时钟   改为   RCC_APB
[单片机]
<font color='red'>STM32</font>单片机<font color='red'>学习</font>手记
STM32STM32最小系统及电路基本原理
最小系统为单片机工作的最低要求,不含外设控制,原理简单,分析最小系统是嵌入式入门的基础。 1 最小系统原理图 最小系统主要有电源,时钟,调试,复位,以及控制芯片五大部分组成。 2 电源系统 由LDO(Low Dropout Regulator)低压差线性稳压器将5V转换为3.3V,为主控芯片供电。 关于电平转换,可以查看从电平角度理解数字电路 3 时钟电路 晶振是由石英晶体组成的,石英晶体之所以能当为振荡器使用,是基于它的压电效应:在晶片的两个极上加一电场,会使晶体产生机械变形;在石英晶片上加上交变电压,晶体就会产生机械振动,同时机械变形振动又会产生交变电场,虽然这种交变电场的电压极其微弱,但其振动频率是十
[单片机]
【<font color='red'>STM32</font>】<font color='red'>STM32</font>最小系统及电路基本原理
如何将LCD与STM32F103C8T6 STM32开发板连接并编程
对于任何微控制器项目,将显示单元与它连接将使项目更容易,并吸引用户与之交互。微控制器最常用的显示单元是 16×2 字母数字显示器。这些类型的显示器不仅可用于向用户显示重要信息,还可以在项目的初始开发阶段充当调试工具。因此,在本教程中,我们将学习如何将16×2 LCD显示器与STM32F103C8T6STM32开发板连接,并使用Arduino IDE对其进行编程。 所需材料 STM32蓝丸开发板 16×2 液晶显示屏 FTDI 程序员 连接线 液晶显示器 16×2 点阵 LCD 显示屏简介 如前所述,Energia IDE提供了一个漂亮的库,使接口变得轻而易举,因此不一定要了解显示模块的任何信息。但是,展示我们正在使用的东西不是
[单片机]
如何将LCD与STM32F103C8T6 <font color='red'>STM32</font>开发板连接并编程
STM32 HAL 详述串口收发的所有方式
串口收发方式 串口收发的使用无外乎下面这些使用方式 串口发送 轮询发送 HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)轮询发送函数,根据TXE标志一字节一字节的将数据传输到移位寄存器,再根据TC标志判断发送完成。 中断发送 HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)中断发送函数,首先将要发送的数据及大小赋值给串口句柄的发送缓存,然后开启发送数据寄存器为空(TXE)中断,每传
[单片机]
stm32 485串口数据的收发
//串口初始化: #define EN_USART2_RX 1 void RS485_Init(u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOG, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); RCC
[单片机]
STM32—DAC配置
一.DAC介绍 ADC是模数转换器,可以将模拟电压转换位数字信号;DAC是数模转换器,可以将数字信号转换为模拟电压。 STM32F103ZET6内部DAC有2个通道,12位数字输入(也可以配置为8位),可以按要求输出不同的信号波形,其主要特点如下: 2个DAC转换通道 每个通道都有DMA功能 2个通道可以同时转换或者分别转换 输入信号可以是12位或8位 12位输入模式分为:右对齐、左对齐 有同步更新功能 可以生成噪声波形 可以生成三角波形 DAC框图如下: 二.主要寄存器说明 一般使用DAC情况不多,而且使用也就是单纯输出电压,基本用不到STM32输出一些特殊的波形,所以了解一下基本的寄存器就可以配饰DAC了。 D
[单片机]
<font color='red'>STM32</font>—DAC配置
STM32 读保护功能和清除读保护功能设置【转】
1、STM32对内部Flash的保护措施 所有STM32的芯片都提供对Flash的保护,防止对Flash的非法访问 - 写保护和读保护。 1)、读保护即大家通常说的“加密”,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过下述任何一种方式读出: 通过调试器(JTAG或SWD); 从RAM中启动并执行的程序; 2)、写保护是以四页(1KB/页) Flash存储区为单位提供写保护,对被保护的页实施编程或擦除操作将不被执行,同时产生操作错误标志。 读与写设置的效果见下表: 读保护写保护 对Flash的操作功能 有效 有效
[单片机]
STM32的GPIO 输入—按键检测
硬件设计 按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生图1 中的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。本实验板连接的按键带硬件消抖功能,见图2,它利用电容充放电的延时,消除了波纹,从而简化软件的处理,软件只需要直接检测引脚的电平即可。 图1 按键抖动说明图 图2 按键原理图 从按键的原理图可知,这些按键在没有被按下的时候,GPIO引脚的输入状态为低电平(按键所在的电路不通,引脚接地),当按键按下时,GPIO 引脚的输入状态为高电平(按键所在的电路导通,引脚接到电源)。只要我们检测引脚的输入电平,即可判断按键是否被按下。 若您使用的实验板
[单片机]
<font color='red'>STM32</font>的GPIO 输入—按键检测
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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