一.NVIC介绍
NVIC被称为嵌套向量中断控制器,是STM32中掌管所有中断的控制者。NVIC在进行中断控制时,会根据程序员确定的优先级分组对各个中断予以相应,优先级分组与主优先级和子优先级之间之间的关系在手册中可以查出得到。
二.EXTI介绍
NVIC控制着各种中断,EXTI就是其中被NVIC控制的一种。EXTI被称为外部中断/事件控制器,管理控制器的20个中断/事件线,每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿检测。
由上图可知,外部产生的中断通过GPIO的输入到EXTI中,EXTI处理的结果再送入NVIC中,不过究竟是哪一个GPIO端口产生的中断需要AFIO进行选择。
三.EXTI软件编写
1.初始化GPIO(与上一节讲的内容一致)和AFIO
AFIO是选择哪一个GPIO端口产生的中断,它也是挂载在APB2总线上的
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
2.初始化EXTI
①首先选择EXTI的信号源。这一步其实就是AFIO选择哪个GPIO端口产生的中断
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
②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);
3.NVIC配置
①首先对从EXTI来的中断进行中断分组,这一步是为了后续中如果有多种中断产生时可以合理地处理它们。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
② NVIC初始化
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);
在上述的①②③完成之后,当有外部中断产生时,CPU就会对其进行处理,中断主程序,跳转到中断产生位置执行相应的程序,至于跳转到的那个中断函数在触发中断时会自动跳转,无需软件编程。