1.STM32_中断入门资料_第1页
1.STM32_中断入门资料_第2页
1.STM32_中断入门资料_第3页
全文预览已结束

下载本文档

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

文档简介

1、STM32中断系统中断的定义:指当岀现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时, CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。概述ARM Cortex-m3 内核支持256个“中断通道”(16个内核+240个外部)和 可编程256级(8位)中断优先级设置。STM32采用Cortex-m3内核,但是 STM32并没有使用 Cortex-m3的全部资源。STM32目前支持84个“中断通道”(16个内核+68个外部)和 可编程16级(8位中的高4位)中断优先级设置。注意:STM32的外

2、部中断通道已经固定分配给相应的外设,具体参考手册上的中断向量表。中断源:触发中断的信号。中断通道:中断通道是中断源向内核申请中断的入口。中断通道给中断源提供一个向内核申请中断的 入口,中断源通过中断通道向内核提岀中断申请。(由上可知,中断通道一般是指中断向量表的入口地址)应多个一个中断通道可以对中断源,也可只对应一个。有的内置外设对应多个中断通道,有的只对应一个。中断优先级是针对中断通道的。(参考“参考手册”中断向量表)P.130STM32优先级中断优先级是针对“中断通道”的(即中断向量表),而不是针对中断源的。STM32中断优先级:STM32的中断通道可以被配置为响应式优先级 或抢占式优先级

3、。抢占式优先级:抢占式优先级高的中断会打断当前的主程序或者中断程序运行(中断嵌套)。对应每一个中断通道,Cortex-m3内核提供了一个 8位的寄存器IPx(但是只是用高四位),来确定该中断通道的抢占式优先级和响应式优先级。在一个stm32系统中,优先级的分组只有以下5种情况,具体采用哪一种,需要在初始化时写入到一个 32 位寄存器 AIRC (Application Interrupt and Reset Register )NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/设置优先级分组,下图应该出错,因为使用的是高四位,而下图使用的低四位 优

4、先级冲突处理:1. 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断的嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。2. 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。3. 如果这两个中断同时到达,则中断控制器根据他们的优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。配置优先级我们仅需做以下工作:typedef structuint8_tNVIC_IRQChannel

5、uint8_tNVIC_IRQChannelPreemptionPriority;uint8_tNVIC_IRQChannelSubPriority;FunctionalState NVICnitTypeDef;NVIC_IRQChannelCmd;void NVIC_TIM2_config(void)NVIC_InitTypeDef NVIC_initstructure;/设置优先级分组/设置中断抢占优先级级别/ 设置中断响应优先级级别NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_initstructure.NVIC_IRQChann

6、el=TIM2_IRQn; NVIC_initstructure.NVIC_IRQChannelCmd=ENABLE;NVIC_initstructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_initstructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_initstructure);注意:1 如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围, 将可 能得到意想不到的结果。2 数值越小,优先级级别越高。中断相关寄存器与中断控制相关的寄存器:嵌套向量中断结构体:t

7、ypedef struct_IOuint32_tISER8;Interrupt Set Enable Register (中断通道使能)uint32_tRESERVED024;_IOuint32_tICER8;Interrupt Clear Enable Register(中断通道除能)uint32_tRSERVED124;_IOuint32_tISPR8;Interrupt Set Pending Register(中断通道悬挂置位)uint32_tRESERVED224;_IOuint32_tICPR8;Interrupt Clear Pending Register(中断通道悬挂清除)u

8、int32_tRESERVED324;_IOuint32_tIABR8;Interrupt Active bit Register(中断活动标志位,查看该位可以知道系统当前正在处理哪个中断通道)uint32_tRESERVED456;_IO uint8_tIP240; Interrupt Priority Register (8Bit wide)(中断优先级寄存器)uint32_tRESERVED5644;_O uint32_tSTIRSoftware Trigger Interrupt Register(软件触发中断寄存器) NVIC_Type;系统控制块结构体:typedef struct

9、_I uint32_t CPUID;_IO uint32_t ICSR;_IO uint32_t VTOR;_IO uint32_t AIRCR;Application Interrupt / Reset Control Register (设置优先级分组)_IO uint32_t SCR;_IO uint32_t CCR;_IO uint8_tSHP12;_IO uint32_t SHCSR;_IO uint32_t CFSR;_IO uint32_t HFSR;_IO uint32_t DFSR;_IO uint32_t MMFAR;_IO uint32_t BFAR;_IO uint32

10、_t AFSR;_I uint32_t PFR2;_I uint32_t DFR;_I uint32_t ADR;_I uint32_t MMFR4;_I uint32_t ISAR5; SCB_Type; 配置这些内核寄存器只需做如下工作: typedef structuint8_tNVIC_IRQChanneluint8_tNVIC_IRQChannelPreemptionPriority;uint8_tNVIC_IRQChannelSubPriority;FunctionalState NVIC_IRQChannelCmd; NVIC_InitTypeDef;void NVIC_TIM2

