中断和NVIC详解

  • 1,什么是中断?
  • 2,中断、异常、事件三者的区别
  • 3,中断由谁管理?NVIC
    • 中断优先级
    • 中断相关函数
  • 4,外部中断使用示例

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);//配置EXTIEXTI_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);
}

STM32-中断优先级管理NVIC详解相关推荐

  1. STM32开发 -- 低功耗模式详解

    很多单片机都有低功耗模式,STM32 也不例外.当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗. 这部分不是我负责,但是也是有必要看一下的. 参看: STM32F1开发指南-库函数版本_ ...

  2. 如何用c语言编写stm32的程序吗,STM32入门C语言详解

    <STM32入门C语言详解>由会员分享,可在线阅读,更多相关<STM32入门C语言详解(6页珍藏版)>请在人人文库网上搜索. 1.最新 料推荐阅读 flash : 芯片内部存储 ...

  3. STM32—— AHB、APB详解

     STM32-- AHB.APB详解 2016-07-14 20:35 590人阅读 评论(0) 收藏 举报 本文章已收录于: 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.概括 首先 ...

  4. stm32项目平衡车详解(stm32F407)下

    stm32项目平衡车详解(stm32F407)下 本文章学习借鉴于创客学院团队,以表感谢.教学视频 B站学习地址 HC-SRO4 超声波测距避障功能开发 TSL1401 CCD摄像头实现小车巡线功能 ...

  5. 创建emp表 oracle,Oracle中创建和管理表详解

    Oracle中创建和管理表详解 更新时间:2013年08月01日 15:44:16   作者: 以下是对Oracle中的创建和管理表进行了详细的分析介绍,需要的朋友可以过来参考下 SQL> /* ...

  6. Spring事务管理(详解+实例)

    写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: ...

  7. NLB网路负载均衡管理器详解

    原文:NLB网路负载均衡管理器详解 序言 在上一篇配置iis负载均衡中我们使用啦微软的ARR,我在那篇文章也中提到了网站的高可用性,但是ARR只能做请求入口的消息分发服务,这样如果我们的消息分发服务器 ...

  8. STM32开发 -- 蓝牙开发详解(2)

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/100708695 接着 STM32开发 – 蓝牙开发详解(1) 这一篇接着讲. 看了好久好 ...

  9. STM32开发 -- 低功耗模式详解(2)

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/98631012 上一篇文章 STM32开发 – 低功耗模式详解(1) 简单的总结了一下低功 ...

最新文章

  1. 核逼近(Kernel Approximation)
  2. 密码技术应用--SM4文件加解密
  3. iis 改了php ini不生效,Windows IIS 集成PHP时修改PHP.ini 配置后不生效问题
  4. ecshop根目录调用_ecshop列表页 调用二级分类教程
  5. .NET Core + Consul 服务注册与发现
  6. 一、OpenStack架构
  7. CPU上跑深度学习模型,FPS也可以达100帧
  8. react 轮播组件
  9. Linux/Unix操作系统目录结构的来历
  10. linux 下的绘图软件Visio
  11. 【CC2640R2F】香瓜CC2640R2F之LCD
  12. 翻译如重构,期待您的单元测试
  13. css切割图片是什么,两种方法实现css切割图片,只取图片中一部分
  14. 反步法设计步骤及仿真验证(非线性系统)
  15. 【读点论文】Image Style Transfer Using Convolutional Neural Networks(将卷积特征图提取语义信息,融合内容和风格的做法)
  16. 怎样防止苹果系统更新_苹果xs换过原装屏幕可以更新14系统吗?
  17. ThinkPHP3.2.3 where注入
  18. C语言:va_list的用法
  19. YOLOv4---(详解各种trick)
  20. 如何用git将项目代码上传到github

热门文章

  1. C# fileSystemWatcher类的Changed事件触发多次解决办法
  2. 我这样来管理电脑 软件安利
  3. 流动舞台车改装设计(说明书+任务书+开题报告+评分表+cad图纸)
  4. undefined reference to winmain
  5. 机器学习与网络信贷那些事
  6. dr5 mac汉化版美容修饰ps插件
  7. In aggregated query without GROUP BY是什么错误
  8. 工业互联网不能没有“数据智能”心
  9. java 比例 分配_JAVA 按比例分配
  10. keil4c语言和汇编混合,keil C语言与汇编语言混合编程