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_IRQChangPreemptionPriority抢占式优先级以及NVIC_IRQChangSubPriority响应优先级
STM32的中断向量有两个属性,一个是抢占属性,另一个是响应属性,对应的属性的编号越小,优先级越高
抢占:是指打其他中断的属性,因为具有这个属性,所以会出现嵌套中断(在执行中断服务函数B的过程中被A打断了,然后会执行完中断服务函数A之后再继续执行终端服务函数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个…..)
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个…..)
相关文章推荐
- 利用xcodebuild命令行进行打包
- android 属性动画入门
- cpp_读取数量不定的输入
- Android Xutils框架使用之ViewUtils
- 防止表单重复提交的几种策略
- Qt 小结
- 接口顺序
- 读取xib文件
- java微信公共帐号支付(JS支付)
- linux chcon命令详解
- 分页显示
- Android-命令行打包
- php使用escapeshellarg时中文被过滤的解决方法
- ViewController控制器的多种创建方式
- Android Xutils框架使用之DBUtils
- CSS布局——960gs
- Vijos P1889 天真的因数分解
- reversed与zip的用法:顺时针方向读取二维数组
- HTML5
- 动态规划_爬楼梯