STM32笔记—EXTI外部中断

news2024/11/23 4:26:49

一、简介

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

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

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

         (不用开启外设时钟:特殊)EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序

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

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

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

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

二、基本结构

        硬件中断选择:通过下面的过程来配置20个线路做为中断源:

         ● 配置20个中断线的屏蔽位(EXTI_IMR)

        中断屏蔽寄存器(EXTI_IMR)

       允许至NVIC中断寄存器:

        ● 配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);

        边沿检测电路---配置触发信号

 

        ● 配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。(最重要)逻辑即下图:

        AFIO复用:(记得开启 外设时钟)通过AFIO_EXTICRx配置GPIO线上的外部中断/事件,必须先使能AFIO时钟。112通用I/O端口以下图的方式连接到16个外部中断/事件线上:

        使用函数 GPIO_EXTILineConfig进行配置:

       

         要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器(上升沿还是下降沿),同时在中断屏蔽寄存器的相应位写’1’允许中断请求(如下图利用与门的特点,0&x = 0,1&x = x)。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。

        从上图还可以看出支持的触发方式:上升沿/下降沿/双边沿/软件触发,边沿检测电路进来后经过一个或门,或门是有1为1,故不管是软件中断寄存器进行触发还是边沿检测电路触发,都能触发中断,一路发生中断,一路是事件触发,同样都存在屏蔽寄存器。而请求挂起寄存器:

          此外,在配置nvic时还需要注意的是:EXTI9_5和EXTI15_10

          EXPORT ,表示本程序里面用到的变量提供给其他模块调用的。

                EXPORT EXTI0_IRQHandler
                EXPORT EXTI1_IRQHandler
                EXPORT EXTI2_IRQHandler
                EXPORT EXTI3_IRQHandler
                EXPORT EXTI4_IRQHandler
                EXPORT EXTI9_5_IRQHandler
               EXPORT EXTI15_10_IRQHandler
      中断线 0-4 每个中断线对应一个中断函数,中断线 5-9 共用中断函数 EXTI9_5_IRQHandler,中断线 10-15 共用中断函数 EXTI15_10_IRQHandler。

         NVIC配置代码:

    NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;		//选择配置NVIC的EXTI15_10线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//指定NVIC线路的抢占优先级为1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);								//将结构体变量交给NVIC_Init,配置NVIC外设

 三、外部中断代码实现

        外部中断一般配置步骤:
        1.初始换IO口为输入:GPIO_Init();

        2.开启IO口复用时钟:RCC_APB2PeriphClockCmd();

    /*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);		//开启AFIO的时钟,外部中断必须开启AFIO的时钟
	
	/*GPIO初始化*/
	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);						//将PB14引脚初始化为上拉输入

         为什么配置成上拉?

        3.设置IO口与中断线的映射关系: void GPIO_EXTILineConfig(); 

/*AFIO选择中断引脚*/
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//将外部中断的14号线映射到GPIOB,即选择PB14为外部中断引脚

        4.初始化线上中断,设置触发条件等:EXTI_Init();

    /*EXTI初始化*/
	EXTI_InitTypeDef EXTI_InitStructure;						//定义结构体变量
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;					//选择配置外部中断的14号线
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//指定外部中断线使能
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//指定外部中断线为中断模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;		//指定外部中断线为下降沿触发
	EXTI_Init(&EXTI_InitStructure);								//将结构体变量交给EXT

        5.配置中断分组(NVIC),并且使能中断:NVIC_Init();

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC为分组2
																//即抢占优先级范围:0~3,响应优先级范围:0~3
																//此分组配置在整个工程中仅需调用一次
																//若有多个中断,可以把此代码放在main函数内,while循环之前
																//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
	
	/*NVIC配置*/
	NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;		//选择配置NVIC的EXTI15_10线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//指定NVIC线路的抢占优先级为1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);	

        6.编写中断服务函数():EXTIx_IRQHandler();

        PxN管脚共用外部中断线EXTIN和外部中断向量EXTIN_IRQn和中断服务程序入口EXTIN_IRQHandler(这些都不能写错)

        7.清除中断标志位:EXTI_ClearITPendingBit();

/**
  * 函    数:EXTI15_10外部中断函数
  * 参    数:无
  * 返 回 值:无
  * 注意事项:此函数为中断函数,无需调用,中断触发后自动执行
  *           函数名为预留的指定名称,可以从启动文件复制
  *           请确保函数名正确,不能有任何差异,否则中断函数将不能进入
  */
void EXTI15_10_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line14) == SET)		//判断是否是外部中断14号线触发的中断
	{
		/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)
		{
			CountSensor_Count ++;					//计数值自增一次
		}
		EXTI_ClearITPendingBit(EXTI_Line14);		//清除外部中断14号线的中断标志位
													//中断标志位必须清除
													//否则中断将连续不断地触发,导致主程序卡死
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1187457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自制编程语言基于c语言实验记录之五:虚拟机

1.创建类与堆栈框架 1 )对象调用实例方法,也就是向一个对象发送消息 时,运行时系统会在对象所属类的方法集合中查找方法。 2 )类调用类方法,也就是向一个类发送消息时,运行时系统会在类的 meta-class 的 方…

Sysmon 日志监控

系统监视器 (Sysmon) 是一个 Windows 日志记录加载项,它提供精细的日志记录功能并捕获默认情况下通常不记录的安全事件。它提供有关进程创建、网络连接、文件系统更改等的信息。分析 Sysmon 日志对于发现恶意活动和安全威胁至关重要。 在不断…

