目录什么是中断外部中断基础知识中断函数优先级流程图AFIO的核心原理图外部中断/事件控制图NVIC代码什么是中断中断在主程序运行过程中出现了特定的中断触发条件中断源使得CPU暂停当前正在运行的程序转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行中断优先级当有多个中断源同时申请中断时CPU会根据中断源的轻重缓急进行裁决优先响应更加紧急的中断源中断嵌套当一个中断程序正在运行时又有新的更高优先级的中断源申请中断CPU再次暂停当前中断程序转而去处理新的中断程序处理完成后依次进行返回外部中断基础知识stm32的每个io口都可以作为外部中断的终端输入口STM32F103中中断控制器支持19个外部中断/事件请求。每个中断都有独立的触发和屏蔽功能。STM32的19个外部中断分别为线1~15外部IO口的输入中断线16连接到PVD输出线17连接到RTC闹钟事件线18连接到USB唤醒事件中断函数线0~15每条线路都对应了一个中断函数中断函数的名称不能自己随便起名每条线路都对应了一个中断函数注意5~9函数跟10~15函数调用的时候需要判断是否是你指定的线路请求的中断要调用EXTI_GetITStatus(EXTI_Linex)函数来判断是不是指定的x线路请求的中断。EXTI_GetITStatus(EXTI_LineX) 函数参数是线路返回值为SET或RESET。优先级优先级分为抢占优先级和响应优先级抢占优先级是指在另一个中断进行的过程中可以打断正在执行的中断。这种能力与抢占优先级的数值相关数值越低这种能力就越大。响应优先级在两个中断的抢占优先级相同的情况下两个中断应该同时进行但是因为两者的响应优先级不同CPU先处理响应优先级数值小的。流程图左边的GPIO口作为终中断输入输入到AFIO中。然后AFIO模块对数据进行一个选择只输出一个信号与EXTI进行映射。随后EXTI模块配置外部中断模式/外部事件模式配置上升沿/下降沿/双边沿触发将信号发送给NVICNVIC中断管家他收到中断请求后才会开启中断开关随后NVIC会给中断分配优先级随后按照优先级去执行中断函数AFIO的功能主要是将GPIO口映射到EXTI口但还不是真的建立起连接注16打个斜杠是指有16根线AFIO的核心原理图AFIO内部有许多这样的结构接收GPIO的信号他最后只会输出一个映射到EXTI上。同号数字引脚同一时刻不能多个外设一起作为中断输入外部中断/事件控制图信号进入EXTI边沿检测与控制模块后首先进入边沿检测电路配置上升沿/下降沿/双边沿触发随后进入一个或门全为0时才输出0随后兵分两路上面的进入外部中断模式下面的进入外部事件模式外部中断模式先进入请求挂起寄存器他作为一个中断标志位我们可以读取这个寄存器查看是哪个通道发生中断请求挂起寄存器输出1随后信号往后走跟中断屏蔽寄存器一起进入与门。此时的与门和中断屏蔽寄存器相当于一个开关的作用。当中断屏蔽寄存器输出1时允许中断信号发送至NVIC。当中断屏蔽寄存器输出0不允许中断信号发不出去。外部事件模式信号跟事件屏蔽器一起进入一个与门由事件屏蔽寄存器决定是否中断NVICNVIC一共有三个主要功能中断使能与禁用之前的信号都是请求中断的信号只有在NVIC才能决定是否执行这个中断优先级管理为每个中断请求分配优先级数值越小优先级越高执行操作执行中断服务函数代码1.要配置你要用到外设的时钟//1.配置时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);2.配置GPIO口的模式//2.配置GPIO选择端口为输入模式 GPIO_InitTypeDef GPIOB_InitStruction; GPIOB_InitStruction.GPIO_Mode GPIO_Mode_IPU; GPIOB_InitStruction.GPIO_Pin GPIO_Pin_14; GPIOB_InitStruction.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB,GPIOB_InitStruction);3.配置AFIO将GPIO口映射到EXTI口上//3.AFIO配置主要是将GPIO线跟EXTI线进行配对 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14); //AFIO的配置主要是把 PB14 引脚绑定到 EXTI14 这条外部中断线上4.EXTI初始化初始化函数的参数为一个结构体地址结构体里面包含了EXTI_Line配置外部AFIO输出的线与EXTI线配对EXTI_LineCmd给第一个参数配对的中断线路使能EXTI_Mode选择外部中断模式还是外部事件模式EXTI_Trigger选择上升沿/下降沿/上边沿触发//4.EXTI配置 EXTI_InitTypeDef EXTI_InitStruction; EXTI_InitStruction.EXTI_Line EXTI_Line14; //配置外部中断线与GPIO的连接 EXTI_InitStruction.EXTI_LineCmd ENABLE; //给上面配置的中断线使能 EXTI_InitStruction.EXTI_Mode EXTI_Mode_Interrupt; //选择外部中断模式/外部事件模式 EXTI_InitStruction.EXTI_Trigger EXTI_Trigger_Rising; //上升沿/下降沿/双边沿触发 EXTI_Init(EXTI_InitStruction); //初始化5.配置NVIC首先是对中断优先级进行分组随后对NVIC进行初始化。NVIC初始化的函数参数为一个结构体地址结构体成员有NVIC_IRQChannel指定配置对象NVIC_IRQChannelCmd中断通道使能还是失能NVIC_IRQChannelPreemptionPriority抢占优先级NVIC_IRQChannelSubPriority响应优先级//5.1 配置NVIC分组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //5.2 初始化 NVIC_InitTypeDef NVIC_InitStruction; NVIC_InitStruction.NVIC_IRQChannel EXTI15_10_IRQn; //告诉NVIC我要配置的是EXTI15_10这条中断路线 NVIC_InitStruction.NVIC_IRQChannelCmd ENABLE; //指定中断通道是使能还是失能 NVIC_InitStruction.NVIC_IRQChannelPreemptionPriority 1; //抢占优先级 NVIC_InitStruction.NVIC_IRQChannelSubPriority 1; //响应优先级 NVIC_Init(NVIC_InitStruction);