正点原子STM32F4中断优先级管理(10)qq860099671

今天讲解,STM32F4开发指南   STM32F4中文参考手册,f4只使用了其中的一部分中断可以找到F4的中文参考手册第10节

有一个表格STM32F405XX和STM32F407XX和STM32F415XX/17XX的向量表 有0-81个可屏蔽中断

如何管理这几十个中断?就是利用NVIC ,首先看一下中断优先级分组,分组就是利用SCB->AIRCR中断配置,设置他的8-10位来设置中断优先级分组。设置了分组之后,就确定了  抢占优先级和相应优先级,每一个中断都有一个IP寄存器,这个IP寄存器的低位是4-7,当我们利用AIRCR设置好分组后他的IP寄存器也就配置好了。

这里有个问题 这么分组有什么意义?抢占优先级和响应优先级是干什么的,一般中断优先级分组只设置一次,设置了分组之后,我们也就确定了一个系统当中他的抢占优先级和 响应优先级的分配 情况。比如我们设置了分组2那么就意味着有2个位可以设置他的抢占优先级  有2个位可以设置他的响应优先级.。

 接下来讲解一下什么是抢占优先级?  什么是响应优先级?

高优先级的抢占优先级可以打断正在进行的低抢占优先级的中断

举个例子 我们设置AIRCR的分组为2,那么对于A/B中断,A可以有2位抢占优先级,2位响应优先级,B也可以有2位抢占优先,2位响应优先级,数值越低代表他们的级别越高。比如A的抢占优先级我们设置为0,B的抢占优先级设置为1。那么就是说明他们的抢占优先级是不一样的,并且A比B高。那么如果说B的中断正在执行,此时发生了A中断那么它是可以打断B的中断,先去执行A中断,等A中断执行完之后再去执行B中断。

抢占优先级相同的中断,高响应优先级不可以打断低响应优先级中断:

扫描二维码关注公众号,回复: 3270646 查看本文章

比如说A中断和B中断他们的抢占优先级都是一样的,A的响应优先级是0,B的响应优先级是1,。当B正在执行,A中断发生,那么A中断是不能打断B中断的。但是如果说A和B同时发生,那么在他们抢占优先级相同的前提下,谁的响应优先级越高谁就先执行。 如果说两个中断的抢占优先级不一样,响应优先级一样,那么就先执行抢占优先级高的。

如果两个中断的抢占优先级和响应优先级都是一样的那么哪个先发生就先执行哪个。

举例:

假设设置中断优先级分组为2,然后设置中断3(RTC中断)的抢占优先级为2,响应优先级为1.

中断6(外部中断0)的抢占优先级为3,响应优先级为0.

中断7(外部中断1)的抢占优先级为2,响应优先级为0.

那么这3个中断的优先级顺序为:中断7>中断3>中断6

特别说明

一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序会发生意想不到的执行结果。在misc.h有一个中断优先级分组函数

void NVIC_PriorityGroupCofing();

上面这个 函数设置的就是位8-10,他就确定了这个分组可以看一下这函数的有效性

那么我们怎么来设置每一个中断的抢占优先级、响应优先级和优先级分组呢?

关于中断优先级的操作有一系列寄存器,实际上在函数库中这些寄存器通过机构体组合在了一起。下图右边的在 core_cm4.h这个文件中。这个机构体中RESERVED表示407没有用到的中断,其中有一个240的数组,应为m4内核最多可以支持240个中断。而407只支持82个中断

那么每一个中断如何来设置优先级呢?

IP寄存器的4-7位,来设置每一个中断的抢占优先级和相应优先级,IP寄存器是一个8位的寄存器,应为F407系列只有82个可屏蔽的中断,所以只用到这240个寄存器中的0-81个,

这个函数就是用来设置每一个中断的抢占优先级和响应优先级的,他的入口参数是一个机构体指针类型,有四个成员变量,

1第一个成员变量确定是哪一个中断(中断源,82个中的一个)

2第二个成员变量就是设置抢占优先级

3第三个成员变量就是设置响应优先级

4使能中断的通道

接下来讲中断使能寄存器,ISER[8],他是一个32位的寄存器,32*8=256个,对于M4的话最多有240个,407只用到了其中的82个 可屏蔽中断,每一个寄存器是32位所以我们用其中的ISER[0]-ISER[2]就够了,这个寄存器也包含在了上面那个机构体当中。

接下来还有一些别的寄存,下面这个ICER这个寄存器一共有8个,同样设置这个寄存器也是设置上面那个机构体

下面这个中断挂起和解挂的 配置和上面的步骤也基本相同,

还有一个中断激活标志位寄存器,他可以知道当前哪个中断正在执行。

下面这是中断配置的步骤

1 设置中断优先级的级别,IP寄存器的位4-7,一共4个位2的4次方可以设置16级中断

2设置某一个中断的优先级,

打开外部中断实验, 在开头就调用了中断优先级分组,下面这个函数将分组设置为2,(即:两位抢占优先级、两位响应优先级)

今天的讲解结束,要理解中断还是要 多看手册。

猜你喜欢

转载自blog.csdn.net/weixin_38787597/article/details/82780770