目录

什么是中断:

外部中断基础知识

中断函数:

优先级:

流程图:

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。

优先级:

优先级分为抢占优先级响应优先级

  1. 抢占优先级:是指在另一个中断进行的过程中,可以打断正在执行的中断。这种能力与抢占优先级的数值相关,数值越低,这种能力就越大。
  2. 响应优先级:在两个中断的抢占优先级相同的情况下,两个中断应该同时进行,但是因为两者的响应优先级不同,CPU先处理响应优先级数值小的。

流程图:

  1. 左边的GPIO口作为终中断输入,输入到AFIO中。
  2. 然后AFIO模块对数据进行一个选择,只输出一个信号与EXTI进行映射。
  3. 随后EXTI模块配置外部中断模式/外部事件模式,配置上升沿/下降沿/双边沿触发,将信号发送给NVIC
  4. NVIC(中断管家)他收到中断请求后,才会开启中断开关,随后NVIC会给中断分配优先级,随后按照优先级去执行中断函数

AFIO的功能主要是将GPIO口映射到EXTI口,但还不是真的建立起连接

注:16打个斜杠是指有16根线

AFIO的核心原理图:

AFIO内部有许多这样的结构,接收GPIO的信号,他最后只会输出一个映射到EXTI上。(同号数字引脚同一时刻不能多个外设一起作为中断输入)

外部中断/事件控制图:

信号进入EXTI边沿检测与控制模块后,首先进入边沿检测电路,配置上升沿/下降沿/双边沿触发

随后进入一个或门(全为0时才输出0)

随后兵分两路,上面的进入外部中断模式,下面的进入外部事件模式

外部中断模式:

  1. 先进入请求挂起寄存器,他作为一个中断标志位,我们可以读取这个寄存器查看是哪个通道发生中断
  2. 请求挂起寄存器输出1,随后信号往后走,跟中断屏蔽寄存器一起进入与门。此时的与门和中断屏蔽寄存器相当于一个开关的作用。当中断屏蔽寄存器输出1时,允许中断,信号发送至NVIC。当中断屏蔽寄存器输出0,不允许中断,信号发不出去。

外部事件模式:

  • 信号跟事件屏蔽器一起进入一个与门,由事件屏蔽寄存器决定是否中断

NVIC

NVIC一共有三个主要功能:

  1. 中断使能与禁用:之前的信号都是请求中断的信号,只有在NVIC才能决定是否执行这个中断
  2. 优先级管理:为每个中断请求分配优先级(数值越小优先级越高)
  3. 执行操作:执行中断服务函数

代码:

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初始化,初始化函数的参数为一个结构体地址,结构体里面包含了:

  1. EXTI_Line:配置外部AFIO输出的线与EXTI线配对
  2. EXTI_LineCmd:给第一个参数配对的中断线路使能
  3. EXTI_Mode:选择外部中断模式还是外部事件模式
  4. 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初始化的函数参数为一个结构体地址,结构体成员有:

  1. NVIC_IRQChannel:指定配置对象
  2. NVIC_IRQChannelCmd:中断通道使能还是失能
  3. NVIC_IRQChannelPreemptionPriority:抢占优先级
  4. 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);

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