08:【stm32】中断二:EXTI(外部中断)

news2024/12/25 0:45:07

EXTI(外部中断)

  • 1、EXTI简介
  • 2、EXTI的内部结构
    • 2.1、EXTI通道
    • 2.2、内部寄存器
  • 3、EXTI的编写程序
    • 3.1、EXTI的编程接口
      • 3.1.1、EXTI_Init
  • 4、编写实验

1、EXTI简介

   外部中断控制器,能够检测外部输入信号的变化边沿并由此产生中断。通过检测上升沿或者下降沿来产生中断源

在这里插入图片描述

2、EXTI的内部结构

在这里插入图片描述
在这里插入图片描述

边沿检测检测到电平的跳变都会生成一个高脉冲信号,然后脉冲通过边沿选择传递到中断屏蔽,当中断屏蔽遇到脉冲时,打开开关,中断挂起有0->1,然后执行中断函数。【注】中断挂起需要手动置0。

2.1、EXTI通道

  EXTI一共有20个通道,分别为EXTI0~EXTI19。而IO0连接着EXTI0通道,IO1连接着EXTI1通道,以此类推。让所有IO具备触发中断的能力
在这里插入图片描述
当然,如果GPIOA0使用了EXTI0时,GPIOB0~GPIOG0都不能使用EXTI0了,所以每个通过也就只能使用一个IO口。

2.2、内部寄存器

在这里插入图片描述
如图:除了软件触发寄存器外,其他的寄存器都是20位的,分别对应着20个EXTI通道。

  • 当给上升沿寄存器的TR0写入1,给下降沿寄存器TR0写入0时,则EXTI0通道是上升沿产生一个中断源。如果都写入1,则上升沿和下降沿都能产生中断源。
  • 中断屏蔽寄存器是开关,写入1关闭开关,写入0打卡开关
  • 挂起寄存器,我们只需要手动置0,每次中断函数执行完成后,我们都应该给他置0,以便等待下一次中断

3、EXTI的编写程序

3.1、EXTI的编程接口

在这里插入图片描述
在这里插入图片描述

3.1.1、EXTI_Init

在这里插入图片描述
为什么不开启EXTI的时钟?因为啊默认都是打开了的。

4、编写实验

   按钮通过外部中断控制LED灯的亮灭。下面是程序编写模型

在这里插入图片描述
其中AFIO用于选择IO引脚

在这里插入图片描述
代码①:

/*按钮通过外部中断控制LED灯的亮灭。*/
#include "stm32f10x.h"
#include "stm32f10x_pal.h"
#include "OLED.h"


int main(void)
{
//	PAL_Init();
//	OLED_Init();
	//1.PA0,PA1,PC13引脚的初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;//按钮
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//配置为上拉输入
	GPIO_Init(GPIOA ,&GPIOInitStruct);
	
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;//LED
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//配置为开漏输出
	GPIO_Init(GPIOC,&GPIOInitStruct);
	
	//2.AFIO选择通道
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择EXTI0
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);//选择EXTI1
	
	//3.对EXTI0,EXTI1通道进行配置
	//3.1.对EXTI0进行配置
	EXTI_InitTypeDef EXTIInitStruct;
	EXTIInitStruct.EXTI_Line = EXTI_Line0;
	EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿产生中断源
	EXTIInitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTIInitStruct);
	
	//3.2.对EXTI1进行配置
	EXTIInitStruct.EXTI_Line = EXTI_Line1;
	EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿产生中断源
	EXTIInitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTIInitStruct);
	
	//4.对NVIC进行配置
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	//4.1.对中断源0进行配置
	NVIC_InitTypeDef NVICInitStruct;
	NVICInitStruct.NVIC_IRQChannel = EXTI0_IRQn;
	NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVICInitStruct.NVIC_IRQChannelSubPriority = 0;
	NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVICInitStruct);
	///4.1.对中断源1进行配置
	NVICInitStruct.NVIC_IRQChannel = EXTI1_IRQn;
	NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVICInitStruct.NVIC_IRQChannelSubPriority = 0;
	NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVICInitStruct);
	while(1)
	{
		
	}
}
	//5.中断响应函数
	void EXTI0_IRQHandler(void)
	{	
		EXTI_ClearITPendingBit(EXTI_Line0);//清除中断状态
		GPIO_WriteBit(GPIOC ,GPIO_Pin_13,Bit_RESET);//给ODR写入0,点亮LED
	}
	
	void EXTI1_IRQHandler(void)
	{
		EXTI_ClearITPendingBit(EXTI_Line1);//清除中断状态
		GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);//熄灭LED
	}

