CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但是STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。在STM32F103系列上,只有60个(在107系列才有68个)。
抢占优先级的级别高于响应优先级,而数值越小所代表的优先级就越高。
注意:第一,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
第二,高抢占优先级是可以打断正在进行的低抢占优先级中断。而抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断
NVIC中断管理函数主要在misc.c文件里面
中断优先级分组函数NVIC_PriorityGroupGonfig
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
//eg:分组范围为0~4,假设设置整个系统的中断优先级分组值为2
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//这样就确定了一共为"2位抢占优先级, 2位响应优先级"。
这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改。
对每个中断我们如何确定它的抢占优先级和响应优先级呢?
中断初始化函数NVIC_Initvoid NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
NVIC_InitTypeDef的成员变量:
typedef struct
{
uint8_t NVIC_IRQChannel; //初始化哪个中断
uint8_t NVIC_IRQChannelPreemptionPriority; //定义这个中断抢占优先级
uint8_t NVIC_IRQChannelSubPriority; //定义子优先级
FunctionalState NVIC_IRQChannelCmd; //中断是否使能
}NVIC_InitTypeDef;
以上是中断分组分概念以及设定优先级值的方法,每种优先级还有一些关于清除中断,查看中断状态等。
中断优先级设置的步骤:
- 系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和子优先级的分配位数。调用函数为NVIC_PriorityGroupConfig();
- 设置所用到的中断的中断优先级别。对每个中断调用函数为NVIC_Init();