STM32-中断优先级管理NVIC详解

1,什么是中断?

 举个简单的例子,你正在打王者荣耀,然后你女朋友电话打过来了,此时你是接还是不接,如果不接,那么你女朋友就要和你分手,如果接了可能游戏就挂机了。你该如何选择,可能广大男性同胞会选择先接电话,然后简单敷衍两句,继续回来打游戏。此时,你女朋友的电话就相当于是一个中断源,他触发了你的中断,然后你要去执行中断服务函数也就是接女朋友电话,执行完毕之后你还要回来打游戏,继续之前的任务。这个过程其实就是咱们常说的中断。
 在单片机的世界,中断是一种常见的特性,它的执行流程如下:
在这里插入图片描述
中断的基础概念:=
中断源:能够产生中断事件。(固定的)
中断通道:给Cortex-M3交互路径。
中断优先级:中断同时到来,谁先执行。数字越小,优先级越高。
抢占优先级/剥夺:抢占优先级高的中断可以打断低抢占优先级的任务执行;
响应/次级:抢占优先级相等,同时到来,响应优先级谁高谁执行;
硬件优先级:中断向量表
中断响应:中断事件发生,Cortex-M3内核准备执行该事件,即为中断响应。
中断嵌套:可嵌套的内核 – 中断可以被其他中断打断。(Cortex-M)
  不可嵌套的内核 – 不可以打断。
可嵌套内核:在执行中断服务程序时,来了抢占优先级高的中断,把处理器状态压栈,转而执行优先级高的中 断的服务程序,再出栈;
中断挂起:中断事件发生了,但是Cortex-M3内核还没准备去执行。
中断服务函数:中断发生后,要执行的程序。(固定格式或则别人要求)
  软件编程,不调用,函数名固定;
 无参无返回值;
 执行时间短,不要使用阻塞函数;如果时间较长记录,在主程序运行;

2,中断、异常、事件三者的区别

在这里插入图片描述
 从上面这个图我们可以看出,首先异常和中断从广义上来讲,都可以称之为中断,只不过中断一般是指有外部产生的,这里的外部指的就是单片机上的那些外设,异常是指的是内核产生的。具体的中断和异常我们可以从内核手册里查到,异常的的编号在0-15之间,16-255则是外部中断。
在这里插入图片描述
在这里插入图片描述
那什么是事件呢?
事件其实就是触发中断的一个条件,当事件发生时,我们可以选择触发中断,也可以选择不触发中断。如下图所示,红色的路线是事件在单片机得运转的路线,蓝色的是中断在单片机内运行的路线。边沿检测电路检测到上升沿或者下降沿事件发生时,可以进行选择是否触发中断,如果直接到脉冲发生器,则不产生中断。
中断的执行路径:
 图中的蓝色虚线箭头,标出了外部中断信号的传输路径。首先,外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输出到NVIC中断检测电路。首先是编号2的边沿检测电路:这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。接下来,是编号3的或门,这个或门的另一个输入是软件中断/事件寄存器,从这里可以看出,软件可以优先于外部信号请求一个中断或事件,即当软件中断/事件寄存器的对应位为"1"时,不管外部信号如何,编号3的或门都会输出有效信号。然后,一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化。外部请求信号最后经过编号4的与门,向NVIC中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为"0",则该请求信号不能传输到与门的另一端,实现了中断的屏蔽。
在这里插入图片描述

3,中断由谁管理?NVIC

 单片机可以产生的中断有很多个,这些终端统统由NVIC进行管理,NVIC是位于内核里的一个嵌套向量中断控制器。NVIC 与 CM3 内核同声相应,同气相求,相辅相成,里应外合,共同完成对中断的响应。NVIC 的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑之外,NVIC 还包含了 MPU的控制寄存器、 SysTick 定时器以及调试控制。
 NVIC最多支持管理256个中断请求,但是大部分单片机会对这个中断进行相应设置并没有那么多,以STM32F103系列的芯片来说,他最多可以产生68个中断请求。这些中断按照NVIC分配好的优先级进行执行。
在这里插入图片描述

中断优先级

 在中断产生之后,CPU是否去执行该中断的处理以及什么时间去执行这个中断,这一切取决与中断的优先升级设置,对于M3内核来说,最大支持256个可编程优先级设置,也就是一共有8位优先级寄存器。但是在STM32芯片中设计者只是用了其中的4位,也就是说在STM32里,可编程的优先级一共有16中。其中4位优先级又被分为了抢占优先级和响应优先级,有的地方可能称之为占线优先级和次级优先级。
 抢占优先级高的中断先执行,而且抢占优先级高的中断可以打断带抢占优先级低的中执行。当两个中断抢占优先级一样,那么谁先到来谁先执行,如果同时到来则比较响应优先级,响应优先级高的先执行。在STM32中有优先级数值越小,优先级就越高。

优先级的具体划分可以参考下放这个例子:
       占先    次级
事件A     0     2
事件B     1     0
事件C     1     3
例如:
  事件C发生中断,此时事件A发生,A会抢占C(占先A大于C)
   事件C发生中断,此时事件B发生,不可以(占先B 和C一样)
   事件C和事件B同时到来,执行B,因为占先一样,比较次级。
   事件A和事件B同时到来,执行A,A的占先大于B的

中断相关函数

 对于中断的操作,一般我们在开启中断之后,会对中断进行优先级的设置,这里我们可以直接使用内核里提供的函数进行操作。参数中涉及的IRQn_Type可以从STM32F10x.h文件里查找。需要注意的是中断优先级分组设置,在一个工程中只能设置一次,避免出现中断优先级混乱的情况,一般在main函数开始的地方先进行中断优先级设置。
在这里插入图片描述
中断的配置步骤:
  1,设置中断优先级分组(只需设置一次)
  2,设置中断优先级
  3,开启中断通道

4,外部中断使用示例

下面用一个最简单的外部中断来演示一下,中断的使用
具体配置过程如下:
  1.按键初始化为浮空输入模式
 2.把PA0映射到EXTI0上:
  3.配置EXTI0:
    边沿检测、使能
 4.配置NVIC:配置EXTI0中断通道
    优先级、使能
  5.编写中断服务函数

//外部中断配置
void EXTI_Config(void)
{
	EXTI_InitTypeDef EXTI_InitStruct={0};
	NVIC_InitTypeDef NVIC_InitStruct={0};
	//打开端口复用时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);;
	//配置外部中断线
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
	//配置EXTI
	EXTI_InitStruct.EXTI_Line=EXTI_Line0;
	EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
	EXTI_InitStruct.EXTI_LineCmd=ENABLE;
	EXTI_Init(&EXTI_InitStruct);
	
	//配置中断优先级
	NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=3;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;
	NVIC_Init(&NVIC_InitStruct);
}
//中断服务函数
void EXTI0_IRQHandler(void)
{
	//此处可以添加自己的任务功能函数
	……
	EXTI_ClearITPendingBit(EXTI_Line0);
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值