目录

前言

一、接线图

二、EXTI中断

1.什么是中断

2.什么是EXTI

3.什么是NVIC

4.NVIC基本结构:

三,配置中断

1.配置中断的流程

2.根据例程详细介绍1.CountSensor.c

CountSensor.h

main.c



前言

这一篇是通过对射式红外传感器计次实验来详细讲解EXTI中断以及使用方法


一、接线图

二、EXTI中断

1.什么是中断

中断系统:在主程序运行过程中,出现了特定的中断触发条件(中断源),使CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。

中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。

中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后一次进行返回。

2.什么是EXTI

EXTI(Extern Interrupt)是外部中断的意思;EXTI可以监测指定的GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立刻向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。

触发方式:上升沿/下降沿/双边沿/软件触发

支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断

通道数:16个GPIO_Pin,外加PVD输出,RTC闹钟,USB唤醒,以太网唤醒。

触发响应方式:中断响应/事件响应

3.什么是NVIC

NVIC是STM32用来管理中断,分配中断优先级的部分;

使用NVIC同意管理中断,NVIC的中断优先级总共有16个等级(每个中断通道都有),可对优先级进行分组,进一步设置抢占优先级和响应优先级。

4.NVIC基本结构:


三,配置中断

1.配置中断的流程

第一步,设置RCC,把涉及的时钟都打开
第二步,配置GPIO选择端口为输入模式
第三步,配置AFIO,选择我们用的这一路GPIO,然后连接后面的EXTI
第四步,配置EXTI,选择边沿触发方式,比如上升沿,下降沿或双边沿
第五步,配置NVIC,给我们的中断选择一个合适的优先级
最后通过NVIC,外设中断信号就能进入CPU了

2.根据例程详细介绍
1.CountSensor.c

#include "stm32f10x.h"                  // Device headeruint16_t CountSensor_Count;void CountSensor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启RCC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//选择我们想要的中断引脚,(选择某个GPIO外设作为外部中断源,指定要配置的外设中断线)//到这里,AFIO外部中断引脚选择配置就完成了//进入第四步,配置EXTIEXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line14;EXTI_InitStructure.EXTI_LineCmd = ENABLE; //开启中断EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//指定触发信号的有效边沿(下降沿触发)EXTI_Init(&EXTI_InitStructure);//这样PB14的信号就能够通过EXTI通向下一级NVIC了//最后,执行第五步:配置NVIC,因为NVIC是内核外设,所以它的库函数是被ST放在了misc里NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//先占优先级就是抢占优先级,从占优先级就是响应优先级//分组整个工程只需要执行一次,推荐放在main的最开始,如果放在模块里,要确保每个模块分组选的是同一个NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn ;//指定中断通道来开启或关闭NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//1.NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1 ;//2.  1和2都是设置中断优先级的,因为该工程只有一个中断,所以随意选择NVIC_Init(&NVIC_InitStructure);//至此,整个外部中断的配置结束//外部中断的信号从GPIO到AFIO再到EXTI,再到NVIC,最终通向CPU,这样才能让CPU由主程序跳转到中断程序执行}uint16_t CountSensor_Get(void)
{return CountSensor_Count;
}//在stm32里,中断函数的名字都是固定的,每个中断通道对应一个中断函数名字,可以到启动文件里查看
void EXTI15_10_IRQHandler(void) //中断函数均无参数无返回值
{if(EXTI_GetITStatus(EXTI_Line14)==SET)//看一下14的中断标志位是不是为1,此刻判断一下返回值是不是SET,如果是的话,就可以执行中断程序了{CountSensor_Count++;EXTI_ClearITPendingBit(EXTI_Line14);//将中断标志位清除}//中断程序结束后,一定要再调用一下清楚中断标志位的函数//如果不清除中断标志位,会一直申请中断,程序不断响应中断,执行中断函数,最终程序会卡死在中断函数里
}

CountSensor.h

#ifndef __COUNTSENSOR_H__
#define __COUNTSENSOR_H__void CountSensor_Init(void);#endif

在这里要注意的是,中断函数不需要声明,因为中断函数不需要调用,他是自动执行的

main.c

最后在main里调用

#include "stm32f10x.h"                  // Device header
#include "CountSensor.h"
#include "OLED.h"int main(void)
{CountSensor_Init();OLED_ShowString(1, 1,"Count:");while(1){OLED_ShowNum(1, 2, CountSensor_Get(), 5);}
}

