您的位置:首页 > 其它

STM32之EXTI(中断)

2016-07-10 00:30 253 查看
什么叫中断?(学过51单片机的肯定不陌生!!)

EXTI(External interrupt)指的是外部中断,通过GPIO检测输入脉冲,引起中断事件,打断原来的代码执行流程,进入到中断服务函数中进行处理,处理完后,再返回到之前中断的代码继续执行

stm32的中断和异常(在stm32中,所有的GPIO都可以用作外部中断源的输入端)

在stm32的中断向量表是重新进行编排的,(Cortex内核中,打断代码执行流程的事件分为异常(exception)以及中断(interrupt),编号0~15为内核异常,16以上都是外部中断(外部,是相对内核而言))

把编号-3至6的中断向量定义为系统异常,编号为负的内核异常不能被设置优先级,例如复位(Reset),不可屏蔽中断(NMI),硬错误(Hardfault)。从编号7开始的为外部中断,这些中断的优先级都是可以自行设置的

(中断向量表可以在《STM32中文参考手册》找到,不过最好是从启动文件startup_stm32f10x_hd.s(在工程目录的Libraries->CMSIS->startup目录下,具体根据自己工程目录的框架查找)中查找,因为不同型号的stm32芯片,中断向量表稍微有点区别,在启动文件中已经有相应芯片可用的全部中断向量,而且在编写中断服务函数的时候,需要从启动文件中定义的中断向量表查找出中断服务函数名称)

NIVC中断控制器以及NVIC_InitTypeDef分析

STM32的中断有如此之多,所以就需要一个中断控制器NIVC(Need Vectored Interrupt Controller),这个控制器是属于cortex内核的,不可屏蔽的中断和外部中断都是由他来处理(除SYSTICK外)

既然是STM32的中断控制器所以肯定在库中有封装好的库函数啦!!通过查找库帮助文档 我们会发现在Modules->STM32F10x_StdPeriph_Driver->misc中找到一个NVIC_Init()的函数,这里的形参需要一个NVIC_InitTypeDef类型的结构体

这个结构体有四个成员

NVIC_InitTypeDef{
NVIC_IRQChangle,            //需要配置的中断向量
NVIC_IRQChangCmd,           //使能或者关闭相应的中断向量的中断响应
NVIC_IRQChangPreemptionPriority,   //配置相应中断向量的抢占式优先级
NVIC_IRQChangSubPriority,          //配置相应中断向量的响应优先级
};

第一个NVIC_IRQChangle是用来选择将要配置的中断向量,用NVIC_IRQChangCmd来使能(ENABLE)或者关闭(DISABLE)该中断,在NVIC_IRQChangPreemptionPriority要配置中断向量的抢占式优先级,在NVIC_IRQChangSubPriority中配置中断向量的响应优先级


NVIC_IRQChangPreemptionPriority抢占式优先级以及NVIC_IRQChangSubPriority响应优先级

STM32的中断向量有两个属性,一个是抢占属性,另一个是响应属性,对应的属性的编号越小,优先级越高

抢占:是指打其他中断的属性,因为具有这个属性,所以会出现嵌套中断(在执行中断服务函数B的过程中被A打断了,然后会执行完中断服务函数A之后再继续执行终端服务函数B)

响应:当两个中断向量的抢占式优先级一样的时候,如果同时一起中断到达,那么优先处理响应等级高的。

举个例子:
有三个中断向量
中断向量    抢占式优先级   响应优先级
A             0             0
B             1             0
C             1             1
若正在执行C的中断服务函数,那么C能被抢占式优先级更高的A打断,由于B和C的抢占式优先级是一样的,所以不能被打断。但是如果B和C的中断时同时到达的,那么内核会先响应优先级更高的B

在配置优先级的时候,还需要注意一个问题,中断种类的数量这个图。


NVIC只可以配置16种中断向量的优先级,也就是说,抢占式优先级和响应优先级的数量由一个4位的数字来决定,把这个4位数字的位数分配成抢占式优先级部分和响应优先级部分,一共有5组我们在misc.h这个头文件可以查找到这5组的分配方式。


例如:第1组 最高的1位为抢占式优先级,低三位为响应优先级 既表示在16种中断向量中,有8种中断,其抢占式优先级都是0,响应优先级为0~7,另外8种中断,其抢占式优先级都是1,响应优先级为0~7。

(这里只说1组的含义,其他如此类推)

配置这些优先级组,可以用stm32库中提供的NVIC_PriorityGroupConfig(),参数为NVIC_PriorityGroup_0~NVIC_PriorityGroup_4。

ps:当一个工程有超过16个中断向量时,必然有2个以上的中断向量是使用了相同的种类,那么具有相同中断种类的中断向量是不能互相嵌套的

(注意,NVIC能配置的中断时16种,而不是最多16个…..)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: