一、中断

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

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

STM32F4的中断相关推荐

  1. STM32F4外部中断

    一.外部中断概述 STM32F4的每个IO都可以作为外部中断输入.STM32F4的中断控制器支持22个外部中断/事件请求. EXTI线0~15:对应外部IO口的输入中断 EXTI线16:连接到PVD输 ...

  2. stm32F4 定时器中断 + 步进电机控制器 控制四线两相步进电机 (初级版本)

    2020-12-07 更新 -------------------------------------------------------------------------------------- ...

  3. 【STM32F4】八、外部中断

    目录 一.STM32F4的外部中断 1. STM32F4的外部中断个数 2. STM32F4中供IO口使用的外部中断 3. STM32F4的中断服务函数 二.STM32F4外部中断程序的编写 1. 外 ...

  4. hal库开启中断关中断_「正点原子NANO STM32开发板资料连载」第十章 外部中断实验...

    1)实验平台:ALIENTEK NANO STM32F411 V1开发板 2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第十章 外 ...

  5. STM32外部中断及串口

    一.外部中断的类型 STM32F4 外部中断/事件控制器(EXTI)包含多达 23 个用于产生事件/中断 请求的边沿检测器.EXTI 的每根输入线都可单独进行配置,以选择类型(中断 或事件)和相应的触 ...

  6. STM32F4_外部中断详解(EXTI)

    目录 1. EXTI 是什么? 2. EXTI主要特性 3. EXTI框图 3.1 外部中断/事件线映射 4. EXTI寄存器 4.1 中断屏蔽寄存器 EXTI_IMR 4.2 事件屏蔽寄存器 EXT ...

  7. STM32学习笔记(三)——外部中断的使用

    开发板芯片:STM32F407ZGT6 硬件连接:PE3-KEY1 一.STM32F4的中断介绍 STM32F4的每个IO都可以作为外部中断输入,很强大的功能吧!以前学习的51只有两个外部中断. ST ...

  8. STM32学习笔记(三)——外部中断的使用 1

    开发板芯片:STM32F407ZGT6 硬件连接:PE3-KEY1 一.STM32F4的中断介绍 STM32F4的每个IO都可以作为外部中断输入,很强大的功能吧!以前学习的51只有两个外部中断. ST ...

  9. (四)STM32F407总线架构、时钟系统配置相关的函数,IO 引脚复用器和映射,NVIC中断管理,寄存器地址映射

    基础知识 一.GPIO输入输出各种模式 二.STM32F407总线架构 三.STM32F407时钟系统 (1) STM32F4 时钟树概述 (2)STM32F4 时钟初始化配置 (3)STM32F4 ...

最新文章

  1. jstatd - Virtual Machine jstat Daemon
  2. ios 支付宝支付集成
  3. MyBatis基于注解的使用
  4. python版本越高越好吗-python一般用什么版本
  5. Vue指令之v-model和双向数据绑定
  6. 【网址收藏】OpsAnt 云原生开源运维平台
  7. Threading in C#
  8. 原生js实现jquery库中选择器的功能(jquery库封装一)
  9. oracle创建用户及授权等相关操作
  10. 剑指offer31-栈的压入、弹出序列
  11. LVDT位移传感器的构成原理及特点
  12. spss导入Excel显示连接服务器超时,Excel里的日期在spss里怎么不正常显示
  13. 如何使用高德地图API
  14. 怎么理解“付费搜索广告应当与自然搜索结果明显区分”
  15. 怎么画学计算机的男孩形象,怎么一步一步教大班幼儿画自己的画像:小男孩简笔画(步骤图解)...
  16. 面试-android
  17. Android PAI (PlayAutoInstall)功能一些经验
  18. Get UWP Version(不使用额外的nuget包或SDK)
  19. KubeVela解读
  20. 预防XSS——后端HttpUtility.HtmlEncode,AntiXssEncoder.HtmlEncode方法;前端htmlencode,htmldecode,JavaScriptEncode

热门文章

  1. uni-app 配置 以及 使用微信云函数
  2. 《SQL Server 2008从入门到精通》--20180724
  3. 19张地图掀翻脑洞 还等什么快上车
  4. 当年也是翩翩少年,如今落得秃顶大叔,程序员秃顶算工伤吗?
  5. Redis集群——去中心化模式
  6. Xilinx SDK 中 的 'No rule to make target ' / '没有规则可以创建...'
  7. Nexus3 Recommended file descriptor limit is 65536 but count is 4096
  8. 联想电脑怎么录屏?这3个方法,轻松解决
  9. 笔记本html外接显示器,笔记本怎样外接显示器 笔记本外接显示器方法【详解】...
  10. 7-38 实验7_3_奇数偶数 (100 分)奇数偶数排序