datasheet

STM32学习之:NVIC的初步理解

2018-10-21来源: eefocus 关键字:STM32学  NVIC  初步理解

1  对NVIC的理解

      CM3支持硬件中断嵌套,分为抢占式优先级和亚优先级,使用规则主要有,抢占优先级高级别的可以打断低级别的,同一级别的抢占优先级同时发生时,亚当优先级高的先发生中断,若是相同,则按硬件排列顺序发生。若是有一个亚优先级正在执行中断,同一级别的其它亚优先级发生时,则先挂起,等此中断执行完再执行!

     从库函数中找到优先级分组模式:

#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /* 0 bits for pre-emption priority

                                                          4 bits for subpriority */

#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /* 1 bits for pre-emption priority

                                                          3 bits for subpriority */

#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /* 2 bits for pre-emption priority

                                                          2 bits for subpriority */

#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /* 3 bits for pre-emption priority

                                                          1 bits for subpriority */

#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /* 4 bits for pre-emption priority

                                                          0 bits for subpriority */

从中可以看出第一组只有一个级别,16个亚优先级,我可以这样理解,若是分配成这个组里,不能发生嵌套中断,同时发生中断时,亚优先级高的先发生,若有中断执行时,必须等中断执行完才能执行下一个中断。最后一组正好相反,有15个级别,若是执行一个中断,可以最多嵌套15个中断执行一个中断。看下面的例子:

  NVIC_InitTypeDef    NVIC_InitStructure;  //定义中断初始化类型结构体变量

  

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);   //配置优先级分组1 2个两个抢占优先级 8个亚优先级

  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //开口外部中断0

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置0号抢占式优先级  

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//亚优先级配置为0号

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道

  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置


  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //开口外部中断5到9

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级  

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亚优先级配置为1号

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道

  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置


  NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; //ADC1中断

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级  

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亚优先级配置为1号

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道

  NVIC_Init(&NVIC_InitStructure);     //对外部中断0进行初始化配置


从上面的配置来看,外部中断0的优先级最高,可以打断ADC和外部5到9的中断,也就说可以嵌套发生,当ADC中断和外部5到9中断同时发生时,它们的抢占优先级别相同,亚优先级别也相同,因为ADC1硬件排在更靠前,则先发生ADC中断,若是两者任何一个中断正在执行,则等此中断执行完,再去执行另一个中断。


关键字:STM32学  NVIC  初步理解

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/2018/ic-news102141959.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32学习之:USART中断方式
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32学习之定时器调试总结

通用定时器调试老是失败原因总结: 调试了两天终于找到错误根源: 错误程序: TIM3->DIER=1<<0;   //中断使能寄存器(TIMx_DIER)位0置位,允许更新中断 TIM3->DIER=1<<6;       //允许触发中断 正确程序: TIM3->DIER|=1<<0;         TIM3->DIER|=1<<6; 错因:执行TIM3->DIER|=1<<6;时TIM
发表于 2016-08-01

【STM32电机方波】记录2——NVIC中断基本设置

NVIC概念:提供中断控制器,用于总体管理异常,称之为“内嵌向量中断控制器”。简单来说,就是MCU提供、处理内部中断的模块。NVIC库函数:中断优先级:在配置NVIC之前得弄懂一个概念:中断优先级,即中断的执行顺序。中断优先级中,分为抢占式优先级(先占优先级)和响应优先级(从优先级)。抢断优先级,顾名思义,能再别人中断是抢占别人中断,实现中断嵌套。响应优先级则只能排队,不能抢在前面插别人的对,即不能嵌被嵌套。STM32中指定优先级的寄存器为4位,其定义如下:第0组:所有4位用于指定响应优先级  NVIC_PriorityGroup_0 => 选择第0组第1组:最高1位用于指定抢占式优先级,最低
发表于 2018-09-22
【STM32电机方波】记录2——NVIC中断基本设置

stm32f407之NVIC

五、NVIC       中断向量嵌套控制器是用来管理所有中断和事件的,包括中断的使能和除能,中断的优先级。这个是属于内核的东西,所以ST的参考手册上对它的描述较少,但他又是十分重要的东西,要了解它就要看ARM的《Cortex™-M4 Devices Generic User Guide》。 相关寄存器译自《Cortex™-M4 Devices Generic UserGuide》,若有错误,请以原文为准。 中断使能寄存器NVIC_ISER[8]中断使能寄存器共有8个,ISER[0]设置0~31号中断的使能,ISER[1]设置32~63号中断的使能
发表于 2018-09-20
stm32f407之NVIC

STM32中NVIC_SystemReset()函数的作用?什么时候用?

STM32软件复位有两种方式(1)方式一:NVIC_SystemReset()函数用来复位STM32.注意1:从SYSRESETREQ 被置为有效,到复位发生器执行复位命令,往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把FAULTMASK置位。需要加上这句:__set_FAULTMASK(1);意思是关闭所有中断的意思,目的是在执行NVIC_SystemReset()复位函数过程中不被中断所打断。两个函数执行后系统复位重新执行代码,包括之前所配置好的外设寄存器也都回到复位状态。如下:__set_FAULTMASK
发表于 2018-09-13

STM32中EXTI和NVIC的关系

(1)NVIC(嵌套向量中断):NVIC是Cortex-M3核心的一部分,关于它的资料不在《STM32的技术参考手册》中,应查阅ARM公司的《Cortex-M3技术参考手册》Cortex-M3的向量中断统一由NVIC管理。(2)EXTI(外部中断):EXTI是ST公司在其STM32产品上扩展的外中断控制。它负责管理映射到GPIO引脚上的外中断和片内几个集成外设的中断(PVD,RTC alarm,USB wakeup,ethernet wakeup),以及软件中断。其输出最终被映射到NVIC的相应通道。因此,配置EXTI中断的过程必然包含对NVIC的配置,例如下面配置EXTI0的过程,就要首先配置EXTI控制器(使能相应的中断
发表于 2018-09-11

stm32NVIC与外部中断

。 使用外部中断需要准备的工作如下:1、初始化IO口为输入。这一步设置你要作为外部中断输入的IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。2、开启IO口的复用时钟。3、开启与该IO口相对应的线上中断/事件,设置触发条件。4、配置NVIC,并使能中断。5、编写相应中断函数。  下面是main.c文件源码 //main.c#include "stm32f10x.h"
发表于 2018-05-30
stm32NVIC与外部中断

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved