历史上的今天
返回首页

历史上的今天

今天是:2025年05月07日(星期三)

正在发生

2021年05月07日 | STM32中断优先级概述

2021-05-07 来源:eefocus

一:综述


STM32 目前支持的中断共为 84 个(16 个内核+68 个外部),可以提供16 级可编程中断优先级的设置(仅使用中断优先级设置8bit中的高4位)和16个抢占优先级(因为抢占优先级最多可以有4位)。


二:优先级判断


STM32(Cortex-M3)中有两个优先级的概念——抢占优先级和响应优先级,其属性编号越小,则优先级别越高。有人把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。


具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。


当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之 后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他 们在中断表中的排位顺序决定先处理哪一个。


三:优先级分组

既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位在NVIC应用中断与复位控制寄丛器(AIRCR)的中断优先级分组域中,可以有8种分配方式:

所有8位用于指定响应优先级

最高1位用于指定抢占式优先级,最低7位用于指定响应优先级

最高2位用于指定抢占式优先级,最低6位用于指定响应优先级

最高3位用于指定抢占式优先级,最低5位用于指定响应优先级

最高4位用于指定抢占式优先级,最低4位用于指定响应优先级

最高5位用于指定抢占式优先级,最低3位用于指定响应优先级

最高6位用于指定抢占式优先级,最低2位用于指定响应优先级

最高7位用于指定抢占式优先级,最低1位用于指定响应优先级

这就是优先级分组的概念。

--------------------------------------------------------------------------------


Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位(AIRCR高四位),这4个寄存器位的分组方式如下:

第0组: 所有4位用于指定响应优先级

第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级

第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级

第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级

第4组:所有4位用于指定抢占式优先级

可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:

NVIC_PriorityGroup_0 => 选择第0组

NVIC_PriorityGroup_1 => 选择第1组

NVIC_PriorityGroup_2 => 选择第2组

NVIC_PriorityGroup_3 => 选择第3组

NVIC_PriorityGroup_4 => 选择第4组


中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的高四位分配各个优先级数字所占的位数。在一个程序中只能设定一次。


四:中断源的优先级

接下来就是指定中断源的优先级,中断源优先级是在中断优先级寄存器中设置的,只能设置及高四位,必须根据中断优先级分组中设置好的位数来在该寄存器中设置 相应的数值。假如你选择中断优先级分组的第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级,那么抢占式优先级就有000-111共八种 数据选择,也就是有八个中断嵌套,而响应优先级中有0和1两种,总共有8*2=16种优先级。


中断源优先级具体的设置了该中断源的优先级别


在一个程序中可以设定多个(最多16个)优先级,每个中断源只能设定的一个。


每写一个关于中断优先级的程序必须包含下列两个函数:


1)void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)中断分组设置


2)void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)中断优先级设置


注意:NVIC能配置的是16种中断向量,而不是16个,当工程中有超过16个中断向量时,必然有两个以上的中断向量是使用相同的中断种类,而具有相同中断种类的中断向量不能互相嵌套。


五:启动所需GPIOn_Pin及AFIO的RCC时钟


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,RCC_APB2Periph_AFIO,ENABLE);


注意:千万别忘记启动RCC_APB2Periph_AFIO!否则管脚只能做普通高低电平来用。当把GPIO用作EXTI外部中断或使用重映射功能的时候,必须开启AFIO时钟,而在使用默认复用功能的时候,就不必开启AFIO时钟了。


六:实例


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中断,若是两者任何一个中断正在执行,则等此 中断执行完,再去执行另一个中断。


NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn表示要配置的为EXTI的第5~9线的中断向量,也就是说EXTI5~EXTI9线是使用同一个中断向量的。这些可写入的参数可以在stm32f10x.h文件中查找到。


推荐阅读

史海拾趣

EG & G Inc公司的发展小趣事

EG & G Inc公司成立于20世纪早期,最初专注于电子设备的研发和生产。公司凭借其技术优势和创新能力,在电子行业中逐渐崭露头角。在成立初期,EG & G Inc就与多家知名企业和研究机构建立了合作关系,共同推动电子技术的发展和应用。这些合作关系不仅为公司带来了技术上的支持,也为其在市场上的扩张奠定了基础。

Display Elektronik GmbH公司的发展小趣事

Display Elektronik GmbH始终将产品质量放在首位。公司建立了严格的质量控制体系,从原材料采购到生产流程,再到成品检测,每一个环节都严格把关。这种对品质的坚持让Display Elektronik GmbH的产品在市场上赢得了良好的口碑,也为其赢得了众多知名客户的信赖。

Custom Mmic Design Services Inc公司的发展小趣事

CMDS深知技术创新是企业持续发展的关键。因此,公司不断加大研发投入,积极引进优秀人才和先进技术设备。通过持续的研发投入和人才培养,CMDS不断推出具有创新性和竞争力的新产品和解决方案。这些新产品不仅满足了客户不断变化的需求,也推动了整个行业的发展和进步。

Chiefdom Electronic Co Ltd公司的发展小趣事

