您的位置:首页 > 其它

stm32之中断优先级NVIC

2016-02-15 15:28 260 查看
什么是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 会先响应。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: