首先,我们先介绍一下EXTI外部中断应用需要了解的一些定义,多余的定义在这里不做解释
在主程序的运行过程中,出现了特定的中断触发条件(中断源),CPU自动暂停正在执行的程序,转头去处理这个中断源,处理完成后继续完成剩下没完成的主程序,就叫做中断.
例如:对于外部中断来说,可以是引脚的电平发生了变化.
对于定时器来说,可以是定时器的时间到了.
对于串口通信来说,可以是接收到了数据.
编写中断函数的时候,函数名有特定要求,关于函数名的定义在startup_stm32xxxmd.s下可以查看
进入中断函数的条件需要在EXTI_InitTypeDef* EXTI_InitStruct类型的结构体中定义trigger参数,选择上升沿,下降沿,或者是双边沿.
NVIC是一个内核的寄存器,要看他的使用手册的话,需要我们去cortex-m3里面看
NVIC是直接集成在CPU内核中的,如果将CPU比作一位医生,那么NVIC就是一个挂号系统,他负责分配为不同的中断源分配不同的优先级,然后告诉CPU应该先处理哪一个中断源,从而做到中断源的有序处理.
NVIC对应的相关函数(NVIC属于CPU的内核寄存器,相关函数可以在misc.h里面看):
1.NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
函数的作用:初始化NVIC,参数需要传输一个NVIC_InitTypeDef类型的结构体的指针,这个类型的结构体存放着以下几个参数
uint8_t (char类型)NVIC_IRQChannel; //中断请求通道
uint8_t (char类型)NVIC_IRQChannelPreemptionPriority; //确立抢占优先级
uint8_t (char类型)NVIC_IRQChannelSubPriority; //确认响应优先级
FunctionalState ()NVIC_IRQChannelCmd; //负责控制某个中断通道的开关状态
2.NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
函数的作用:设置抢占优先级和响应优先级的分组.
//如果要处理多个中断,需要把这个函数放在MAIN主函数之中,否则如果调用不同的硬件的中断函数的时候,状态可能一直刷新,导致有序地处理先后中断顺序.
负责处理IO口的一个电平变化,当检测到对应的IO口发生了电平变化,会向NVIC提出中断申请,NVIC给这些不同优先级的事件排序后发送给CPU进行处理 .
支持的触发机制:上升沿,下降沿,双边沿,事件触发.
触发响应方式:中断响应和事件响应
EXTI的相关对应函数:
1.EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
函数作用:EXTI的初始化,参数需要传递一个EXTI_InitTypeDef* EXTI_InitStruct类型的结构体指针.
EXTI_InitTypeDef* EXTI_InitStruct包含以下几个参数:
①uint32_t EXTI_Line; //参数用于指定你想要配置的EXTI线路。两个线路中间加一个|的符号,可以指定两条线路
②EXTIMode_TypeDef EXTI_Mode; //选择中断响应/事件响应
③EXTITrigger_TypeDef EXTI_Trigger; //选择中断触发条件,上升沿,下降沿,双边沿
④FunctionalState EXTI_LineCmd; //开启/关闭
1复用功能重映射
2中断的引脚选择
AFIO相关的函数解析:
1.RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//使能AFIO的时钟
2.GPIO_EXTILineConfig(GPIO_PortSourceGPIOx, GPIO_PinSource_x);
//将外部中断的x号线映射到GPIOx,即选择Pxxx为外部中断引脚