通过对射式红外传感器计次实验讲解EXTI中断相关推荐

  1. STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...

  2. 7、江科大stm32视频学习笔记——中断的应用:对射式红外传感器计次旋转编码器计次

    目录 1.标志位函数 2. 初始化的中断的步骤 3.对射式红外传感器计次 (1)接线图 (2)CountSensor.c (3)main.c 4.旋转编码器计次 (1)接线图(旋转编码器接在PB1.P ...

  3. 对射式红外传感器计次

    通过中断实现,假设将GPIOA_Pin_14作为接受传感器信号的输入口.先初始化GPIOA口,然后配置AFIO复用IO口.然后配置中断,中断线必须选14中断线,对应IO口.然后配置NVIC,NVIC是 ...

  4. STM32单片机(五)第二节:EXTI外部中断练习1(对射式红外传感器计次)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分:建议先学习51单片机,其是STM32等高级单片机的基础:这样再学习STM32时才能融会贯通. ☀️ 专栏适 ...

  5. 5.2 对射式红外传感器旋转编码器计次

    对射式红外传感器 1.1 接线图 VCC GND分别接电源的正负极 DO数字输出端,随意选择一个GPIO口 1.2 硬件原理 当挡光片或者编码盘在对射式红外传感器中间经过时,DO就会输出电平变化信号, ...

  6. 对射式红外传感器模块、测速传感器模块、计数器模块、电机测试模块、槽型光耦模块

    文章目录 一.产品简介 二.原理分析 三.程序设计 四.程序源码 一.产品简介 该产品采用FTR9606高灵敏度槽型光耦器件,槽宽5mm.它由一个红外发光二极管和NPN光电三极管组成,M3固定安装孔, ...

  7. stm32F407 连接 对射式红外对管 样例

    本次样例,是利用 Led 灯来作为红外对管的显示,串口打印作为协助 stm32F407开发板上有两个led灯,DS0和DS1 所以需要编写的代码涉及:led.h.led.c.hong.c.hong.h ...

  8. STM32:红外传感器代码部分(内含实物图+外部信号流程,编写代码思路+代码+解析代码和扩展应用)

    1.实物连接图: 左下角的D0接任意一个空闲的IO口均可,此处接的是PB14.当对射式红外传感器被遮挡住时,D0发送中断信号给PB14并完成相关操作. 2.外部信号流程(代码部分编写的原理): 外部信 ...

  9. 使用游戏测试干式EEG传感器的有效性

    目录 导读 研究成果 方法与材料 A:干式EEG传感器的设计 B: 无线脑电图采集模块 C: 基于EEG的可穿戴BCI设备的机制 D: EEG信号进行游戏控制 评价指标 实验结果 结论 本分享为脑机学 ...

最新文章

  1. Charles是Mac的Fiddler抓包工具
  2. Call 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。
  3. 1.5 引入解释性变量
  4. jQuery的val()方法
  5. 去掉左边0_SLAM从0到1——11. 视觉里程计VO内容框架
  6. Python垃圾回收和内存管理
  7. html中span不显示背景
  8. virtual关键字
  9. 【读书笔记】《暗时间》
  10. 如何生成WIFI二维码供手机扫一扫连接WIFI
  11. 人生最大的难题是认清自己
  12. You have 3 unapplied migration(s). Your project may not work properly until you apply the migrations
  13. linux学习随手笔记
  14. 用ChatGPT可以去微博做个大V了(狗头)
  15. 窑尾烟室气体分析仪常见故障及处理
  16. leetCode1103
  17. 开启dubbo之旅——Dubbo Admin(新版)
  18. JVM内存与垃圾回收篇——堆
  19. 「微服务架构」基于NGINX的三种微服务参考架构
  20. python什么意思v_vpython是什么

热门文章

  1. Numpy 基本用法
  2. 数据要素时代,小微金融该如何打好风控数据创新牌?
  3. android studio 创建 jniLibs文件夹用于放置jar包和os文件
  4. 微软禁俄下载、开源投毒攻击、Rust不会重写Linux、开放原子峰会7月举办 | 开源月报 Vol. 07...
  5. php for循环教学,PHP for循环
  6. 登上健康快车教学反思
  7. 安智市场apk 签名问题 : 找不到xxx.jks的证书链。meimei.jks必须引用包含私有密钥和相应的公共密钥证书链的有效密钥库密钥条目。
  8. 超级计算机summit存储容量,越来越多的超级计算机
  9. P5.js开发之——基础Foundation(9)
  10. VMware NSX-V与NSX-T比较