STM32F1学习笔记:NVIC中断优先级管理

一、NVIC中断优先级分组
1、概述
STM32有84个中断,包括16个内核中断和68个可屏蔽中断(CM3的外部中断),具有16级可编程的中断优先级。
STM32F103则只有16个内核中断和60个可屏蔽中断(107系列才有68个)。

2、中断管理方法
对STM32的中断进行分组,组0~4。此外,对每个中断设置一个抢占优先级和一个响应优先级。(分组配置是在寄存器SCB->AIRCR中配置)
STM32F1学习笔记:NVIC中断优先级管理_第1张图片
由上图可知,共有4个bit可用来设置中断优先级,因此有2^4=16级。

3、抢占优先级&响应优先级
(值越小,优先级越高)
高抢占优先级的中断可以打断低抢占优先级的中断;抢占优先级相同时,高响应优先级不可以打断低响应优先级的中断。但是如果两个抢占优先级相同的中断同时发生,则高响应优先级的中断优先执行。如果两个中断的抢占优先级和响应优先级都是相同的,则谁先发生谁先执行。

4、特别说明
一般情况下,系统代码执行过程中,只设置一次中断优先级分组,设置好以后一般不会再改变。否则容易导致混乱。

二、相关函数
1、中断优先级分组函数

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

2、设置每一个中断的优先级

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

举例:

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寄存器

你可能感兴趣的:(stm32,嵌入式,单片机)