STM32单片机学习分享二-EXTI外部中断(仅为记录个人学习,有错误可以指出,谢谢)

EXTI中断

介绍

EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。EXTI中断是由CPU的外部事件引发的中断。
STM32F10xxx类的产品芯片有68个可屏蔽中断通道,其中EXTI中断向量如下:
在这里插入图片描述
EXTI5-9共用一个中断向量
EXTI10-15共用一个中断向量

EXTI基本结构

在这里插入图片描述

工作流程

GPIO口的外设经过AFIO中断引脚选择器进行引脚选择,通过AFIO选择后的16个通道和PVD、RTC、USB、ETH四个特殊的外设通道一同进入后面的EXTI。随后经过EXTI电路后分为两种输出,一种是接到NVIC,用来触发中断。一种接到其他外设,用来出发其他外设操作。

注意:
1.相同pin的GPIO不能同时触发中断,因为EXTI只有16个通道,AFIO会在相同pin的GPIO中选择其中一个接到EXTI通道上。例如: PA1、PB1、PC1中只能选择其中一个接到EXTI通道上。
2.外部中断的9-5和15-10分别分配到同一个通道中。外部中断9-5会触发同一个函数,外部中断15-10会触发同一个函数。

EXTI框图

在这里插入图片描述
红色路线是触发外部中断的路线。首先输入端输入经过边沿检测电路,这里可以选择上升沿触发、下降沿触发或者双边沿触发(上升沿和下降沿都能触发)。接着遇到或门,与软件中断事件寄存器相或,也就是说,只要硬件触发的值和软件中断事件寄存器的值有一方是1,或门就会输出1。经过或门后,触发信号向上走会遇到请求挂起寄存器。触发中断首先会挂起一个挂起寄存器,相当于一个中断标志位。由于这个中断标志位,通过读取这个寄存器就能知道是哪个通道触发的中断。然后继续向左走,与中断屏蔽寄存器相与。最后到达NVIC中断控制器。

AFIO介绍

AFIO主要用于引脚的复用功能的选择和重定义
在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择。
AFIO中断引脚结构图,如下图:
在这里插入图片描述
相同pin的GPIO通过数据选择器,选择一个引脚接到EXTI。
比如:PA0、PB0……PG0选择其中一个连接到EXTI0上,PA1、PB1……PG1选择其中一个连接到EXTI1上……

“对射式红外传感器计次”项目制作

硬件部分

对射式红外传感器模块

在这里插入图片描述
该产品采用FTR9606高灵敏度槽型光耦器件,槽宽5mm。它由一个红外发光二极管和NPN光电三极管组成,M3固定安装孔,有输出状态指示灯,输出高电平灯灭,输出低电平灯亮。有遮挡,输出高电平。无遮挡,输出低电平。使用3.3-5VDC 宽电压LM393比较器输出,信号干净,波形好,驱动能力强,超过15mA。输出形式:数字开关量输出(0和1)。广泛用于电机转速检测,脉冲计数,位置限位等
它有红外就发射器和红外接收器,当没有物体在传感器前时,接收器接收不到红外光。当有物体出现并反射红外光时,接收器就会检测到这个信号。通过这种方式,红外传感器可以检测到物体的存在,甚至可以测量物体的距离(通过测量反射光的强度)。

OLED显示屏

在这里插入图片描述
OLED,即有机发光二极管( Organic Light Emitting Diode )。 OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及
制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
该屏幕有以下特点:
1)0.96 寸 OLED 有黄蓝,白,蓝三种颜色可选;其中黄蓝是屏上 1/4 部分为黄光,下 3/4 为蓝;而且是固定区域显示固定颜色,颜色和显示区域均不能修改;白光则为纯白,也就是黑底白字;
蓝色则为纯蓝,也就是黑底蓝字。
2)分辨率为 128*64
3)多种接口方式;OLED 裸屏总共种接口包括:6800、8080 两种并行接口方式、3 线或 4 线的串行 SPI 接口方式、 IIC 接口方式(只需要 2 根线就可以控制 OLED 了!),这五种接口是通过屏上的 BS0~BS2 来配置的。

接线图

在这里插入图片描述

代码部分

中断函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

uint16_t CountSensor_Count;


void CountSensor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO的时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;//配置GPIO
	GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;//上拉输入
	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;//50MHZ频率
	GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB外设
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);		//AFIO函数,在GPIO库函数中可以找到
	
	EXTI_InitTypeDef EXTI_InitStructure;//配置EXTI
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//下降沿触发
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分组
	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);
	
}

uint16_t CountSensor_Get(){

		return CountSensor_Count;
}

void EXTI15_10_IRQHandler(void) //中断函数
{
	if(EXTI_GetFlagStatus(EXTI_Line14)==SET)//判断是否为通道14中断源触发的函数
	{
		Delay_ms(500);
		CountSensor_Count ++;
		EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位
	}
}

主函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "OLED.h"
#include "CountSensor.h"

int main(void)
{	 
	OLED_Init();
	CountSensor_Init();//调用初始化函数
	
	OLED_ShowString(1,1,"Count: ");
	while(1)
	{
		OLED_ShowNum(1,7,CountSensor_Get(),5);
	}
}

成果展示

检测到发射器和接收器中间有遮挡,Count就会+1。
在这里插入图片描述

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值