CortexM3异常与NVIC_第1页
CortexM3异常与NVIC_第2页
CortexM3异常与NVIC_第3页
CortexM3异常与NVIC_第4页
CortexM3异常与NVIC_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章 Cortex-M3异常与NVIC补充知识补充知识1、Cortex-M3异常与异常与NVIC的关系的关系2、 Cortex-M3中异常与中断的区别中异常与中断的区别3、Cortex-M3异常和中断类型异常和中断类型4、中断优先级、中断优先级5、中断执行顺序、中断执行顺序 支持中断嵌套支持中断嵌套6、外部中断和外部事件、外部中断和外部事件7、EXTI寄存器寄存器8、外部中断例程、外部中断例程补充知识:1、中断源外部中断:中断源是处理器内核外硬件电路中发生的突发事件,它们通过响应的芯片内部通道或外部引脚向处理器提出中断请求,如定时器外部中断、ADC转换结束中断等。内核中断:中断源是处理器内核

2、正在执行的过程引发的异常情况,如当指令执行了“非法操作”、访问被禁的内存区间、因各种错误产生的fault以及不可屏蔽中断。补充知识:2、中断优先级及中断嵌套中断嵌套遵循以下几个原则。CPU同时接收到几个中断时,首先响应优先级最高的中断请求。正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。正在进行的低优先级中断服务,能被高优先级中断请求中断。补充知识:3、中断类型码与中断向量 处理器为了识别中断源,给每一个中断分配了一个编号,这就是中断类型码,它是识别中断源的唯一标志 处理器的中断管理系统将所有中断服务程序的入口地址集中存放在内存的某个区域中,从而建立了一个中断服务程序的入口地址表,

3、称为中断向量表。补充知识:4、中断响应 中断响应是当处理器发现有中断请求发生时,中止、保存当前程序的执行,转而执行中断处理程序的过程。信息保存,处理器将保存一些重要的信息,如返回地址和一些特定寄存器值等信息,这部分主要是进行压栈操作,从这一点来讲几乎所有的处理器都是一样的,用压栈保护现场。同时处理器会获得的中断类型码,并根据获得的中断类型码查找中断向量表,获得中断服务程序的入口地址。中断执行,执行相应功能的中断服务程序。中断返回,当中断服务程序执行结束时,从堆栈中取出返回地址等各种信息,程序继续执行。1、Cortex-M3异常与NVIC的关系 Cortex-M3在内核水平上搭载了一个异常响应系

4、统,支持多种的系统异常和外部中断共256个中断,除了个别异常的优先级已经固定外,其它异常的优先级都是可编程的。 Cortex-M3的异常是由嵌套向量中断控制器NVIC(Nested Vectored Interrupt Controller)统一进行管理的。STM32采用了Cortex-M3内核,所以这部分仍旧保留使用,但STM32并没有使用Cortex-M3内核全部的东西,因此它的NVIC是cortex_m3内核的NVIC的子集。2、Cortex-M3中异常与中断的区别 对于Cortex-M3核来讲 异常是指因为Cortex-M3内核的活动而打断了正在执行的程序,于Cortex-M3内核来说

5、是“同步”的,如:当指令执行了“非法操作”、访问被禁的内存区间、因各种错误产生的fault以及不可屏蔽中断。 中断于Cortex-M3内核来说请求信号来自Cortex-M3内核的外面,来自各种片上外设和外扩的外设,因此相对于Cortex-M3内核来说是“异步”的,如定时器外部中断。3、Cortex-M3异常和中断类型Cortex-M3异常类型见书P70 STM32F10 xxx系列非互联网产品支持中断共为76个,包括16个内核中断和60个外部中断见书P734、中断优先级、中断优先级 Cortex-M3的异常优先级可以被分组为抢占式优先级和响应优先级,有时又称为组优先权和子优先权。每个中断源都需

6、要被指定这两种优先级,256级优先级被按位分成高、低两段,高段设置抢占式优先级,低段设置响应优先级。 Cortex-M3中定义了8个比特位用于设置中断源的优先级,见书P71 同时注意:优先级数值越小,优先级别反而越高优先级数值越小,优先级别反而越高抢占式优先级和响应优先级的关系?若中断A抢占优先级比B高,那么A的中断可以在B里面触发,忽略响应优先级;中断A和B抢占优先级相同,则A、B的响应顺序由响应优先级决定谁先响应;以STM32为例,有16个可编程的优先等级,也就是可以4位来表达优先级,分组方式如下: 第0组:无抢占式优先级设置,所有4位用于指定响应优先级第1组:最高1位用于指定抢占式优先级

