STM32中断优先级和开关总中断开关

发布者:电子思维最新更新时间:2021-04-30 来源: eefocus关键字:STM32  中断优先级 手机看文章 扫描二维码
随时随地手机看文章

简介:STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。


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


一,中断优先级:


当两个中断源的抢占式优先级相同时:


1.这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。


2.如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;


3.如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。


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


如下:


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


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


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


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


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


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


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


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


这就是优先级分组的概念,在CM3中一共分8个组,GROUP0优先级最高,GROUP7最低,但是在后面讲到的STM32这块具体的芯片只实现了5个优先级分组,即简化了设计。


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


Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这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组


接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:


// 选择使用优先级分组第1组


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


// 使能EXTI0中断


NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);


// 使能EXTI9_5中断


NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);


要注意的几点是:


1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;


2)抢占式优先级相同的中断源之间没有嵌套关系;


3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。


二,开关总中断:


在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。


PRIMASK位:只允许NMI和hard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。


FAULTMASK位:只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。


在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。


下面两个函数等效于关闭总中断:


void NVIC_SETPRIMASK(void);


void NVIC_SETFAULTMASK(void);


下面两个函数等效于开放总中断:


void NVIC_RESETPRIMASK(void);


void NVIC_RESETFAULTMASK(void);


上面两组函数要成对使用,不能交叉使用。


例如:


第一种方法:


NVIC_SETPRIMASK(); //关闭总中断


NVIC_RESETPRIMASK();//开放总中断


第二种方法:


NVIC_SETFAULTMASK(); //关闭总中断


NVIC_RESETFAULTMASK();//开放总中断


常常使用


NVIC_SETPRIMASK(); // Disable Interrupts


NVIC_RESETPRIMASK(); // Enable Interrupts


关键字:STM32  中断优先级 引用地址:STM32中断优先级和开关总中断开关

上一篇:STM32 RTC 时钟简介
下一篇:基于USB/RS232的无线通讯终端系统的设计方案

推荐阅读最新更新时间:2024-10-22 20:29

STM32中断优先级开关中断开关
简介:STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 一,中断优先级: 当两个中断源的抢占式优先级相同时: 1.这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。 2.如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;
[单片机]
STM32中断优先级开关中断(很老很经典)
一、中断优先级: STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决
[单片机]
<font color='red'>STM32</font><font color='red'>中断优先级</font>和<font color='red'>开关</font><font color='red'>总</font><font color='red'>中断</font>(很老很经典)
STM32中断优先级开关中断
一,中断优先级: STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念 抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理
[单片机]
STM32中断优先级和库函数的 开、关中断
一,中断优先级: STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决
[单片机]
STM32中断(优先级,开关中断
一:综述 STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。 二:优先级判断 (一)中断优先级概念 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 (二)中断响应次序 (1)具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先
[单片机]
STM32关于开关中断的问题
NVIC 共支持 1 至 240 个外部中断输入(通常外部中断写作 IRQs)。 具体的数值由芯片厂商在设计芯片时决定。此外, NVIC 还支持一个“永垂不朽”的不可屏蔽中断(NMI)输入。NMI 的实际功能亦由芯片制造商决定。在某些情况下, NMI 无法由外部中断源控制。 在 STM32/Cortex-M3 中是通过改变 CPU 的当前优先级来允许或禁止中断。 异常掩蔽寄存器PRIMASK位:只允许 NMI 和 hard fault 异常,其他中断/异常都被屏蔽(当前 CPU 优先级=0,为可编程优先级中的最高优先级) 。 该寄存器可以通过 MRS 和 MSR 以下例方式访问: 1. 关中断MOV R0, #1
[单片机]
STM32开关中断
在 STM32/Cortex-M3 中是通过改变 CPU 的当前优先级来允许或禁止中断。 PRIMASK 位:只允许 NMI 和 hard fault 异常,其他中断/ 异常都被屏蔽(当前 CPU 优先级=0)。 FAULTMASK 位:只允许 NMI,其他所有中断/异常都被屏蔽(当前 CPU 优先级=-1)。 在 STM32 固件库中(stm32f10x_nvic.c 和 stm32f10x_nvic.h) 定义了四个函数操作 PRIMASK 位和 FAULTMASK 位,改变 CPU 的当前优先级,从而达到控制所有中断的目的。 下面两个函数等效于关闭总中断: void NVIC_SETPRIMASK(void);
[单片机]
stm32中如何开关中断
PRIMASK 与 FAULTMASK 特殊功能寄存器 PRIMASK用于除能在NMI和硬fault之外的所有异常,它有效地把当前优先级改为0(可 编程优先级中的最高优先级)。该寄存器可以通过MRS和MSR以下例方式访问: 1. 关中断 MOV R0, #1 MSR PRIMASK, R0 2. 开中断 MOV R0, #0 MSR PRIMASK, R0 还可以通过CPS指令快速完成上述功能: CPSID i ;关中断 CPSIE i ;开中断
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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