STM32之EXTI(中断)

什么叫中断?(学过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个…..)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值