新闻中心

EEPW首页>嵌入式系统>设计应用> STM32中断优先级(默认和不默认情况)

STM32中断优先级(默认和不默认情况)

作者: 时间:2016-11-28 来源:网络 收藏

二,开关总中断:

在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__disable_irq (void);

void __disable_fault_irq (void);

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

void __enable_irq (void);

void __enable_fault_irq (void);

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

例如:

第一种方法:

PRIMASK 用于除能在NMI 和硬fault 之外的所有异常,它有效地把当前优先级改为0(可编程优先级中的最高优先级)。

void__disable_irq (void);//关闭总中断

void __enable_irq (void);//开放总中断

__set_PRIMASK(1);

__set_PRIMASK(0);

第二种方法:

FAULTMASK 更绝,它把当前优先级改为‐ 1 。这么一来,连硬fault 都被掩蔽了。使用方案与PRIMASK 的相似。但要注意的是,FAULTMASK 会在异常退出时自动清零。

void __disable_fault_irq (void); //关闭总中断

void __enable_fault_irq (void);//开放总中断

__set_FAULTMASK(1);

__set_FAULTMASK(0);

常常使用

void__disable_irq (void);//关闭总中断

void __enable_irq (void);//开放总中断

呵呵

上面说的可能大家看完之后第一感觉就是一头雾水,可能有点绕,下面我就结合自己的经验直白的谈谈STM32的中断优先级的、

含义和结合库函数的使用方法

库函数中提到的PreemptionPriority含义是抢占式优先级,subPriority含义是响应优先级,也叫亚优先级。何为抢占式优先级?

顾名思义,是指在抢占式优先级不同时,抢占式优先级高的可以中断抢占式优先级低的,也就是所谓的嵌套!相同的抢占式优先级之间是不可以中断嵌套的。打个比方,如果系统采用的是第4组优先级分组方式,就意味着所有的4位都被用来指定抢占式优先级,也就是说,这样一来抢占式优先级就有16个等级,通过你对需要的中断源进行中断优先级赋值,就可以实现你所希望的高优先级中断函数在低优先级中断函数未执行完之前就开始执行,即中断嵌套,该分组方式最多可以完成1个中断和15级嵌套。

通过上面我们知道抢占式优先级高的可以中断优先级低的,但是响应优先级跟抢占式优先级有什么联系呢?这里我就 打个可能不太形象的比喻,帮助大家理解一下,如果说抢占式优先级是某个等级的政府机关的话,那响应优先级就是这个政府机关里面的部门,政府机关权力有高低之分,同样每个部门之间也有权力大小之分。

下面的话语言我组织不好可能有点绕,但是大家一定要仔细看:

不同的政府机关(抢占式优先级)之间可以相互中断,但是同一个政府机关里面的不同部门(即抢占式中断优先级相同,响应优先级不同)之间不能相互中断,因为内部不能相互打架,即使响应优先级高的来了,如果此时有响应优先级低的中断服务程序正在执行,他一定要等到对方执行完之后才可以执行,但是要注意一点,虽然他不可以打断比他响应优先级低的中断服务函数,但是他有“插队”的特权,即当有多个相同抢占式优先级同时到来的时候,响应优先级高的虽然中断来的比较迟,但是他有优先执行的特权!问题又来了,如果抢占式优先级和响应优先级都相同的中断同时中断或是排队时孰先孰后呢,这就要看他们在中断向量表中的位置了,也就是说中断入口地址低的优先。

下面的问题大家就很容易理解了,不同的响应优先级不影响抢占式优先级,打个比喻就是权力高的政府机关中最烂部门说话都比权力低的政府机关中最好的部门说话好使。即权力高,可以抢断,嵌套

刚刚发现有些人把STM32的中断通道数和外部单片机引脚数混为一谈,中断通道数跟单片机引脚个数没有任何关系,目前M3内核无论多少引脚的单片机中断通道数都是84个,而无论引脚有多少个,这些引脚只占用6个通道,即0~4线分别占用一个通道,5~9线10~15线占用两个中断通道,一个中断通道可能对应很多外设


上一页 1 2 下一页

关键词:STM32中断优先

评论


技术专区

关闭