首页 理论教育 STM32F4系列外部中断优先级配置与设定

STM32F4系列外部中断优先级配置与设定

时间:2023-10-21 理论教育 版权反馈
【摘要】:图5-4STM32F4系列NVIC_IPRx寄存器分布图NVIC_IPRx用来配置外部中断的优先级。表5-4STM32F407系列的NVIC_IPRx配置用于表达优先级的这高4位,又被分组用于设置抢占优先级和子优先级。第1组:最高1位用于指定抢占优先级,最低3位用于指定子优先级。这3个中断的优先级顺序为:中断7>中断3>中断6。

STM32F4系列外部中断优先级配置与设定

对中断的使能与失能,比较容易理解;但对NVIC中优先级的设置,则比较难以理解。

可使用寄存器NVIC_IPRx设置中断优先级。STM32F4系列NVIC_IPRx寄存器分布如图5-4所示。这组寄存器有21个32位的寄存器,分别编号IPR0~IPR20,一共有672位。这672位又按8位一组分为84组。每一组一个字节,编号IP[0]~IP[80],共81组IP[x],剩下3个字节保留。

图5-4 STM32F4系列NVIC_IPRx寄存器分布图

NVIC_IPRx用来配置外部中断的优先级。NVIC_IPRx数据宽度为8bit,原则上每个外部中断可配置的优先级为0~255,其数值越小,优先级越高。但是绝大多数SOC都会精简设计,并不需要256个级别,在STM32F407系列中,NVIC_IPRx寄存器只使用了高4位,低4位保留不使用,如表5-4所示。

表5-4 STM32F407系列的NVIC_IPRx配置

用于表达优先级的这高4位,又被分组用于设置抢占优先级和子优先级(也称为响应优先级)。如果有多个中断同时响应,那么抢占优先级高的比抢占优先级低的优先得到执行。如果抢占优先级相同,则比较子优先级。如果抢占优先级和子优先级都相同的话,就比较它们的硬件中断编号,编号越小,优先级越高。顺序为抢占优先级>子优先级>中断编号。

关于这4位二进制数的分配,NVIC并没有强制规定。用户可以用1位设置抢占优先级,将剩下的3位用于设置子优先级,又或者用2位设置抢占优先级,将剩下2位用于设置子优先级。因此,必须对这几位数的配置有一个设置说明。该说明称为中断优先级分组,用于确定哪几位数用于设置抢占优先级,哪几位数用于设置子优先级。由于STM32F407只有4位用于设置抢占优先级与子优先级,所以只能有5种组合。

第0组:所有4位用于指定子优先级。

第1组:最高1位用于指定抢占优先级,最低3位用于指定子优先级。(www.xing528.com)

第2组:最高2位用于指定抢占优先级,最低2位用于指定子优先级。

第3组:最高3位用于指定抢占优先级,最低1位用于指定子优先级。

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

使用第几组由应用程序中断及复位控制寄存器AIRCR的PRIGROUP[10:8]位决定,这里包含了3位二进制数,应该有8个组合,可以表示8组,但STM32F407只有5组,剩下3组不使用,如表5-5所示。

表5-5 STM32F407的AIRCR的PRIGROUP的分组

假定设置AIRCR的PRIGROUP[10:8]为010,即中断优先级组为第2组,那么就有2位二进制数用来设置抢断优先级,设置范围为0~3;另外2位二进制数用来设置子优先级,设置范围为0~3。这里设置中断3(见表5-2,可查得中断编号为3的RTC_WKUP的中断)的抢占优先级为2,子优先级为1;设置中断6(外部中断0)的抢占优先级为3,子优先级为0;设置中断7(外部中断1)的抢占优先级为2,子优先级为0。这3个中断的优先级顺序为:中断7>中断3>中断6。

可见Cortex-M的中断系统比起常用的单片机要复杂得多,尤其是优先级的设置,但只要理清脉络和逻辑,就不难理解。

固件库也封装好了相应的驱动函数。这些驱动函数在core_cm4.h中可以找到。表5-6列出了NVIC的相关库函数。这些函数包括了使能、失能、挂起的设置与清除,设置与获取优先级和复位函数。

表5-6 NVIC相关库函数

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