STM32 NVIC 中断优先级管理

来源:互联网 发布:淘宝客服售后质量话术 编辑:程序博客网 时间:2024/05/17 23:44

这里以STM32F4系列为例。

先简单介绍下STM32F4的中断分组,STM32F4将中断分为5个组,组0-4.该分组的设置是有SCB->AIRCR寄存器的bit 10~8来定义的。具体分配关系如下表


假设说组设置为2,那么此时每个中断的中断优先寄存器的高四位中的最高两位是抢占优先级,低两位是响应优先级。在每个中断中,你可以设置抢占优先级为0-4,响应优先级为0-4。需要注意的是,抢占优先级的级别高于响应优先级,而且数值越小代表的优先级越高。另外,在优先级相同的情况下,则遵循先发生先执行的规则。

举个例子,中断1的抢占优先级为2,响应优先级为1,中断2的抢占优先级为2,响应优先级为0,中断3的抢占优先级为3,响应优先级为0,则3个中断的优先级顺序为

2〉1〉3。

这里还有一个注意点,高抢占级别的中断时可以打断低抢占级别的中断的,但在相同抢占优先的情况下,高响应级别的中断是不能打断低响应级别的中断。即:中断1,2可以打断中断3,但是中断1,2不能相互打断。

接下来我们介绍如何使用库函数实现以上中断分组设置以及中断优先级管理。

首先是中断优先级分组函数

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

这个函数的作用就是通过设置SCB-〉AIRCR寄存器来设置中断优先级分组。例如:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 

这样,就确定为“2位抢占优先级,2位响应优先级”。
设置好系统中断分组,接下来要设置每个中断点的抢占优先级和响应优先级。首先由介绍中断初始化函数

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

这里,NVIC_InitTypeDef是一个结构体,其定义如下:

typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;

NVIC_IRQChannel:定义初始化的是哪个中断,这个我们可以在 stm32f10x.h 中找到每个中断对应的名字。例如 USART1_IRQn。

NVIC_IRQChannelPreemptionPriority:定义这个中断的抢占优先级别。

NVIC_IRQChannelSubPriority:定义这个中断的子优先级别,也叫响应优先级

NVIC_IRQChannelCmd:该中断通道是否使能。 

比如我们要使能串口1的中断,同时设置抢占优先级为1,响应优先级为2,初始化方法如下:
NVIC_InitTypeDef NVIC_InitStructure;;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//
串口1 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级为 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//
响应优先级位 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ
通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC 寄存器 








0 0
原创粉丝点击