在市场竞争日益激烈的情况下,Chiefdom Electronic Co Ltd注重创新营销策略,以吸引更多消费者的关注。公司推出了一系列具有针对性的广告宣传活动,利用社交媒体、网络直播等新媒体渠道进行广泛传播。同时,公司还积极参与各类电子展会和论坛,展示其最新技术和产品,与潜在客户建立联系。这些创新营销策略使得公司的品牌知名度和美誉度不断提升,进而带动了销售业绩的稳步增长。

Electromagnetic Industries Llp公司的发展小趣事

作为一家有社会责任感的企业,EMI公司不仅关注经济效益的增长,还积极履行社会责任。公司积极参与各种公益活动和社会救助行动,为灾区捐款捐物、支持教育事业等。同时,公司还注重环保和可持续发展,通过引进环保技术和设备、加强废弃物处理等措施降低生产过程中的环境污染。这些行动展现了EMI公司的良好企业形象和社会责任感。

CST Master Electronic Co Ltd公司的发展小趣事

随着公司规模的扩大和产品线的丰富,品质管理成为CST Master面临的一个重要问题。为了提升产品品质和客户满意度,公司引入了一套先进的质量管理体系,加强对生产过程的监控和检测。同时,公司还积极开展员工培训和质量意识教育,提升员工的品质意识和技能水平。这些措施有效地提升了产品品质和市场竞争力。

问答坊 | AI 解惑

经典的异步与同步清零D触发器Verilog表达

带异步清0、异步置1 的D 触发器module DFF1(q,qn,d,clk,set,reset);input d,clk,set,reset;output q,qn;reg q,qn;always @(posedge clk or negedge set or negedge reset)beginif (!reset) beginq <= 0; //异步清0,低电平有效qn <= 1;endelse ...…

查看全部问答>

在wince5.0中实现ipinip的问题!帮忙啊!!!谢谢大家了!

是这样的。我的东西需要加到另外一个公司的两个设备中间,他们又不告诉我们他们是怎么做的,他们自己的可以做到。 所以我们在他们能够做到的两边进行了数据的采集。发现,接受的数据是这样的结构:ip header1 + ip header2 + TCP header.然后发出 ...…

查看全部问答>

串口通信问题

at89S52  12M晶振 波特率为9600 发送为 1,2,3,4,5,6,7,8,9 串口助手显示为 81,82,83,84,85,86,87,88,89 请问各位赐教!…

查看全部问答>

高人见解: linux系统直接擦除块设备命令?

我的要求:直接写脚本在文件系统中操作开发板上的块设备,包括擦除和写入,以实现远程开发板升级 从网络搜索到的相似问题是:     eraseall /dev/mtd2     cp ../../fileName /dev/mtd2 我试了下.  CP倒是可以拷贝 ...…

查看全部问答>

招聘兼职C/C++,VC,Java软件工程师和硬件工程师

北京港震机电技术有限公司是注册于北京市中关村科技园中的一家高新技术企业,由中国地震局地震预测研究所的下属企业与香港企业共同合资建立。作为集产品研发、制造和提供系统解决方案的高科技实体,北京港震公司致力于数字化地震台网(台站)系统以及 ...…

查看全部问答>

我用的HP的Pocket PC,型号是hx2400,如何定制合适的SDK,高手请教教我。困扰了2天了。

我是个菜鸟,现在用EVC4.0开发PDA上的程序,目前有设备,但是没有相应的SDK,这就导致写好的程序无法在合适的环境下编译,我试着自己用PB建立SDK,但还是不行。从网上下载了微软的Pocket PC2003的SDK,但是装上后在EVC下的平台选择中没有该项。在网 ...…

查看全部问答>

累死我了,下午又整了一个程序……为了博客比赛不容易啊..

只好凑凑文章数了~~~~~~~~~如果要下载程序测试包,请点击:http://blog.ednchina.com/computer00/143918/message.aspx   在万利学习板自带的演示例程中,有几个USB的例程。如果我们想实现一个USB功能,可以拿里面的例子来改。& ...…

查看全部问答>

应该是40K的PWM为什么结果是20K?

有如下两个程序,RCC_Configuration用于配置Clock,Timer2_Configuration配置TIM2,能在A0管脚输出10K的PWM波形;把RCC_PCLK1Config(RCC_HCLK_Div4)改成RCC_PCLK1Config(RCC_HCLK_Div2),能输出20K的PWM波,符合期望;但是改成RCC_PCLK1Config(R ...…

查看全部问答>

stm32f103vbt6如何读取图片信息

请见各位 stm32f103vbt6芯片如何读取usb摄像头的图像信息 如何打包再发送出去啊 有相关程序吗 谢谢 可以发我邮箱ahlbzy@126.com…

查看全部问答>

F28335的I2C总线问题!

搞了三个星期了,I2C总线模块还是没搞通,参考了TI的例程,也没用,以前F2812时单用IO口模拟过I2C总线,自信对I2C总线协议比较清楚,但I2C寄存器值总是不对,郁闷中。。。。。。 有哪个大侠曾经搞过的,可否提些宝贵意见?…

查看全部问答>