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 引用地址:NVIC中断优先级管理示例解析

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

推荐阅读最新更新时间:2024-11-11 12:03

STM32串口接收数据保存到数组——遇到问题及解决方法
遇到问题: PC端发送给stm32的字符串数据,只有最后一个字节被保存在数组的首地址,其他数据都丢失,而且数组中只有首地址有数据。 比如我用PC给stm32发送abcd,返回到PC串口助手的数据只有d,查看数组发现里面数据 。 解决方案: 错误的原因是,在中断服务函数中,每次来数据时,数组地址 t++ 的变量 t 被我定义成了局部变量,导致每次来中断时,t都被赋值为0,才导致只有数组首地址有数据,且之前的数据都被覆盖。 解决办法,把数组地址 t++ 的变量 t 定义为全局变量就ok了
[单片机]
<font color='red'>STM32</font>串口接收数据保存到数组——遇到问题及解决方法
STM32时钟选择
系统时钟的选择是在启动时进行,复位时内部8MHz的RC振荡器被选为默认的CPU时钟,随后可以 选择外部的、具失效监控的4~16MHz时钟;当外部时钟失效时,它将被隔离,同时会产生相应的中 断。同样,在需要时可以采取对PLL时钟完全的中断管理(如当一个外接的振荡器失效时)。 针对STM32F101基本型,具有多个预分频器用于配置AHB的频率、高速APB(APB2)和低速APB(APB1)区域。AHB和APB的最高频率是36MHz。
[单片机]
stm32在rt-thread上的RTC(实时时钟)
rt-thread中已经部分实现了rtc的内容 --- rtc.c ,调用rt_hw_rtc_init()函数即可使用msh设置date和time等 rtc时钟来源有三个: HSE, LSE, LSI, 实现如下: 在原RTC_Configuration(void)进行替换即可 /* Enable LSE */ #ifdef USE_LSE RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while ( (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) && (--count)
[单片机]
stm32 uart清除中断时机
今天遇到了在调试之前开发人员写的stm32程序时,发现uart1(即console)不能连续接收字符,一旦连续接收字符就会重启? 定位问题: 根据现状可以知道肯定是中断引起的问题,即第一个中断还没有处理完(中断标志位没有清除),第二个中断又来了,进而导致 重启现象。 修改前: void USART1_IRQHandler(void) { unsigned short temp; while(USART_GetITStatus(USART1, USART_IT_RXNE) == RESET); temp = USART_ReceiveData(USART1); if(temp == '\r') printf( \
[单片机]
STM32 PWM周期与频率的计算
STM32 PWM周期与频率的计算 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR 自动重装器的值 TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;
[单片机]
<font color='red'>STM32</font> PWM周期与频率的计算
stm32定时器(基本定时器)操作寄存器版
定时器本质 定时器的本质:计数器 定时器的构成:时钟源+计数器+重载值 1、stm32的定时器 stm32定时器数量较多、功能比较强;不同的定时器功能有不同。 stm32的定时器进行类型划分。分为三类:①基本定时器;②通用定时器;③高级定时器 基本定时器:用于定时器,还可以用于触发DAC(数模转换器)、ADC(模数转换器)工作。 通用定时器:具备基本定时器所有的功能;捕获输入、比较输出、捕获PWM波、生成PWM波、支持霍尔元件 高级定时器:具备通用定时器所有的功能:支持死区、刹车功能。 STM32F407的基本定时器有TIM6、TIM7. STM32F407的通用定时器有TIM2~TI
[单片机]
<font color='red'>stm32</font>定时器(基本定时器)操作寄存器版
STM32小白入门(第12天)-------I2C协议
一、概述 二、信号概念 三、AT24C02(EEPROM电可擦除ROM)--配合单片机存贮掉电前需要保存的数据,类似单片机的硬盘 1、写时序 2、读时序 思考题2:在24c02控制时钟的时候,为什么要进行5us的延时,小于5us延时或许大于5us的延时是否可以,示例代码如下: //设置SCL高电平 SCL=1; delay_us(5); //设置SCL低电平 SCL=0; delay_us(5); 回答:大于5us是可以的,如果使用5ms是可以的。但是延时是不能低于1.2us,详细描述如下图。 3、起始信号和停止信号 //sda输
[单片机]
<font color='red'>STM32</font>小白入门(第12天)-------I2C协议
STM32之 IP ICMP ETHERNET的实现
1.前言 嵌入式以太网开发是一个很有挑战性的工作。通过几个月的学习,个人觉得大致有两条途径。第一条途径,通过高级语言熟悉socket编程,例如C#或C++,熟悉bind,listen,connect,accept等函数,在嵌入式系统中应用 lwIP协议栈。第二种途径,通过分析嵌入式以太网代码,结合TCPIP协议栈规范逐步实践协议栈代码。第一种途径效率高,开发周期短,编写出来的代码性能稳定,第二种途径花的时间长,开发出来的代码功能不完善,但是由于紧紧结合TCPIP规范,可以了解的内容较多,适合学习。本文通过分析和修改AVRNET源码并移植到STM32平台,逐步实现TCPIP协议栈的各个子部分,包括ETHERNET部分,ARP部分,I
[单片机]

推荐帖子

炼狱传奇-同步计数器优化之战
本帖最后由梦翼师兄于2015-12-1416:45编辑 经过前面的学习,我想大家已经意识到计数器的重要性,可以这样说,在FPGA的设计中,计数器无处不在,有时候计数器的性能决定了一个项目的成败,所以在这里,我们分别比较三种计数器的性能,第一种综合工具自动综合出来的计数器,第二种是经过优化的计数器,而第三种就是使用IP核的计数器。在比较这三种计数器之前,我们首先来了解一下计数器的数学模型。计数器的数学模型:有位宽是N的同步计数器count:QN-1QN-2QN
梦翼师兄 FPGA/CPLD
简简单单学TI 多核DSP(4):多核DSP TMS320C6678的BOOT方式(二)
本文为作者发表于EEworld(bbs.eeworld.com.cn),未经EEworld许可,请勿转载。  前面主要是讲了C6678的总体的BOOT方式。这一讲,告诉大家C6678从上电复位后的BOOTLOADER的工作情况。  C6678的BOOT过程由COREPAC0执行。前面文章说到,C6678的BOOT方式有4种。上电复位,硬件复位,软件复位和局部复位。前面的3个复位模式是全局型的,影响到整个C6678。后者只是局部的复位,不会触发BOOT过程。  上电复位后
besk DSP 与 ARM 处理器
SparkFun Pro nRF52840 Mini 蓝牙键盘
本章我们将学习如是使用SparkFunPronRF52840Mini来快速构建一个HID设备蓝牙键盘。在开始之前,说一句题外话。不得不说这个nRF52840的Arduino库实在是太好用了,如果自己DIY的话,非常推荐购买这个芯片的单片机来DIY具有蓝牙功能的作品。在上章节我们已经详细的介绍了如何使用SparkFunPronRF52840Mini实现蓝牙数据的发送,那么本节我们看下如何基于上节的代码实现蓝牙键盘的功能正文本章提供的代码是一个演示使用n
御坂10032号 RF/无线
MSP430G2553 flash操作例子
/*实际适用于MSP430x2xx系列单片机,包含以下10个常用功能函数:(1)初始化。Flash_Init(unsignedcharDiv,unsignedcharSeg):依据SMCLK频率计算设定Flash的时钟的分频系数,靠Seg段号码确定计划操作的段起始地址。(2)整段擦除。Flash_Erase():段擦除函数。(3)读字节。Flash_ReadChar(unsignedintAddr):读取偏移地址Addr位置1个字节的数据。(4)读字。Flash
fish001 微控制器 MCU
LicheePi 4A开发板 debian12 系统无线网络ping 异常。
系统:开发板模式的debian12。问题:链接wifi后,ping提示如下错误。ping:socktype:sock_rawping:socketoperationnotpermittedping:=missingcap_net_raw+pcapabilityorsetuid解决方法:切换到root,suroot该权限,chmodu+s/bin/p
huanankx 玄铁RISC-V活动专区
LPC1500体验+之三_led闪烁
本帖最后由youzizhile于2014-7-2821:02编辑 自从安装驱动和更新debug镜像成功后,就迫不及待的设计程序。首先是下载最新的示例代码:参照蓝雨夜的帖子@蓝雨夜编译相应的程序生成chip_15xx_lib.lib和board_nxp_lpcepresso_1549.lib,然后设置periph_blinky为活动工程,但是编译时总是说board_nxp_lpcepresso_1549.lib无法打开或者文件不存在,尝试了很多次都是同样的问题,而chi
youzizhile NXP MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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