本文主要是介绍STM32 EXTI(外部中断)和NVIC(嵌套向量中断控制器)学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
STM32 EXTI(外部中断)和NVIC(嵌套向量中断控制器)学习
在STM32中EXTI有0~18个事件/中断,0~4各自都是单独的一个通道,5~9是共一个通道,10~15共享一个通道,16/17/18各自独立用到一个通道
在STM32中NVIC是嵌套向量中断控制器,分为0~4五个组,称之为(Group)
NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4
库函数里提供的函数NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)就是用来配置中断分组的第0组:所有4位用于指定响应优先级(16种)
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级(8种)
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级(4种)
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级(2种)
第4组:所有4位用于指定抢占式优先级
- 例子
- 配置EXTI所用到的GPIO口和相应引脚
- 配置缺省EXTI
- 配置线路和中断模式并使能
void exti_init(void){EXTI_InitTypeDef EXTI_InitStructure;GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource8);EXTI_DeInit();/* Configure EXTI8 line */EXTI_InitStructure.EXTI_Line = EXTI_Line8;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
}
- 例子
- 设置好中断通道
- 设置中断主从优先级,这里都是0
- 中断通道使能
void nvic_init(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
- 例子
- 中断子程序中判断EXTI中断的状态
- 选择中断源的时候看是Line几
- 记得清除掉中断产生的条件,否则会一直执行中断
void EXTI9_5_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line8) != RESET){bsp_led_off(1);/* Clear the EXTI line 8 pending bit */EXTI_ClearITPendingBit(EXTI_Line8);}
}
基本过程:
- 时钟配置
- GPIO配置
- EXTI配置
- NVIC配置
- ISR编写
这篇关于STM32 EXTI(外部中断)和NVIC(嵌套向量中断控制器)学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!