7、,最低3位用于指定响应优先级第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级第4组:所有4位用于指定抢占式优先级第0组第1组第2组第3组第4组以STM32的优先级第3组设置为例5、中断执行顺序、中断执行顺序 支持中断嵌套支持中断嵌套1、复位(Reset)、不可屏蔽中断(NMI)、所有类型的失效(Hard Fault)等优先级为负(高于普通中断优先级)且不可调整2、高抢占优先级的中断事件会打断低抢占优先级的中断(中断嵌套)抢占优先级决定是否会有中断嵌套抢占优先级决定是否会有中断嵌套3、抢占优先级相同的情况下,如果有低

8、响应优先级的中断在执行时,来了一个高响应优先级的中断请求,则高响应优先级的中断请求要等待低响应优先级的中断执行完了,才能响应高响应优先级的中断请求不可以嵌套;当然若高响应优先级的中断和低响应优先级的中断请求同时发生,会先响应高响应优先级的中断请求判断中断是否被响应的依据:先看抢占优先级,再看响应优先级判断中断是否被响应的依据:先看抢占优先级,再看响应优先级可知使用中断时需要配置应该包括:可知使用中断时需要配置应该包括:1、设置中断号,选择哪个中断?、设置中断号,选择哪个中断?2、选择优先级分组为第几组?、选择优先级分组为第几组?3、抢占式优先级为多少?、抢占式优先级为多少?4、响应优先级为多少

9、?、响应优先级为多少?NVIC_InitTypeDef的数据结构定义如下:typedef struct uint8_t NVIC_IRQChannel; /*中断类型对应的中断号 */ uint8_t NVIC_IRQChannelPreemptionPriority; /*!抢占式优先级*/ uint8_t NVIC_IRQChannelSubPriority; /*响应优先级*/ FunctionalState NVIC_IRQChannelCmd; /*允许或禁止中断,可设置为ENABLE 或 DISABLE */ NVIC_InitTypeDef 定义在misc.h 中各成员值见书P1

10、996、外部中断和外部事件、外部中断和外部事件图6.2 外部中断/事件控制框图外部中断和事件中断事件19路EXIT控制器可知使用可知使用EXTI中断时中断时还还需要配置应该包括:需要配置应该包括:若配置EXTI的输入线为中断源,过程如下:5、配置上升沿或下降沿触发选择寄存器?配置上升沿或下降沿触发选择寄存器?6、配置中断屏蔽寄存器?、配置中断屏蔽寄存器?若配置EXTI的输入线为事件源,过程如下: 配置所选事件线的屏蔽寄存器?配置所选事件线的屏蔽寄存器?书P79中断屏蔽寄存器(EXTI_IMR)事件屏蔽寄存器(EXTI_EMR)上升沿触发选择寄存器(EXTI_RTSR)下降沿触发选择寄存器(EX

11、TI_FTSR)软件中断事件寄存器(EXTI_SWIER)挂起寄存器(EXTI_PR)EXTI寄存器寄存器中断屏蔽寄存器中断屏蔽寄存器(EXTI_IMR)MRx:线x上的中断屏蔽 (Interrupt Mask on line x)0:屏蔽来自线x上的中断请求; 1:开放来自线x上的中断请求。 事件屏蔽寄存器事件屏蔽寄存器(EXTI_EMR)MRx: 线x上的事件屏蔽 (Event Mask on line x)0:屏蔽来自线x上的事件请求; 1:开放来自线x上的事件请求。 上升沿触发选择寄存器上升沿触发选择寄存器(EXTI_RTSR)TRx: 线x上的上升沿触发事件配置0:禁止输入线x上的上

12、升沿触发(中断和事件); 1:允许输入线x上的上升沿触发(中断和事件) 下降沿触发选择寄存器下降沿触发选择寄存器(EXTI_FTSR)TRx: 线x上的下降沿触发事件配置0:禁止输入线x上的下降沿触发(中断和事件); 1:允许输入线x上的下降沿触发(中断和事件)软件中断事件寄存器软件中断事件寄存器(EXTI_SWIER)SWIERx:线x上的软件中断 ,当该位为0时,写1将设置EXTI_PR中相应的挂起位。如果在EXTI_IMR和EXTI_EMR中允许产生该中断,则此时将产生一个中断。 挂起寄存器挂起寄存器(EXTI_PR)PRx: 挂起位 (Pending bit) 0:没有发生触发请求;

