1.中断优先级管理
嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC)
CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。
STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。
STM32F103系列上面,又只有60个可屏蔽中断(在107系列才有68个)
1.1中断管理方法
首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。
分组配置是在寄存器SCB->AIRCR中配置
参考如上的方式,3bit 可分为5个组,0~4,而当其分组号确定之后,对应的抢占式和响应优先级的数目也对应的已经确定了。
比如分组2,,对应于2bit抢占式优先级和2bit响应优先级,因此对应的抢占式优先级必须在0~3,同理响应优先级也是0~3.
1.2抢占优先级 & 响应优先级区别:
高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
抢占优先级相同的中断,即:响应优先级:当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
以上说明:只要符合中断分组方式,只需要注意对应的抢占式和响应的优先顺序,如果是同一个等级,可分配抢占式和响应优先级相同。
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Enable the USARTy Interrupt */
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);
2.中断优先级设置步骤
1.系统运行后先设置中断优先级分组。调用函数:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
整个系统执行过程中,只设置一次中断分组。
②针对每个中断,设置对应的抢占优先级和响应优先级:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
③ 如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。
3.外部中断的一般配置步骤:
3.1初始化IO口为输入。
GPIO_Init();
3.2 开启IO口复用时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
3.3设置IO口与中断线的映射关系。
void GPIO_EXTILineConfig();
3.4初始化线上中断,设置触发条件等。
EXTI_Init();
3.5配置中断分组(NVIC),并使能中断。
NVIC_Init();
3.6 编写中断服务函数。
EXTIx_IRQHandler();
3.7清除中断标志位 (在中断服务函数最后)
EXTI_ClearITPendingBit();