NVIC中断优先级管理示例解析

最新更新时间:2022-04-17来源: eefocus关键字:NVIC  中断优先级管理  STM32 手机看文章 扫描二维码
随时随地手机看文章

NVIC中断优先级管理

STM32中断优先级简介

NVIC的缩写是“嵌套向量中断控制器(Nested Vectored Interrupt Controller)”。


如何管理中断?

STM32中断优先级管理采用“响应优先级和抢占优先级”结合的方法,并且进行了中断分组。

以第1组为例:1bit抢占优先级说明抢占优先级共有两级,3bits响应优先级说明响应优先级共有8级。我们可以看到无论如何分组,中断优先级总有16种。


什么是“抢占优先级”和“响应优先级”呢?

抢占优先级和响应优先级都是区分那个中断优先进行的标志,但是两者的含义去不尽相同。


抢占优先级从名字上就比响应优先级霸气一些,因此抢占优先级起决定作用,当抢占优先级相同时,响应优先级高的才会优先发生。


优先级是如何定义的?

值越小,优先级越大。


例如:假定设置中断优先级组为2,然后设置中断3(RTC中断)的抢占优先级为2,响应优先级为1。  中断6(外部中断0)的抢占优先级为3,响应优先级为0。中断7(外部中断1)的抢占优先级为2,响应优先级为0。


优先级顺序:中断7>中断3>中断6


结论:抢占优先级高的必定先抢占中断,如果抢占优先级相同,那就看响应优先级,此时谁的响应优先级高,谁就先发生。


除此之外,如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个,排序越考上,中断越优先。中断向量地址可以参考“STM32中文参考手册->中断->中断异常向量”部分的内容。部分示例:

特别说明

一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。


函数介绍

在操作函数的底层中,我们一般只用到ISER、ICER、IP这3个寄存器。ISER用于使能中断,ICER用来清除中断,IP用来设置中断优先级。


中断优先级分组选择函数

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

我们选择的是按照组2的方式进行分组,即抢占优先级总数为4级(0-3),响应优先级总级数为4级(0-3)。我们可以看到无论如何分组,中断优先级总有16种。

对于每个中断怎么设置优先级?

NVIC_InitTypeDef NVIC_InitStructure;  

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  // 2<3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //3<=3

NVIC_Init(&NVIC_InitStructure);  

 


如何理解中断挂起与解挂的含义?

中断的挂起与解挂针对的是中断标志位,也可以叫做允许中断发生的位。


获取中断状态的函数

函数原型

 

static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn);

函数应用

uint32_t IterruptFlag = NVIC_GetPendingIRQ(USART1_IRQn);

 

// 这个函数获取了串口1中断的状态

清除/设置中断标志位的函数

函数原型

 

static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn);

 

static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)

 

函数使用

 

NVIC_SetPendingIRQ(USART1_IRQn);

 

NVIC_ClearPendingIRQ(USART1_IRQn);

针对于中断标志位的操作有什么用?

1、一般来说单片机的中断发生有两个条件,一是中断标志位置位,二是中断允许,如果这两个条件都满足则进入中断,因为正常情况下中断一直是允许的,那么只能通过标志位来区分是否有中断挂起;


2、如果进入中断不清除标志位,那么这一中断服务程序结束后由于标志位还是置位的并且中断是允许的,那么还会再次进入该中断,就会发生一直在执行中断程序的情况。


举例说明

在A中断中设置B中断的中断标志位为1,那么当B中断条件满足时,B中断可以发生,但是如果清除A中B中断标志位,那么无论是否满足触发B中断的条件,A中断中永远不可能执行B中断,因为中断发生的条件是:“中断标志位有效+中断条件满足”。

关键字:NVIC  中断优先级管理  STM32 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic566811.html

上一篇:STM32中的串口通信的基础知识
下一篇:端口的复用和重映射实例解析

推荐阅读