13、1:发生了选择的触发请求 当在外部中断线上发生了选择的边沿事件,该位被置1。在该位中写入1可以清除它,也可以通过改变边沿检测的极性清除。 EXTI_TypeDef的数据结构定义如下:typedef struct _IO uint32_t IMR; /*中断屏蔽寄存器*/ _IO uint32_t EMR; /*事件屏蔽寄存器*/ _IO uint32_t RTSR; /*上升沿触发选择寄存器*/ _IO uint32_t FTSR; /*下降沿触发选择寄存器*/ _IO uint32_t SWIER; /*软件中断事件寄存器*/ _IO uint32_t PR; /*挂起寄存器*/ EXTI_

14、TypeDef; 定义在Stm32f10 x.h中用于寄存器编程法编程EXIT初始化结构体初始化结构体相关配置寄存器相关配置寄存器#define PERIPH_BASE (uint32_t)0 x40000000)#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE (PERIPH_BASE + 0 x10000)#define EXTI_BASE (APB2PERIPH_BASE + 0 x0400)#define EXTI (EXTI_TypeDef *) EXTI_BASE)EXTI_InitTypeDef的结构体如下:Ty

15、pedef struct uint32_t EXTI_Line; /选择使能或失能的外部线路 EXTIMode_TypeDef EXTI_Mode; /事件请求或中断请求选择 EXTITrigger_TypeDef EXTI_Trigger; /触发方式 FunctionalState EXTI_LineCmd;/线路状态enable/disableEXTI_InitTypeDef;定义在Stm32f10 x_exit.h中各成员值见书P198以STM32非互联型产品为例,其芯片内部有19路EXTI控制器,那么每一路对应的外部中断/事件线路是怎样的?EXTI0EXTI15是I/O端口通过图6.

16、3的方式连接到16个外部中断/事件线上;EXTI16连接的是PVD输出;EXTI17连接的是RTC闹钟事件;EXTI18连接的是USB唤醒事件。可知使用可知使用EXTI中断时中断时还还需要配置应该包括:需要配置应该包括:7、选择、选择EXTI的输入线路?的输入线路?GPIO 的复用选择设置小结:完成小结:完成EXTI中断时需要配置应该包括:中断时需要配置应该包括:1、设置中断号,选择哪里中断?、设置中断号,选择哪里中断?2、选择优先级分组为第几组?、选择优先级分组为第几组?3、抢占式优先级为多少?、抢占式优先级为多少?4、响应优先级为多少?、响应优先级为多少?5、配置上升沿或下降沿触发选择寄存

17、器?、配置上升沿或下降沿触发选择寄存器?6、配置中断屏蔽寄存器?、配置中断屏蔽寄存器?7、选择、选择EXTI的输入线路?的输入线路?对应的中断服务程序对应的中断服务程序结构体NVIC_InitTypeDef结构体 EXTI_InitTypeDef用到:stm32f10 x_it.cstm32f10 x_it.hGPIO复用选择void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);void EXTI_Init(EXTI_InitTyp

18、eDef* EXTI_InitStruct);void EXTI_ClearITPendingBit(u32 EXTI_Line);常用函数(除常用GPIO函数外)NVIC 库函数库函数 ,见书见书199void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);EXIT 库函数库函数 ,见书见书198GPIO库函数库函数 ,见书见书187RCC库函数库

19、函数 ,见书见书1917、外部中断例程、外部中断例程设计要求:当按下按键设计要求:当按下按键S1时,发光二极管时,发光二极管DS1的状态改变一的状态改变一次;当按下按键次;当按下按键S2时,发光二极管时,发光二极管DS2的状态改变一次;以的状态改变一次;以此类推。(采用中断方式编程)此类推。(采用中断方式编程)DS1DS2DS3DS41KR11KR21KR31KR43v3PF6PF7PF9PF8程序设置如下:设置好相应的时钟设置相应的中断,包括中断号、优先级、中断允许将相应的GPIO口设置为中断线路 (要在设置外部中断之前)并初始化I/O口初始化,包括按键及LED完成中断服务(响应)函数主程序