使用GPIOA5,GPIOA6进行中断,我们为什么要学习这2个引脚的中断喃?因为这2个引脚是共用一个中断,如下图:EXTI5~EXTI9共用一个中断。

在这里插入图片描述在这里插入图片描述

代码②:

#include "stm32f10x.h"
#include "stm32f10x_pal.h"
#include "OLED.h"


int main(void)
{
//	PAL_Init();
//	OLED_Init();
	//1.PA0,PA1,PC13引脚的初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;//按钮
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//配置为上拉输入
	GPIO_Init(GPIOA ,&GPIOInitStruct);
	
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;//LED
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//配置为开漏输出
	GPIO_Init(GPIOC,&GPIOInitStruct);
	
	//2.AFIO选择通道
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource5);//选择EXTI0
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource6);//选择EXTI1
	
	//3.对EXTI0,EXTI1通道进行配置
	//3.1.对EXTI0进行配置
	EXTI_InitTypeDef EXTIInitStruct;
	EXTIInitStruct.EXTI_Line = EXTI_Line5;
	EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿产生中断源
	EXTIInitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTIInitStruct);
	
	//3.2.对EXTI1进行配置
	EXTIInitStruct.EXTI_Line = EXTI_Line6;
	EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿产生中断源
	EXTIInitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTIInitStruct);
	
	//4.对NVIC进行配置
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	//4.1.对中断源0进行配置
	NVIC_InitTypeDef NVICInitStruct;
	NVICInitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
	NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVICInitStruct.NVIC_IRQChannelSubPriority = 0;
	NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVICInitStruct);
	while(1)
	{
		
	}
}
	//5.中断响应函数
	void EXTI9_5_IRQHandler(void)
	{	
		if(EXTI_GetFlagStatus(EXTI_Line5) == SET)//代表EXTI5产生中断源
		{
			EXTI_ClearITPendingBit(EXTI_Line5);//清除中断状态
			GPIO_WriteBit(GPIOC ,GPIO_Pin_13,Bit_RESET);//给ODR写入0,点亮LED
		}
		if(EXTI_GetFlagStatus(EXTI_Line6) == SET)//代表EXTI6产生中断源
		{
			EXTI_ClearITPendingBit(EXTI_Line6);//清除中断状态
			GPIO_WriteBit(GPIOC ,GPIO_Pin_13,Bit_SET);//给ODR写入1,熄灭LED
		}
	}

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

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

相关文章

BugKu CTF Misc:密室逃脱 铁子,来一道 想要种子吗 哥哥的秘密

前言 BugKu是一个由乌云知识库(wooyun.org)推出的在线漏洞靶场。乌云知识库是一个致力于收集、整理和分享互联网安全漏洞信息的社区平台。 BugKu旨在提供一个实践和学习网络安全的平台,供安全爱好者和渗透测试人员进行挑战和练习。它包含了…

Sql语句出现ORA-00933: SQL command not properly ended的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 执行sql语句的时候出现如下问题: ORA-00933: SQL command not properly ended截图如下所示: 2. 原理分析 ORA-00933: SQL command not properly ended 是 Oracle 数据库中的错误,指示 SQL 语句存在语法问题 MySQL 和…

聚观早报 | 马斯克xAI新计划;iPhone SE 4将配A18芯片

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 8月13日消息 马斯克xAI新计划 iPhone SE 4将配A18芯片 真我GT7 Pro参数曝光 谷歌Pixel 9 Pro Fold最新配色 苹果…

TikTok达人影响力解析:品牌出海中的信任桥梁与口碑加速器

在全球化背景下,品牌出海已成为企业拓展市场的必然选择。然而,在陌生的国际市场上,如何快速建立品牌信任、提升品牌知名度、并实现有效的口碑传播,成为了企业面临的巨大挑战。在这一过程中,TikTok达人发挥着不可替代的…

systemverilog绿皮书随记(八)-- 功能覆盖率

代码覆盖率: 路径覆盖率:在穿过代码和表达式的路径中有哪些已经被执行过行覆盖率: 源代码中每一行代码是否被执行至少一次翻转覆盖率:哪些单比特变量的值为0或1有限状态机覆盖率:状态机中哪些状态和状态转换已经被访问过 语句覆…

Think | 大模型迈向AGI的探索和对齐

注:节选自我于24年初所写的「融合RL与LLM思想探寻世界模型以迈向AGI」散文式风格文章,感兴趣的小伙伴儿可以访问我的主页置顶或专栏收录,并制作了电子书供大家参考,有需要的小伙伴可以关注私信我,因为属于技术散文风格…

NVDLA专题2:具体模块介绍——Bridge DMA