Arduino_Core_STM32---pinMode()实现分析
pinMode()定义Arduino平台的易于使用性主要就体现在屏蔽的大量底层细节的实现,对于该函数来说也不例外。虽然该函数只有两个参数(arduino引脚号和模式),但这两个参数需要多层的映射才能转化为具体适合STM32芯片的配置信息,并调用底层接口完成配置。从下面源码中可以看出主要由两个函数来完成引脚模式配置的:digitalPinToPinName()和pinfunction()。在具体深入下面两个函数之前我们需要一些预备知识—该库对于STM32硬件端口和引脚的封装。void pinMode(uint32_t ulPin, uint32_t ulMode){ PinName p = digitalPinToPinName(ul
发表于 2022-08-11
vscode搭建STM32开发环
需要安装的软件vscode必装插件:C/C++:用于提供高亮显示和代码补全Cortex-Debug:用于提供调试配置makemake工具可以直接下载xPack项目提供的windows-build-tools工具里面带了make工具。Release xPack Windows Build Tools v4.2.1-2 · xpack-dev-tools/windows-build-tools-xpack (github.com)openocdarm-none-eabistm32CubeMX上述软件具体的安装教程网上有很多详细的介绍资料,这里就不详细介绍了。需要注意的是记得将make,openocd,arm-none-eabi等可执行程
发表于 2022-08-11
STM32_USB_CDC学习笔记
USB虚拟串口的接收方式:USB 虚拟串口的接收采用中断方式,芯片在接收到数据后回触发中断调用CDC_Receive_FS()函数来处理接收到的数据.USB虚拟串口一次最多接收64个字节的数据,如果收到的数据大于64个字节则会连续多次调用CDC_Receive_FS()函数来处理接收到的数据.问题:每次下载完成程序后,必须重新插拔USB线,PC才能识别到串口设备?解决方法:在每次USB初始化之前,配置USB的两个引脚拉低几个ms,即可让PC重新枚举该USB设备.函数功能USB发送USBD_CDC_SetTxBuffer()和USBD_CDC_TransmitPacket()函数是启动数据发送过程的一组函数,要成对使用.USBD_CD
发表于 2022-08-11
关于STM32定时器中TI1FP1 与TI1FP2及相关话题
整体来讲,STM32各个系列的TIMER外设基本框架和功能是类似的,大体分高级定时器、通用定时器和基本定时器。除了基本定时器外,每个高级定时器或部分通用定时器都可以产生4对中间信号,分别是TI1FP1与TI1FP2,TI2FP1与TI2FP2,TI3FP3与TI3FP4,TI4FP3与TI4FP4,即每个输入通道可以生产1对信号。这里以STM32F103系列为例聊聊T这个TImFPn,。在SMT32各系列的参考手册的定时器部分,在描述高级定时器或通用定时器时都可以看到如下的一副图。图中对那4对信号被清晰地描绘了出来。这四对信号可以统一写为:TImFPn,其中m代表滤波和边沿检测器前的输入通道号,n代表经过滤波和边沿检测器后将要接入或
发表于 2022-08-11
关于<font color='red'>STM32</font>定时器中TI1FP1 与TI1FP2及相关话题
STM32编码器模式详解(一)---理论
一、编码器接口模式选择编码器接口模式的方法是:如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS=001;如果只在TI1边沿计数,则置SMS=010;如果计数器同时在TI1和TI2边沿计数,则置SMS=011。通过设置TIMx_CCER寄存器中的CC1P和CC2P位,可以选择TI1和TI2极性;如果需要,还可以对输入滤波器编程。两个输入TI1和TI2被用来作为增量编码器的接口。参看表77,假定计数器已经启动(TIMx_CR1寄存器中的CEN=’1’),计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动。TI1FP1和TI2FP2是TI1和TI2在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则TI1
发表于 2022-08-11
<font color='red'>STM32</font>编码器模式详解(一)---理论
STM32驱动超声波模块测距
HC-SR04超声波测距模块可提供2cm到400cm的非接触式距离感测功能,测距精度可达3mm。一、基本工作原理(1)给TRIG引脚至少10us的高电平信号触发测距。(2)模块自动发送8个40KHz的方波,自动检测是否有信号返回(3)有信号返回,通过Echo引脚输出一个高电平,高电平的持续时间就是超声波从发射到返回的时间。(4)测量距离 = (高电平的持续时间 * 声速(340m/s))/ 2。二、接线三、模块时序图四、驱动程序在了解了上述内容后,我们便可以根据上述知识便可以编写驱动程序了。触发信号Trig很简单直接通过IO输出和延时给一个大于10us的高电平即可触发。Echo引脚需要接收并记录高电平的持续时间,大致有3种实现的思路
发表于 2022-08-11
<font color='red'>STM32</font>驱动超声波模块测距

推荐帖子

RX8025中文资料(时钟芯片)
RX8025中文资料(时钟芯片)RX8025中文资料(时钟芯片)
single 单片机
FPGA的技术介绍及fpga应用领域
FPGA的技术介绍及fpga应用领域 FPGA简介   FPGA(FieldrogrammableGateArray)于1985年由xilinx创始人之一RossFreeman发明,虽然有其他公司宣称自己最先发明可编程逻辑器件PLD,但是真正意义上的第一颗FPGA芯片XC2064为xilinx所发明,这个时间差不多比摩尔老先生提出著名的摩尔定律晚20年左右,但是FPGA一经发明,后续的发展速度之快,超出大多数人的想象,近些年的FPGA,始终引领先进的工艺。   fpga的优势   
雷北城 EE_FPGA学习乐园
电路电流突然下降
请教大家一个问题,单片机运行过程中会出现电流突然下降的情形,不知道怎么回事。比如正常工作时是0.06A,工作过程中会降到0.04A。 电路电流突然下降
emily_1105 单片机
PHILIPS单片16-32位LPC2210.pdf
PHILIPS单片16-32位LPC2210同样的是一个系列的单片机是和前面介绍的是一样的不过是不同的芯片PHILIPS单片16-32位LPC2210.pdf
rain 测试/测量
CETK下编译camera时kato.lib的问题
BUILD:[01:0000000117:ERRORE]kato.lib(kato.obj):errorLNK2019:unresolvedexternalsymbolXMLGetCommentStringWreferencedinfunction"public:int__cdeclCKato::BeginLevelV(unsignedlong,unsignedshortconst*,char*)"(?BeginLevelV@CKa
wangdian2010 嵌入式系统
请问这个应该是串联型稳压电路吧
这里主要就是两个问题,:1)R150的2Ω以及R151的300Ω怎么计算得来的?还是经验值?300Ω是不是只是给稳压管BZX84-B13限流使用的?2)三极管Q150在电路中导通时,处于放大状态还是饱和导通状态?最后输出的12VB是不是就是稳压管电压决定的?R150和R151之间的对地电压是不是就已经是稳压值13V左右了,即三极管的集电极?3)大概简述一下工作过程:输出电压升高时,由于稳压管存在,三极管基极电压不变,Ube减小,达不到三极管开通条件后
西里古1992 模拟电子
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved