网站做图标链接,泉州哪里做网站,广东推广网络,舟山市普陀区建设局网站STM32 NVIC 中断优先级管理 
CM3 内核支持 256 个中断#xff0c;其中包含了 16 个内核中断和 240 个外部中断#xff0c;并且具有 256级的可编程中断设置。STM32 并没有使用 CM3 内核的全部东西#xff0c;而是只用了它的一部分。STM32 有 84 个中断#xff0c;包括 16 个…STM32 NVIC 中断优先级管理 
CM3 内核支持 256 个中断其中包含了 16 个内核中断和 240 个外部中断并且具有 256级的可编程中断设置。STM32 并没有使用 CM3 内核的全部东西而是只用了它的一部分。STM32 有 84 个中断包括 16 个内核中断和 68 个可屏蔽中断具有 16 级可编程的中断优先级。STM32 的 68 个可屏蔽中断在 STM32F103 系列上面又只有 60 个在 107 系列才有 68 个。因为我们开发板选择的芯片是 STM32F103 系列的所以我们就只针对 STM32F103 系列这 60 个可屏蔽中断进行介绍。 
中断管理方法 首先对STM32中断进行分组组0~4。同时对每个中断设置一个抢占优先级和一个响应优先级值。这里简单介绍一下 STM32 的中断分组STM32 将中断分为 5 个组组 0~4。该分组的设置是由 SCB-AIRCR 寄存器的 bit10~8 来定义的。具体的分配关系如表 4.5.1 所示  抢占优先级和响应优先级的区别 
高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的值越小越高在抢占优先级不同的情况下响应优先级是没有用的。抢占优先级相同的中断高响应优先级不可以打断低响应优先级的中断。抢占优先级相同的中断当两个中断同时发生的情况下哪个响应优先级高哪个先执行。如果两个中断的抢占优先级和响应优先级都是一样的话则看哪个中断先发生就先执行 
举例 假定设置中断优先级组为2然后设置中断3(RTC中断)的抢占优先级为2响应优先级为1。 中断6外部中断0的抢占优先级为3响应优先级为0。中断7外部中断1的抢占优先级为2响应优先级为0。那么这3个中断的优先级顺序为中断7中断3中断6。 一般情况下系统代码执行过程中只设置一次中断优先级分组比如分组2设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱程序出现意想不到的执行结果。 
中断优先级分组函数 
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));SCB-AIRCR  AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}设置为分组二举例 
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);怎么设置单个中断的抢占优先级和响应优先级 中断设置相关寄存器 
__IO uint8_t IP[240]; //中断优先级控制的寄存器组__IO uint32_t ISER[8]; //中断使能寄存器组__IO uint32_t ICER[8]; //中断失能寄存器组__IO uint32_t ISPR[8]; //中断挂起寄存器组__IO uint32_t ICPR[8]; //中断解挂寄存器组__IO uint32_t IABR[8]; //中断激活标志位寄存器组 
MDK中NVIC寄存器结构体 
typedef struct
{__IO uint32_t ISER[8];             uint32_t RESERVED0[24];                                   __IO uint32_t ICER[8];                    uint32_t RSERVED1[24];                                    __IO uint32_t ISPR[8];                     uint32_t RESERVED2[24];                                   __IO uint32_t ICPR[8];                   uint32_t RESERVED3[24];                                   __IO uint32_t IABR[8];                     uint32_t RESERVED4[56];                                   __IO uint8_t  IP[240];                     uint32_t RESERVED5[644];                                  __O  uint32_t STIR;                         
}  NVIC_Type; 每个中断怎么设置优先级 ① 中断优先级控制的寄存器组IP[240] 全称是Interrupt Priority Registers。240个8位寄存器每个中断使用一个寄存器来确定优先级。STM32F10x系列一共60个可屏蔽中断使用IP[59]~IP[0]。每个IP寄存器的高4位用来设置抢占和响应优先级根据分组低4位没有用到。 
② 中断使能寄存器组ISER[8] 作用用来使能中断 32位寄存器每个位控制一个中断的使能。STM32F10x只有60个可屏蔽中断所以只使用了其中的ISER[0]和ISER[1]。ISER[0]的bit0到bit31 分别对应中断0到31。ISER[1]的bit0到bit27对应中断32~59 
③ 中断失能寄存器组ICER[8] 作用用来失能中断 32位寄存器每个位控制一个中断的失能。STM32F10x只有60个可屏蔽中断所以只使用了其中的ICER[0]和ICER[1]。ICER[0]的bit0到bit31分别对应中断0到31。ICER[1]的bit0到bit27对应中断32~59配置方法跟ISER一样。 
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);④中断挂起控制寄存器组ISPR[8] 作用用来挂起中断 
⑤中断解挂控制寄存器组ICPR[8] 作用用来解挂中断 
static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)⑥中断激活标志位寄存器组IABR [8] 作用只读通过它可以知道当前在执行的中断是哪一个如果对应位为1说明该中断正在执行。 
static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)中断参数初始化函数 
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);typedef struct
{uint8_t NVIC_IRQChannel; //设置中断通道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_IRQChannelPreemptionPriority1 ;// 抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority  2;// 子优先级位2
NVIC_InitStructure.NVIC_IRQChannelCmd  ENABLE;//IRQ通道使能
NVIC_Init(NVIC_InitStructure);	//根据上面指定的参数初始化NVIC寄存器中断优先级设置步骤 ① 系统运行后先设置中断优先级分组。调用函数 
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);整个系统执行过程中只设置一次中断分组。②针对每个中断设置对应的抢占优先级和响应优先级 
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);③ 如果需要挂起/解挂查看中断当前激活状态分别调用相关函数即可。