对于NVDLA,输入图像和处理结果存储在外部DRAM中,但外部DRAM带宽和延迟通常不足以让NVDLA充分利用其MAC阵列。因此,NVDLA给片内SRAM配置了第二个存储器接口。 为了利用片内SRAM,NVDLA需要在外部DRAM和SRAM之间移动数据。Bridge DM…

Ubuntu20.04 运行深蓝路径规划hw1

前言 环境: ubuntu 20.04 ; ROS版本: noetic; 问题 1、出现PCL报错:#error PCL requires C14 or above catkin_make 编译时,出现如下错误 解决: 在grid_path_searcher文件夹下面的CMakeLis…

若依导出自定义数据处理器

我在编写导出的时候,由于若依的Excel注解基本功能不满足我的需求 比如说我想导出这种样式,30和31天导出时全勤,其他天数显示原本天数 遂了解若依自定义数据处理器 1.首先来到实体类 给注解加上handler和args /** 出勤情况 */Excel(name &…

解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』

解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』 哈喽小伙伴们好,我是Stark-C~ 作为一个喜欢折腾的数码党,我平时上网冲浪使用的浏览器绝不会只限于一种,就比如说我在上班的地方只会用到Edge浏…

项目管理者必读:全生命周期系统选择技巧

国内外主流的10款国外项目管理软件对比:PingCode、Worktile、Trello、Monday.com、ClickUp、Jira、Asana、Tapd、Tower、Teambition。 在管理复杂项目时,选对工具是成功的关键。全生命周期项目管理系统不仅可以帮助你保持项目的进度和预算控制&#xff0…

Windows10配置FFmpeg和使用FFmpeg截取视频流视频

第一部分:Windows10配置FFmpeg 简介:FFmpeg是一个功能强大的多媒体处理工具(用于录制、转换和播放音频和视频)。可以进行转换、剪辑、拼接、过滤等操作。 1、下载FFmpeg工具(分Windows和Linux其他) Download FFmpeghttps://ffm…

【MySQL】执行DDL选择Online DDL还是PT-OSC?

目录 1.前言2.Online DDL和PT-OSC原理、执行机制以及优缺点2.1.Online DDL2.2.PT-OSC 3.各种常用DDL操作如何选择 1.前言 MySQL DDL(Data Definition Language)表结构变更,主要支持Online DDL和PT-OSC模式,但是即使知道两者的工作…

谷粒商城实战笔记-173~174-商城业务-检索服务-搭建页面环境-调整页面

文章目录 一,173-商城业务-检索服务-搭建页面环境1,引入thymeleaf2,search模块导入模板页面3,配置域名4,上传静态资源到nginx的html目录5,nginx配置5.1 域名监听配置5.2 静态资源静态配置 6,sea…

Altium Designer 18原理图器件自动标号

前言: 当我们绘制原理图时,元器件的位号是不会自动生成的,位号大都是乱的,造成出图时十分不和谐。 器件位号修改 第一种方法: 可以先修改一个器件位号,按住shift 键然后再拖动器件会生成一个新的&…

Python面试宝典第33题:电话号码的字母组合

题目 给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合,答案可以按任意顺序返回。给出数字到字母的映射如下图(与手机按键相同)。注意:1不对应任何字母。 示例 1: 输入:digits &quo…

【网络】IP的路径选择——路由控制

目录 路由控制表 默认路由 主机路由 本地环回地址 路由控制表的聚合 网络分层 个人主页:东洛的克莱斯韦克-CSDN博客 路由控制表 在数据通信中,IP地址作为网络层的标识,用于指定数据包的目标位置。然而,仅有IP地址并不足以确…

Linux 进程间通信之管道

个人主页:仍有未知等待探索-CSDN博客 专题分栏: Linux 目录 一、通信 1、进程为什么要通信? 1.数据的类型 2.父进程和子进程算通信吗? 2、进程如何通信? 3、进程通信的常见方式? 二、管道 1、概念…

SpringBoot中整合Mybatis

一、Mybatis快速入门 1.1、在相应的模块中添加依赖的坐标 首先创建一个maven项目 在对应的pom.xml文件中引入下面的依赖 <dependencies><!--mybatis 依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artif…

【已解决】如何解决雅马哈机械手无法连接到在线模式的问题

前言 在一个项目中用到了雅马哈机器手&#xff0c;但是现场操作的时候进场出现连接不上的问题&#xff0c;经过与官方技术讨论得出以下的解决方法。 解决方法 避免这个问题出现在操作完之后必须将机械手控制器切换成离线模式。主要原因&#xff1a;1、机械手控制器本身是属…