实现 “中断分组设置 + 中断优先级管理”;NVIC 中断管理函数主要在 misc.c 文件里面
中断分组配置void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup; //过设置 SCB->AIRCR 寄存器来设置中断优先级分组
}
#define IS_NVIC_PRIORITY_GROUP(GROUP) \\分组范围0-4
(((GROUP) == NVIC_PriorityGroup_0) ||
((GROUP) == NVIC_PriorityGroup_1) || \
((GROUP) == NVIC_PriorityGroup_2) || \
((GROUP) == NVIC_PriorityGroup_3) || \
((GROUP) == NVIC_PriorityGroup_4))
NVIC_PriorityGroupConfig(NVIC_PriortyGroup_2); // 可屏蔽中断的IP寄存器组的高四位中,最高3位是抢占优先级,低1位是响应优先级

中断优先级管理void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); //中断初始化函数
typedef struct
{
uint8_t NVIC_IRQChannel; //在 stm32f10x.h 中找到每个中断对应的名字。例如 USART1_IRQn
uint8_t NVIC_IRQChannelPreemptionPriority; //定义这个中断的抢占优先级别;
uint8_t NVIC_IRQChannelSubPriority; //定义这个中断的(响应优先级子优先级别)
FunctionalState NVIC_IRQChannelCmd; //该中断通道是否使能
} NVIC_InitTypeDef;
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 寄存器
CM4 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有256 级的可编程中断设置。但 STM32F4 并没有使用 CM4 内核的全部东西,STM32F40xx/STM32F41xx 总共有 92 个中断。
STM32F40xx/STM32F41xx 的 92 个中断里面,包括 10 个内核中断和 82 个可屏蔽中断,具有 16 级可编程的中断优先级,而我们常用的就是这 82 个可屏蔽中断。
在MDK内与NVIC相关寄存器结构体定义如下:
typedef struct
{
__IO uint32_t ISER[8]; /*!< Interrupt Set Enable Register */
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; /*!< Interrupt Clear Enable Register */
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; /*!< Interrupt Set Pending Register */
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; /*!< Interrupt Clear Pending Register */
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; /*!< Interrupt Active bit Register */
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; /*!< Interrupt Priority Register, 8Bit wide */
uint32_t RESERVED5[644];
__O uint32_t STIR; /*!< Software Trigger Interrupt Register */
} NVIC_Type;