20、/引脚定义#define RCC_GPIO_LED RCC_APB2Periph_GPIOF /*LED使用的GPIO时钟*/#define LEDn 4 /*IIILED数量*/#define GPIO_LED GPIOF /*IIILED灯使用的GPIO组*/#define DS1_PIN GPIO_Pin_6 /*DS1使用的GPIO管脚*/#define DS2_PIN GPIO_Pin_7/*DS2使用的GPIO管脚*/#define DS3_PIN GPIO_Pin_8 /*DS3使用的GPIO管脚*/#define DS4_PIN GPIO_Pin_9 /*DS4使用的GPIO管

21、脚*/#define GPIO_LED_ALL DS1_PIN |DS2_PIN |DS3_PIN |DS4_PIN #define RCC_KEY1 RCC_APB2Periph_GPIOD#define GPIO_KEY1_PORT GPIOD #define GPIO_KEY1 GPIO_Pin_3#define RCC_KEY2 RCC_APB2Periph_GPIOA#define GPIO_KEY2_PORT GPIOA #define GPIO_KEY2 GPIO_Pin_8#define RCC_KEY3 RCC_APB2Periph_GPIOC#define GPIO_KEY

22、3_PORT GPIOC #define GPIO_KEY3 GPIO_Pin_13 #define RCC_KEY4 RCC_APB2Periph_GPIOA#define GPIO_KEY4_PORT GPIOA #define GPIO_KEY4 GPIO_Pin_0 设置好相应的时钟void RCC_config() /打开PE PD PC PB端口时钟,并且打开复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GP

23、IOF | RCC_APB2Periph_AFIO, ENABLE);因为使用到中断设置相应的中断,包括中断号、优先级、中断允许NVIC的数据结构定义如下:typedef struct uint8_t NVIC_IRQChannel; /*中断类型对应的中断号 */ uint8_t NVIC_IRQChannelPreemptionPriority; /*抢占式优先级*/ uint8_t NVIC_IRQChannelSubPriority; /*响应优先级*/ FunctionalState NVIC_IRQChannelCmd; /*允许或禁止中断,可设置为ENABLE或 DISABLE

24、*/ NVIC_InitTypeDef各参数的取值表见书P200void NVIC_config() NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /选择中断分组2 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; /选择中断通道0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /抢占式中断优先级设置为0 NVIC_InitStructure.NVIC_I

25、RQChannelSubPriority = 0; /响应式中断优先级设置为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /使能中断 NVIC_Init(&NVIC_InitStructure);参数的取值表见书P199将相应的GPIO口设置为中断线路 (要在设置外部中断之前)并初始化EXTI的数据结构定义如下:typedef struct _IO uint32_t IMR; /*中断屏蔽寄存器*/ _IO uint32_t EMR; /*事件屏蔽寄存器*/ _IO uint32_t RTSR; /*上升沿触发选择寄存器*/ _IO uin

26、t32_t FTSR; /*下降沿触发选择寄存器*/ _IO uint32_t SWIER; /*软件中断事件寄存器*/ _IO uint32_t PR; /*挂起寄存器*/ EXTI_TypeDef; 定义在Stm32f10 x.h中库函数使用中的初始化外设EXIT寄存器结构体typedef struct uint32_t EXTI_Line; EXTIMode_TypeDef EXTI_Mode; EXTITrigger_TypeDef EXTI_Trigger; FunctionalState EXTI_LineCmd;EXTI_InitTypeDef;参数的取值表见书P198EXTI_

27、Init(&EXTI_InitStructure)void EXTI_ClearITPendingBit(u32 EXTI_Line) /清除EXTI线路挂起位void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)/选择GPIO管脚用作外部中断线路void EXIT_config() EXTI_InitTypeDef EXTI_InitStructure; EXTI_ClearITPendingBit(EXTI_Line0); /清空中断标志 /选择中断管脚PA.0 PC.13 PA.8 PD.3 GP

28、IO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13 | EXTI_Line8| EXTI_Line3; /选择中断线路0 13 8 3 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; /设置为中断请求,非事件请求 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; /设置中断触发方式为下降沿触发 EXTI_

29、InitStructure.EXTI_LineCmd = ENABLE; /外部中断使能 EXTI_Init(&EXTI_InitStructure);I/O口初始化,包括按键及LEDvoid GPIO_KEY_config(void) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_KEY1; GPIO_Init(GPIO_KEY1_PORT, &GPIO_InitStructure);void LED_config(void) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论