stm32之中断优先级NVIC

来源:互联网 发布:淘宝名人补剂 编辑:程序博客网 时间:2024/04/30 14:25

什么是NVIC?
即嵌套向量中断控制器(Nested Vectored Interrupt Controller)。

STM32的中有一个强大而方便的NVIC,它是属于Cortex内核的器件,不可屏蔽中断 (NMI)和外部中断都由它来处理,而SYSTICK不是由 NVIC来控制的。

与NVIC有关的寄存器

对其定义了如下结构体

typedef struct{vu32 ISER[2];u32 RESERVED0[30];vu32 ICER[2];u32 RSERVED1[30];vu32 ISPR[2];u32 RESERVED2[30];vu32 ICPR[2];u32 RESERVED3[30];vu32 IABR[2];u32 RESERVED4[62];vu32 IPR[15];} NVIC_TypeDef;

对寄存器进行介绍:

  • ISER[2]:中断使能寄存器组(2个32位寄存器,可以表示60个可屏蔽中断)
  • ICER[2]:中断失能寄存器组
  • ISPR[2]:中断挂起控制寄存器组
  • ICPR[2]:中断解挂控制寄存器组
  • IABR[2]:中断激活标志位寄存器组(只读,通过它可以知道当前在执行的中断是哪一个)
  • IPR[15]:中断优先级控制的寄存器组(设置各个中断的抢占和响应优先级)

STM32 的中断分组
第0组:所有4位用于指定响应优先级(16种)
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级(8种)
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级(4种)
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级(2种)
第4组:所有4位用于指定抢占式优先级

我的理解是中断分组对各个中断会有一个限制,比如使用第0组只能存在一个抢占优先级。
抢占优先级>响应优先级
不同的抢占优先级可以存在中断抢占,不同的响应优先级不可以抢占。

一个例子说明

void NVIC_Config(void){    NVIC_InitTypeDef NVIC_InitStructure;    /* Configure one bit for preemption priority --------------------------- */    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);    /* UART1 --------------------------------------------------------------- */    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    NVIC_Init(&NVIC_InitStructure);    /* UART2 -------------------------------------------------------------- */    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    NVIC_Init(&NVIC_InitStructure);}

优先分组是0组,说明只能存在响应优先级,互相之间不能被打断,而当两个任务同时发生时,UART2 会先响应。

0 0
原创粉丝点击