浅谈智能变电站自动化系统的应用与产品选型

安科瑞电气股份有限公司 上海嘉定 201801 摘要:现如今,智能变电站发展已经成为了电力系统发展过程中的内容,如何提高智能变电站的运行效率也成为电力系统发展的一个重要目标,为了能够更好地促进电力系统安全稳定运行,…

单片机程序无法下载?

原因一:电源问题 电源可能是导致STM32微控制器无法下载程序的一个常见原因。确保电源稳定对于正常运行和下载程序至关重要。以下是一些电源问题: 1. 电源电压不足:如果STM32微控制器没有足够的电压供应,它可能无法正常工作或下载程…

【AICFD案例教程】电子机箱风冷散热分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件,用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程,帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

关于脑机接口实现的思考——再谈埃隆马斯克的脑机接口新动态

今天看到了埃隆马斯克的Neuralink的新动态,要招募志愿者进行试验,因此基于此前的文章,这里做一个新的探讨,第一篇文章在下面的链接,大家可以先过去看一下: 关于脑机接口该如何实现的考虑 埃隆马斯克的Neura…

评估APP网页小程序代码UI开发H5估价师怎么评估开发精确研发价格?

作为一名应用程序开发评估师,可能涉及到的主要任务是为特定的应用程序提供估算开发成本和所需时间预测。为了为一个应用程序更准确地评估价格,须遵循以下几个步骤: 问: 如何让一个App更好、更精确地评估出价格? 答: 以下是一个可…

MOSFET和IGBT栅极驱动器TLP250H(D4-TP1,F)电路的基本原理

TLP250H,TLP250H(D4-TP1,F)是SOP8封装中的光电耦合器,由GaA组成ℓ作为红外发光二极管(LED)光学耦合到集成的高增益、高速光电探测器IC芯片。它在高达125℃的温度下提供有保证的性能和规格. TLP250H具有内部法拉第屏蔽,…

浏览器插件实现国税网自动登录,以及解决浏览器记住密码会自动填充表单无法修改的问题

公司的做账系统,用户在系统里设置保存了国税网的账号密码以后,下次点击进入国税网,能够直接进入国税系统。 之前的解决方案是pupptteer模拟登录一遍拿到cookie等登录凭证后,保存到数据库,然后插件请求接口拿到cookie&…

柴油发电机负载测试的方法

柴油发电机负载测试是检查发电机组性能的重要环节,通过模拟实际工作负载,检测发电机组在不同负载下的运行情况,以确保其安全可靠地为用电设备提供电力。以下是柴油发电机负载测试的方法: 1. 准备工作:在进行负载测试之…

黔院长 | 黄帝内经:脏气法时论!

自然界有四季,四季更替影响万物的轮回。人体脏腑功能和气机运行与时间变化也有显著的影响。古人结合五脏之气,取四时五行的生克规律作为救治疾病的法则,对至今中医养生有重要参考作用! 五行,即木、火、土、金、水&…

C#Web文件上传的几种方式

1.第一种上传方式,基本通用于.net所有的框架 [HttpPost][Route("Common/uploadFile1")]public string uploads(){HttpContextBase context (HttpContextBase)Request.Properties["MS_HttpContext"];//获取传统contextHttpRequestBase request context.Re…

springbootMysql文华学院青年志愿者服务预约系统97973-计算机毕业设计项目选题推荐(附源码)

摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 文华学院青年志愿者服务预约系统,主要的模块包括管理员:后台首页、轮播图、通知公告管理、资源管理(新闻资…

人工智能-卷积神经网络(LeNet)

为了能够应用softmax回归和多层感知机,我们首先将每个大小为\(28\times28\)的图像展平为一个784维的固定长度的一维向量,然后用全连接层对其进行处理。 而现在,我们已经掌握了卷积层的处理方法,我们可以在图像中保留空间结构。 同…

数据分析:小红书新兴场景洞察,捕捉消费新势力

导语 飞盘、骑行,露营…如今,户外运动日渐被人们所喜爱。近年来,继飞盘和骑行后,一项新潮的户外运动越来越受到年轻人的欢迎,路亚钓鱼,越来越多年轻人在入坑钓鱼。 图 | 小红书 图 | 小红书 什么是“路亚…

11.(vue3.x+vite)组件间通信方式之ref与$parent、$children

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 注: (1)ref 加在标签(div等)上,是拿到dom 对象 (2)ref加上组件上,拿到的是组件的引用 (3)让父组件获取子组件的数据或者方法需要通过defineExpose对外暴露,另外让父组件获取子组件的数据或者方法需要通过d…

查看监控提示码流已加密,请切换至本地配置页面设置密钥后重启预览

环境: 硬盘录像机DS-8632N-I16 谷歌浏览器 问题描述: 查看监控提示码流已加密,请切换至本地配置页面设置密钥后重启预览 解决方案: 1.进入系统-安全管理-安全服务,关闭启用码流加密,保存 2.进入网络-高级配置-平…

AI:73-结合语法知识的神经机器翻译研究

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

Docker - 安装

Docker安装 Docker的基本组成 镜像(image): ​ Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像 -> run -> tomcat01容器(提供服务器),通过这个镜像可以创建多个…

【VUE+ elementUI 实现动态表头渲染】

VUE elementUI 实现动态表头渲染 1、定义 columns(表头数据) 和 dataList(表格数据) data() {return {loading: false,dataList: [{ name: 张三, sex: 男, age: 18 },{ name: 林琳, sex: 女, age: 20 },{ name: 王五, sex: 男, …