NVIC优先级分组方式
中断可分为内核中断、内核外设中断和外部外设中断。
stm32使用4位来设置中断优先级分组,就是说可以设置5种不同优先级设置方式。
主优先级不同时,正在执行低优先级中断时高优先级中断进入,高优先级中断会破坏低优先级中断;主优先级相同时,会等低优先级中断完成再执行高优先级中断;当两个中断设置的优先级相同时,通过中断映射寄存器地址确定先执行哪个。
通过NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x)可以设置中断优先级分组方式。
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
/* Check the parameters */
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
/* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
在NVIC_PriorityGroupConfig函数中可以看到,实际的优先级设置是写在SCB寄存器的AIRCR中的。这个优先级分组是对内核和外部外设中断都通用的。其中内核外设会有一个默认值。
外部中断设置方法
首先要在RCC中开启相应外设时钟,之后使用结构体对外设进行初始化,在NVIC_Init()函数中对相应的外设进行初始化,设置优先级,开启外设中断要使用的中断标志,编写中断服务程序。
内核外设中断设置方法
外部中断要设置NVIC_InitStructure结构体、在NVIC中使能相应外设,再用NVIC_Init()进行初始化。
内核中断有默认的优先级编号,不用像外设一样自己用结构体配好在初始化,只要直接调用库函数初始化就行。
内核外设初始化函数应该在core_cm3.h中,如果要自己修改寄存器设置的话最好不要直接在core_cm3.h中的初始化函数中改。另外,内核外设已经配有默认的中断优先级,如果要修改的话,应该在调用完初始化函数后用NVIC_SetPriority()函数直接修改。