11、_config(void)NVIC_InitTypeDef NVIC_initstructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_initstructure.NVIC_IRQChannel=TIM2_IRQn;/ 选择通道 NVIC_initstructure.NVIC_IRQChannelCmd=ENABLE;/ 使能通道 NVIC_initstructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_initstructure.NVIC_IRQChannelSubPriorit

12、y=1; NVIC_Init(&NVIC_initstructure);STM32 总中断的开和关 : STM32/Cortex-m3 是通过改变 CPU 当前优先级来允许或者禁止中断的。 PRIMASK 位: 只允许 NMI 和 hard fault 异常,其他中断都被屏蔽(当前CPU 优先级 =0 )FAULTMASK 位:只允许 NMI ,其他所有中断都被屏蔽(当前CPU 优先级 = -1)在 STM32 固件库中( stm32f10x_nvic.h 和 stm32f10x_nvic.c )定义了四个函数用来操作 PRIMASK 位 和 FAULTMASK 位,作用是改变 CPU

13、 当前优先级,从而达到控制所有中断目的:下面两个函数等效于关闭总中断 :void NVIC_SETPRIMASK(void);下面两个函数等效于开启总中断 :void NVIC_SETFAULTMASK(void); void NVIC_RESETPRIMASK(void);void NVIC_RESETFAULTMASK(void);中断程序编写中断控制过程(一个例子) :1 初始化:a 首先要设置寄存器 AIRC中 PRIGROUP的值, 规定系统中的抢先优先级和响应优先级各自的位数 (在 4 个 bits 中占用的位数) ;b 设置 TIME2 本身的寄存器,允许相应的中断,如允许 UI

14、E ( TIME2_DIER 的第 0 位)c 设置 TIME2 中断通道的抢先优先级和子优先级( IP28 ,在 NVIC 寄存器组中)d 设置允许 TIME2 中断通道。 (在 NVIC 寄存器组的 ISER 寄存器中的一位)2 中断响应过程a 当 TIME2 的 UIE 条件成立(更新、上溢或下溢) ,硬件将 TIME2 本身寄存器中 UIE 中断标 志置位 ,然后通过 TIME2 中断通道向内核申请中断服务。b 此时内核硬件将 TIME2 中断通道的 Pending 标志置位( 相当与中断申请标志置位 ) ,表示 TIME2 有中断申请。 如果当前有中断在处理, TIME2 的中断级别

15、不够高,那么就保持 Pending 标 志,当然用户可以在软件中通过写 ICPR 寄存器中相应的位把本次中断清除掉。c 当内核有空,开始响应 TIME2 的中断,进入 TIME2 的中断服务。 此时硬件将 IABR 寄存器中 相应的标志位置位,表示 TIME2 中断正在被处理(同时硬件清除 TIME2 的 Pending 标志位) 。3 执行中断服务程序 ( 一个中断通道只对应一个中断服务程序)a 所有 TIME2 的中断事件,都是在一个 TIME2 中断服务程序中完成的,所以进入中断程序后,中 断程序需要首先判断是哪个 TIME2 的具体事件的中断,然后转移到相应的服务代码段去。B 在中断服

16、务程序中把该具体中断事件的中断标志位( UIE )清除掉, 因为硬件是不会自动清除TIME2寄存器中具体的中断标志位的 。c 如果 TIME2 本身的中断事件多于 2 个,那么它们服务的先后次序就由用户编写的中断服务决定了。d 当然你也可以每次中断服务只处理其中的一个,然后再次进入中断,处理下一个。4 中断返回内核执行完中断服务后,便进入中断返回过程,在这个过程中需要:a 硬件将 IABR 寄存器中相应的标志位清0 ,表示该中断处理完成。如果 TIME2 本身还有中断标志位置位( UIE ),表示 TIME2 还有中断在申请,则重新将 TIME2 的 Pending 标志置为 1,等待 再次进

17、入 TIME2 的中断服务。最后注意不要忘了 : 在中断服务程序中把该具体中断事件的中断标志位(UIE )清除掉,因为硬件是不会自动清除 TIME2 寄存器中具体的中断标志位的 。STM32 的外部中断对于互联型产品, 外部中断 / 事件控制器由 20 个产生事件 /中断请求的边沿检测器组成, 对于其他产品, 则有 19 个能产生事件 / 中断请求的边沿检测器。EXTI 控制器的主要特性如下:1 每个中断 / 事件都有独立的触发和屏蔽2 每个中断线都有专用的状态位3 支持多达 20 个软件的中断 / 事件请求4 检测脉冲宽度低于 APB2 时钟宽度的外部信号。参见数据手册中电气特性部分的相关参数。 与外部中断相关寄

温馨提示

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

评论

0/150

提交评论