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中断,因为中断发生的条件是:“中断标志位有效+中断条件满足”。
上一篇:STM32中的串口通信的基础知识
下一篇:端口的复用和重映射实例解析
推荐阅读最新更新时间:2024-11-11 12:03
推荐帖子
- 炼狱传奇-同步计数器优化之战
- 本帖最后由梦翼师兄于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
设计资源 培训 开发板 精华推荐
- 使用 Diodes Incorporated 的 AZ317L 的参考设计
- LT1070 限流器的典型应用
- 使用 Analog Devices 的 LT124XMJ8 的参考设计
- 使用 Aimtec 的 AM2M-0512D-NZ 的参考设计
- LT1070 正向转换器的典型应用
- 使用 Infineon Technologies AG 的 IRU1205 的参考设计
- YugenFlow v2:紧凑、易于使用、低功耗、双向、尊重隐私的热检测传感器
- 使用 Microchip Technology 的 MIC29201-12BU 的参考设计
- 用于仪表的 16 位、160MSPS ADC
- DC2052A,使用 LTC3880EUJ 三相降压 DC-DC 控制器和电源系统管理的演示板