STM32F4的中断

一、中断

1.基本概念

中断,在单片机中占有非常重要的地位,几乎任何一款单片机都会有中断。代码默认地从上向下执行,遇到条件或者其他语句,会按照指定的地方跳转。而在单片机执行代码的过程中,难免会有一些突发的情况需要处理,这样就会打断当前的代码,待处理完突发情况之后,程序会回到被打断的地方继续执行。

如果还没彻底明白就打个比方,我们写一个模拟在马路上行驶的无人小车的程序。正常情况下,我们是让小车匀速向前,但是小车在“马路”上行驶的过程中会遇到一些突发情况,比如遇到路障,或者是遇到斑马线。在这些情况下我们的小车就不能继续匀速向前行驶了,也就是说,我们不能让小车再执行匀速前进的指令(代码)了,需要打断它,这时候中断的作用就体现出来了。我们通过触发中断,在这里也就是遇到路障,或者是斑马线,发起中断请求,然后就会从主程序里跳出来,进入到中断服务程序中去。我们这里遇到路障,或是斑马线,是两个中断,也就用两个中断服务函数,如果是遇到路障触发中断,我们就执行中断服务函数里的向左变道或者是向右变道的指令;如果我们是遇到斑马线触发中断,我们就执行终端服务函数里的减速指令。在我们完成中断服务函数中的指令之后,又会返回,继续执行主程序,在这里也就是让小车继续匀速前进。

2.STM32中的中断

(1)中断的几种状态:

 Enable和Disable表示中断是否启用,我们要用到这个中断是一定要先启用的;

Pending和Not Pending表示中断是否悬起,也就是中断触发之后的待处理状态;

Active和Inactive表示中断是否正在执行,就是是否在运行该中断的中断服务函数。(中断在Active状态下也可以触发部分其他中断,在执行其他中断的过程中该中断保留Active状态)

(2)中断的优先级

 

 上图是STM32F42xxx和STM32F43xxx的部分向量表,灰色部分是异常,在此不展开介绍,而其它的就是所有可用的中断。可以看到表中第二列写的是优先级,第三列写的是优先级类型,它告诉我们该中断的优先级能否自己设置。

看到这里,我再来说一下中断优先级是什么,以及它起到了什么作用。

中断优先级是用来处理两个或多个中断同时发生时的处理的先后问题。优先级高的先处理,而优先级低的后处理(注意这里是数字越小优先级越高)。中断的优先级有两种,一个是抢占优先级,一个是响应优先级。我们可以认为一个是主优先级,一个是次优先级,主优先级高的肯定优先级更高,主优先相同的情况下就判断次优先级。如果它们主次优先级都相同,那么就按照向量表中的先后顺序来执行。需要注意的是,抢占优先级高的可以在抢占优先级低的中断的执行过程中触发中断,叫做中断嵌套,也就是前面说的中断在Active状态下进入其他中断,而只是响应优先级比较高,抢占优先级一样的情况下则不能发生中断嵌套。

 上面是中断优先级的分组,通过分组我们来决定有几位来表示抢占优先级,几位来表示响应优先级,我们一般是把中断优先级分组设为2,让两个优先级都可以有两位来表示。

二、NVIC

NVIC是什么?以下是STM32F4xx中文参考手册中的说明。

嵌套向量中断控制器 (NVIC) 和处理器内核接口紧密配合,可以实现低延迟的中断处理和晚 到中断的高效处理。 包括内核异常在内的所有中断均通过 NVIC 进行管理。

简单来说呢,NVIC就是内核里的一个外设,它控制着整个芯片中断相关功能。

NVIC还有一部分知识是关于寄存器的,再次不做讲述。

三、代码实现

下面来展示一下一个的中断的优先级设置的代码实现,使用的是库函数

1.中断优先级分组

前面说了通过分组我们来决定有几位来表示抢占优先级,几位来表示响应优先级,我们在这里把分组设为2。这个语句只需在主函数或者中断初始化函数中调用一次即可。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

2.中断优先级配置

这里我们用到的是NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)函数。

void NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;	//声明结构体

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                  //声明中断名称
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;      //设置抢占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;             //设置响应优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		          //使能中断

NVIC_Init(&NVIC_InitStructure);			//对上述配置进行初始化
}

我们在这里分别对NIVC_Init的几个结构体成员变量进行设置,具体有哪些结构体成员可以查看NVIC_Init的定义。这些配置都是我们之前讲到的,配置完成之后还要记得对配置进行初始化。

到这里通用的中断优先级设置就弄好,可以看到前面向量表里有几十种不同的中断,每种中断的配置以及中断服务函数都不尽相同,在这篇文章里就不再细说了。

感谢观看,希望对你有所帮助。

本文参考/引用的文章:

嵌套向量中断控制器(NVIC)详解 - Rane - 博客园 (cnblogs.com)
STM32中断控制 - LinZJ0423 - 博客园 (cnblogs.com)
 

(25条消息) STM32中断和异常_layverns的博客-CSDN博客_中断pending

如有侵权,请联系我删除。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值