1、相应优先级和抢占优先级
相应优先级:触发后在当前任务执行后执行
抢占优先级:直接中断当前任务执行
优先级寄存器有四位,两类优先级分配这四位优先级,共有五种分法
数字越小优先级越高
2、EXTI中断
同一数字引脚不能同时出触发中断,例如PA1和PB1不能但PA1和PA2可以同时触发。
配置过程:RCC->GPIOx->AFIO->EXTI->NVIC
RCC开启GPIO和AFIO的时钟。
配置GPIO,AFIO,EXTI,NVIC。
配置代码
void EXIT_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启AFIO时钟
//EXTI不配置,NVIC是在内核的外设不需要开启时钟
//GPIO配置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//AFIO配置,B的14号
//EXTI配置
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);//EXTI初始化
//NVIC配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分组
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//通道
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//相应优先级
NVIC_Init(&NVIC_InitStructure);
}
使用PB14引脚,EXTI通道为EXTI5_10(10~15合并为一个通道)。
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14) == SET)//查询是否为14号申请的中断
{
EXTI_ClearITPendingBit(EXTI_Line14);//清除标志位
}
}
由于10~15合并为一个通道,所以要判断是不是14号通道申请的中断。
结束后清除标志位,不然会卡死在中断里。