首先直接用图形式展示要进行外部中断需要的步骤
今天给大家介绍一个EXTI外部中断
以上是中断的定义,中断有很多种,今天介绍EXTI外部中断
中断程序就是立刻去执行,执行完中断程序才返回来执行CPU的主程序
当然中断也有优先级,其中掌控优先级的是NVIC,NVIC是中断分配,将中断按优先级传送给CPU
这是NVIC优先级的分配方式
用医生来举例,抢占优先级就是在上一个病人在看病,然后可以直接插队到上一个病人后面,响应优先级就是,在上一个病人还在看病,直接就进去让医生看。响应优先级要大于抢占优先级。
值越小,优先级越高。
AFIO的功能就是选择引脚,AFIO中断引脚选择,每个GPIO口选择一个接到AFIO口上,通道一只能接PA0,PB0或者PC0这种,但是只能选择一个接入。所以AFIO要选择一个引脚接入NVIC
那么下面我们来进行EXTI的初始化吧
我先放一个源代码,大家不想看讲解的可以直接复制
void Sensor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_14;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14 );
EXTI_InitTypeDef EXIT_Instrcture;
EXIT_Instrcture.EXTI_Line=EXTI_Line14;
EXIT_Instrcture.EXTI_LineCmd=ENABLE;
EXIT_Instrcture.EXTI_Mode=EXTI_Mode_Interrupt;
EXIT_Instrcture.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
EXTI_Init(&EXIT_Instrcture);
NVIC_InitTypeDef NVIC_Instructure;
NVIC_Instructure.NVIC_IRQChannel= EXTI15_10_IRQn;
NVIC_Instructure.NVIC_IRQChannelCmd= ENABLE;
NVIC_Instructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_Init(&NVIC_Instructure);
}
第一步:第一步,配置RCC,涉及到的外设时钟都打开
我们依然在handware那添加sensor.c sensor.h 文件,完成程序基本结构的书写(之前的文章里面有,我就不过多赘述了)
由于我是接在GPIOB14口的所以代码如上,要是不一样大家酌情修改噢。
第二步:配置GPIO选择端口为输入模式
第二步配置GPIO口大家应该很熟悉了吧,定义一个结构体然后引出结构相关变量后跟随自己的要求选择参数。
第三步:配置AFIO口,选择要用的GPIO连接到EXTI
以上函数就是STM32提供给我们将选择的GPIO口连接到EXTI上,该函数有两个参数,我们选择的是GPIOB_14,所以是上面的参数。
第四步:配置EXTI选择边缘触发方式,上升、下降或者双边沿,以及选择响应的方式
以上是EXTI的全部函数
我们先初始化EXTI,与初始化GPIO口一样,先定义一个结构体,随后引出结构体的变量,然后根据情况进行取值。
以上是先定义了一个叫EXTI_Instrcture的结构体,然后引出这些,最后取地址到EXTI_Instrcture。
注意要选择触发方式(第四个),上升沿就是低电平向高电平触发,下降沿就是高电平向低电平触发,双边沿就是低往高,高往低都可以。
第五步:配置NVIC,给中断选择合适的优先级
以上是关于NVIC的全部函数,同样先初始化NVIC
与之前初始化GPIO与EXTI一样。
在中断很多时,注意配置抢占优先级和响应优先级。这里只有一个中断,所以就无所谓。
那么到这里EXTI外部中断的初始化就完成了。
接下来根据具体的要求进行接下来的操作了。
这是对射式的接线图。我们想实现的情况是用挡光片阻挡对射式红外仪,挡一次记录+1.。
下面是中断函数的书写(中断函数的名称都是固定的,去表里查)
这是上面的函数介绍,判断是否进入中断,用if语句判断,在中断结束后要清除中断位。
然后创建两个函数,一个用来执行递增的作用,一个用来接收返回这个数据。
在将这些函数都放到.h函数定义后。
先初始化,然后执行OLED显示操作,在循环中,中断一次就加1的操作。
以上就是程序的源码分析。