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中的串口通信的基础知识
下一篇:端口的复用和重映射实例解析

推荐阅读最新更新时间:2023-12-04 14:37

STM32的端口复用和重映射
什么是端口复用? STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。 例如: 串口1的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作GPIO,而用做复用功能串口1的发送接收引脚的时候,叫端口复用。 复用功能的配置: 以下端口复用配置过程以PA9,PA10配置为串口1为例GPIO端口时钟使能。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 复用外设时钟使能。比如你要将端口PA9,PA10复用为串口,所以要使能串口时钟
[单片机]
<font color='red'>STM32</font>的端口复用和重映射
RS485通讯中使用STM32串口以DMA方式发送数据丢失字节的问题
1、开发平台 计算机操作系统:WIN7 64位; 开发环境:Keil MDK 5.14; MCU:STM32F407ZET6; STM32F4xx固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0; 串口调试助手; 2、问题描述 在测试用STM32F4xx芯片的串口USART1以DMA方式进行RS485收发通讯时,出现数据字节丢失的现象,一般丢失1~2个字节。 出现问题时测试的简单收发机制:使能串口USART1的DMA收发功能,开启了DMA发送完成中断和USART1空闲中断。通过串口调试助手发送N个字节给MCU,当MCU产生USART1空闲中断时,在USART1空闲中断服务
[单片机]
RS485通讯中使用<font color='red'>STM32</font>串口以DMA方式发送数据丢失字节的问题
STM32学习记录——开发总流程
前期准备 建立标准库模板 步骤: 1、STM官网下载标准库(STM32F10x_StdPeriph_Lib_V3.5.0),解压打开之后 有用的就是Libraries文件夹和Project文件夹,复制相关文件,建立模板。 此文件夹就是工程模板,其中 CMSIS、STM32F10x_StdPeriph_Driver是复制官方Libraries文件夹下的 user中是Project文件夹的 lst放置listing文件 out放置输出文件,即相应的.hex文件 project放置工程文件。 2、新建工程 工程中文件的排版如图 开发流程 1、复制工程模板 2、在user下添加.c文件和.h
[单片机]
<font color='red'>STM32</font>学习记录——开发总流程
STM32串口USART配置、发送与接收
一、配置时钟:GPIO时钟、串口时钟、复用引脚时钟 二、配置GPIO结构体 三、配置串口结构体 //串口初始化示例 void usart_init(void) { //创建结构体 GPIO_InitTypeDef gpioinitStructure; USART_InitTypeDef usartinitStructure; NVIC_InitTypeDef NVICinitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置时钟 RCC_APB2PeriphClockCmd(RCC_APB2Pe
[单片机]
<font color='red'>STM32</font>串口USART配置、发送与接收
STM32 串口采用DMA方式收发
什么是DMA —- Directional Memory Access, 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作 我们通过以下几方面学习串口DMA: 一、如何理解DMA 对于DMA,打个比方就很好理解: 角色预设: 淘宝店主 —- STM32 MCU 快递员 —- 外设(如UART,SPI) 发货室 —- DMA 1、首先你是一个淘宝店主,如果每次发货收货都要跟快递沟通交涉会很浪费时间和精力。 2、然后你就自己建了一个发货室,发货室里有好多个货柜箱子,每个箱子上都写着快递名字(如果申通快递,顺丰
[单片机]
stm32学习笔记之问题总结
  1、 SYSCLK时钟源有三个来源:HSI RC、HSE OSC、PLL;   2、 MCO 可以提供4源不同的时钟同步信号;   3、 GPIO口貌似有两个反向串联的二极管用作钳位二极管;   4、 总线矩阵采用轮换算法对系统总线和DMA进行仲裁   5、 ICode总线,DCode总线、系统总线、DMA总线、总线矩阵、AHB/APB桥   6、在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟   7、数据字节以小端存储形式保存在存储器中   8、 内存映射区分为8个大块,每个块为512MB   9、 FLASH的一页为1K(小容量和中容量),大容量是2K。   10、 系统存储区(System
[单片机]
<font color='red'>stm32</font>学习笔记之问题总结
STM32外部中断之二
STM32 外部中断配置 1配置中断 1、 分配中断向量表: /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 2、 设置中断优先级: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置中断优先级 3、 初始化外部中断: /*允许EXTI4中断 */ NVIC_InitStructure.NVIC_IRQChann
[单片机]
STM32标准库和HAL库有什么不同 我们怎么用
摘要:通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。 网上关于标准库、HAL库的描述相信是数不胜数。可是一个对于很多刚入门的朋友还是没法很直观的去真正了解这些不同开发发方式彼此之间的区别,所以笔者想以一种非常直白的方式,用自己的理解去将这些东西表述出来,如果有描述的不对的地方或者是不同意见的也可以大家提出。 一、配置寄存器不少先学了51的朋友可能会知道,会有一小部分人或是教程是通过汇编语言直接操作寄存器实现功能的,这种方法到了STM32就变得不太容易行得通了。 因为STM32的
[单片机]
<font color='red'>STM32</font>标准库和HAL库有什么不同 我们怎么用

推荐帖子

坛子里有用过国产dsp的吗,有推荐吗?
遇到网友让帮忙推荐国产DSP,脑海一片空白,只记得之前编辑部的同事,说过一家risc-vdsp当时找工程师评估反馈:板卡设计的有点乱,看图应该是没集成仿真器,可能不是很理想所以就没弄来测评,话说,国产dsp坛子里有推荐吗?网友的需求是这样的:坛子里有用过国产dsp的吗,有推荐吗?
nmg 国产芯片交流
《STM32+WIFI+Linux+安卓智能控制开发板应用手册》
本帖最后由微云电子于2014-9-1119:34编辑 购买的一套STM32+Linux+安卓智能控制开发板,这是一款带wifi和安卓客户端APP源码的STM32收费开发资料,光盘自带的开发文档还不错,希望对大家有用,贡献出来做方案参考,希望对大家有帮助。受限于上传文件大小,完全版本请加群下载全部资料,新手发帖不熟悉,需要完整资料包的留下邮箱。《STM32+WIFI+Linux+安卓智能控制开发板应用手册》
微云电子 单片机
【学习心得+MCU】TIVA C Launchpad 学习分享
TIVACLaunchpad这个小板还是不错的。本人手中的板子型号是LM4F120XL开发板,板子上有个三色LED灯,在LM4F开发板上,TI在设计中用了三个三极管来提高R-G-B三色LED灯的亮度,在做闪灯指示时,亮度非常好。LM4F120XLaunchPad,这个是原来LM系列时候的名称,现在已经更改为TIVA系列,芯片名称统一用TM4C编码,感觉还是有些乱,不如统一起来用TM4C更好。这个TM4CM4芯片主要面向3C(Connectivity、Communicate和Con
fengye5340 微控制器 MCU
ds1302电路的问题
电路图如下所示,接上之后,数码管显示乱码,而且是静止不动的。奇怪的是我用万用表量6口的电压是,时钟正常显示了,而且走动看起来是准的。一松开万用表,就又成乱码了。这个是什么原因呢。ds1302电路的问题
kingvenlee 51单片机
菜鸟提问,用什么软件把bootrom引导程序烧录到ROM中。
刚接触VXWORKS,有一快2410,里面的引导程序是LINUX的,用什么软件把bootrom程序烧录到2410上,谢谢。菜鸟提问,用什么软件把bootrom引导程序烧录到ROM中。
shiftwu 嵌入式系统
【得捷电子Follow me第2期】番茄日历钟
一、介绍视频====== (http://training.eeworld.com.cn/video/38470)二、项目总结======笔者是一个智能家居爱好者,玩过HomeAssistant、ESPHome、Tasmota等平台,并使用过ESP8266、ESP32自已DIY设备。通常我只使用现有平台进行配置,很少直接编写硬件代码。非常感谢DigiKey和EEWORLD举办的Followme活动,让我有机会玩转智能设备的底层代码。和大部分同学一样,我选择了Circ
ltpop DigiKey得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

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

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

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