【STM32】GPIO口以及EXTI外部中断

news2024/9/20 18:41:40

在这里插入图片描述
个人主页~
有关结构体的知识在这~
有关枚举的知识在这~


GPIO口以及EXTI外部中断

  • GPIO
    • 一、简介
    • 二、基本结构
    • 三、输入输出模式
      • 1、输入模式
        • (1)上拉输入
        • (2)下拉输入
        • (3)浮空输入
        • (4)模拟输入
      • 2、输出模式
        • (1)推挽输出
        • (2)开漏输出
        • (3)复用推挽输出
        • (4)复用开漏输出
  • EXIT外部中断
    • 一、中断系统
    • 二、STM32中断
      • 1、NVIC的基本结构
      • 2、NVIC优先级分组
  • 三、EXTI简介
  • 四、EXTI实现

GPIO

一、简介

可配置为4种输入模式、4种输出模式

引脚电平0~3.3V,部分可以容忍5V

输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等

输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

二、基本结构

在这里插入图片描述
每一个GPIO口都由寄存器和驱动器组成,寄存器的每一位对应一个引脚,内核可以通过APB2总线对寄存器进行读写,输出(输入)寄存器写1引脚输出(输入)高电平,输出(输入)寄存器写0引脚输出(输入)低电平,因为STM32是32位的单片机,而引脚只有16个,所以寄存器只有低16位有对应的端口,驱动器用来增大驱动能力,寄存器只存储数据
在这里插入图片描述

三、输入输出模式

一个端口只能有一个输出,但可以有多个输入,所以在输入时,输出驱动器是关闭的,在输出时,输入驱动器是开启的
在这里插入图片描述
当最右边I/O引脚输入高于VDD电压时,上方保护二极管被导通,电流进入不到电路中
当最右边I/O引脚输入低于VSS电压时,下方保护二极管被导通,电流进入不到电路中
所以可输入的电流范围在VSS~VDD

不管是输入输出模式,都会涉及到数字数据与模拟数据的转换,输入部分是通过触发器和输入数据寄存器,输出部分是通过MOS管和输出控制

1、输入模式

在这里插入图片描述
上半部分是输入电路

(1)上拉输入

上拉输入和下拉输入都是通过stm32控制的,可以自己决定上拉、下拉、浮空,并且上拉电阻和下拉电阻的阻值都很大,所以对电路的影响不是很大

上拉输入就是输入驱动器上方开关接通,此时内部连接上拉电阻,是一种默认为高电平的输入方式

在引脚输入高电平时,输入高电平,引脚输入低电平时,输入低电平:
在这里插入图片描述

引脚浮空(没有输入)时,输入高电平:
在这里插入图片描述
然后通过触发器,这里的触发器作用是给信号整形,因为在输入的过程中信号可能会失真,
触发器的作用:当数据高于上阈值时输出高电平,低于下阈值时输出低电平,在中间晃悠的不变化
在这里插入图片描述
然后这个数据就写入输入数据寄存器,由程序读取寄存器某一位的数据就可以知道端口的输入电平了

然后是复用功能输入这根线连接到其他需要读取端口状态的外设上,接收数字量

(2)下拉输入

下拉输入就是输入驱动器下方开关接通,此时内部连接下拉电阻,是一种默认为低电平的输入方式

在引脚输入高电平时,输入高电平,引脚输入低电平时,输入低电平:
在这里插入图片描述

在引脚浮空时,输入低电平:
在这里插入图片描述

(3)浮空输入

当上拉电阻和下拉电阻同时断开时,此时引脚处于浮空输入状态,此时输入高电平为高电平,输入低电平为低电平

当引脚处于浮空状态时,输入不确定,任意稍微的影响都有可能导致输入发生变化

小总结:不管是上拉输输入、下拉输入还是浮空输入,优先保证I/O口的输入如果为高电平(低电平),那么输入一定是高电平(低电平),变化只是在引脚处为浮空输入时有变化,我们一般使用浮空输入(多数情况下)和上拉输入(在有外界干扰的情况下),很少使用下拉输入

当使用浮空输入时最好使用一个连续的驱动,防止输入浮空

(4)模拟输入

在这里插入图片描述

接收模拟量,接到触发器前边,直接接收真实信号

2、输出模式

在这里插入图片描述
下半部分是输出电路

数字数据由输出数据寄存器或外设控制,输出数据寄存器控制输出直接接普通I/O口,外设控制输出则需要使用AFIO口,也就是复用功能IO口

输出数据寄存器还接一个位设置/清除寄存器,用来随时更改输出数据寄存器的某一位上的值
通过将位设置寄存器某一位改为1(不需置输出数据寄存器某一位为1的都为0),那么对应的那一位的输出数据寄存器的值就设置为1
通过将位清除寄存器的某一位改为1(不需置输出数据寄存器某一位为0的都为0),那么对应的那一位的输出数据寄存器的值就设置为0

(1)推挽输出

在推挽输出模式下,P-MOS管、N-MOS管均可以使用
MOS管就相当于一个开关,只是这个开关可以用来转换信号
数据寄存器为1时,上管导通,下管断开,引脚直接接VDD,输出高电平
数据寄存器为0时,上管断开,下管导通,引脚直接接VSS,输出低电平

在推挽输出模式下STM32对I/O口有绝对的控制权,高低电平的输出都是由STM32决定的

(2)开漏输出

在开漏输出模式下,P-MOS管不可用,N-MOS管可用
数据寄存器为1时,下管断开,此时引脚处为高阻态(无驱动能力)
数据寄存器为0时,下管导通,引脚接VSS,输出低电平(有驱动能力)

在引脚外接一个上拉电阻到5V的电源,当输出低电平时N-MOS接VSS,输出高电平时,上拉电阻将电压拉高至5V

(3)复用推挽输出

同推挽输出,不过是由外设控制的,不是数据寄存器控制的

(4)复用开漏输出

同开漏输出,不过是由外设控制的,不是数据寄存器控制的

EXIT外部中断

一、中断系统

在主程序运行过程中,出现了特定的中断触发条件,也叫中断源,使得CPU暂停当前正在运行的程序,去处理中断程序,处理完成后再返回原来的位置继续执行主程序

当有多个中断源同时申请中断时,CPU会先相应优先级更高的中断源,优先级是可以自己设置的

当一个中断程序正在运行时,又有新的优先级更高的中断源申请中断,CPU暂停当前中断程序,去处理该优先级更高的中断程序,处理完后返回该中断程序

二、STM32中断

STM32使用NVIC统一管理中断,每个中断通道有16个可编程的优先级,优先级可再分为抢占优先级和响应优先级

1、NVIC的基本结构

在第一篇的博文里提到过外设表,外设表中的前两个是内核外设,NVIC就是一个内核外设,是用来管理中断的

在这里插入图片描述

每个中断都可以直接连接到NVIC上,NVIC通过分配优先级确定每个中断的先后顺序,它同一时间只会上交一个中断给CPU,让CPU处理中断

2、NVIC优先级分组

NVIC的中断优先级由优先级寄存器的4位决定,这4位可以分为高n位的抢占优先级和低4-n位的相应优先级,当抢占优先级和响应优先级均相同时按照中断号排队

抢占优先级和响应优先级分为五组

组别(位数以及取值范围)抢占优先级相应优先级
00位,04位,0~15
11位,0~13位,0~7
22位,0~32位,0~3
33位,0~71位,0~1
44位,0~150位,0

三、EXTI简介

EXTI可以监测指定GPIO的电平信号,当电平变化时,EXTI向NVIC发出中断申请

支持上升沿、下降沿、双边沿、软件触发
上升沿:电平由低电平变为高电平的瞬间触发中断
下降沿:电平由高电平变为低电平的瞬间触发中断
双边沿:上升沿和下降沿都可以触发中断
软件触发:程序代码执行触发中断

任意GPIO口都可以当做外部中断的引脚,但GPIO后边跟的数字相同不能触发中断,这个数字叫做pin,也就是说PA0和PB0不能同时做中断引脚,如果需要多个中断引脚的话pin值不能相同,原因是GPIO连接到AFIO上,起到中断引脚选择的作用,AFIO从pin值相同的通道里选择一个接到EXTI边沿检测及控制电路上,一共选择16个,也就是PA0、PB0、PC0只能有一个接到EXTI边沿检测及控制电路上,再加上PVD、RTC、USB、ETH四个特殊外设一共20个输入信号,经过EXTI分为两种输出:NVIC触发中断,其他外设触发事件响应

这里5 ~ 9、10 ~ 15整合到一条通道上了,一条通道上的触发同一个中断函数,在中断函数里还需要标志位才能区分到底是哪一个中断进来的
在这里插入图片描述

如果发生EXTI外部中断,可以发生中断响应或者事件响应,中断响应就是执行中断程序,事件响应就是操作外设而不触发中断

四、EXTI实现

在这里插入图片描述

上方是总线和外设接口,输入先遇到边沿检测电路,当上升沿时上升沿触发选择寄存器为1,下降沿时下降沿触发选择寄存器为1,它们两个只要有一个为1,边沿检测电路就可以为通路

之后遇到的这个元器件叫做或门,执行逻辑或的操作,当软件中断事件寄存器和边沿检测电路传来的数据中有一个为1则为1,全为0则为0

然后线路分为两路,左路对应的是事件响应,上路对应的是中断响应

左路连接的元器件叫做与门,执行逻辑与的操作,如果事件屏蔽寄存器和全为1则为1,有一个为0则为0,然后连接到脉冲发生器,脉冲发生器起到将数字信号转变为模拟信号的作用

上路连接请求挂起寄存器,可以通过读取该寄存器知道是哪个通道触发的中断,如果该寄存器置1,就继续往左走,与中断屏蔽寄存器连接到一个与门上,最后连接到中断控制器NVIC执行中断程序


今日分享就到这里了~

在这里插入图片描述

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

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

相关文章

【Python】面向对象的程序设计

一、面向对象的介绍 1.对象 对象是一种抽象概念,表示客观世界存在的实物,现实世界中能够看到的、触碰到的都可以成为对象,如:人、大象、小猫等。 对象通常分为两个部分,即静态部分和动态部分。静态部分为“属性”&a…

UE4 SLUA IOS打包报错解决办法

IOS打包报错:Fatal error "lua.h" file not found : SLua Unreal 在IOS远程打包编译的时候 Exteral没有copy过去,导致lua.h文件报错找不到,看了网上也没有写解决办法 错误信息截图: github上也有很多遇到改…

【每日一题】【动态规划(DP) 】【分治 迭代】“葡萄城杯”牛客周赛 Round 53 D题 小红组比赛 C++

“葡萄城杯”牛客周赛 Round 53 D题 小红组比赛 题目背景 “葡萄城杯”牛客周赛 Round 53 题目描述 小红希望出一场题目,但是他的实力又不够,所以他想到可以从以前的比赛中各抽一题,来组成一场比赛。不过一场比赛的难度应该是有限制的&a…

【nginx】nginx日志出现on文件

问题描述 生产发现容器里多出了一个on文件,非常大。 去看nginx配置已经这样保持16个月了(已经去掉其他无关内容) 原因解释 这个问题是因为nginx配置了access_log on; 有两个知识点: 1.access_log只有off的特殊值&#xff0c…

三菱电火花设备采集

三菱电火花机器一般情况下应该很少能见到,但在模具行业应该说是一种常见的加工设备。 一、通过官方手册采集数据 1.资料使用 连接方式: 这里重点关注下端口是1112 这里主要讲NC的状态转换 我们重点关注的是状态相关命令,手册中还支持NC程序上传和下载,感兴趣的话可以研究…

排序算法:堆排序,golang实现

目录 前言 堆排序 代码示例 1. 算法包 2. 堆排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 堆排序的思想 堆排序的实现逻辑 1. 构建最大堆 2. 排序 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行排序 假如 30 条数据进行排序 假设 5000 条数据…

数据库——战德臣

1. 数据存储体系 1.1 计算机系统的存储体系 1.将不同性价比的存储组织在一起,满足高速的、大容量、低价格需求 2.CPU与内存直接交换信息,按存储单元(存储字)进行访问 3.外存按存储块进行访问,其信息先装入内存&…

NSSCTF-GDOUCTF 2023新生赛

[GDOUCTF 2023]hate eat snake 考察:js代码审计 打开题目,发现需要坚持60秒,那么简单的一个思路就是修改得分的变量>60即可 办法1:修改变量 右键查看源代码,之后发现有一个snake.js的文件,ctrlf搜索i…

健康小贴士丨中考考生怎么吃得好?

文章目录 引言三餐最佳的进食时间引言 中考正值初夏,气温急剧升高,食物易滋生细菌,发生食物中毒的风险也随之增加,医生建议 选择新鲜的食材,煮熟煮透,现吃现做,尽量不食用剩饭剩菜;不在路边露天摊点、不到无证和食品安全状况差的餐馆用餐;尽量减少在外就餐和点外卖的…

客服中心:高效知识库管理,6步提高70%用户体验

在当今快节奏的商业环境中,客服中心作为企业与客户沟通的重要桥梁,其运作的顺畅与否直接影响着客户的满意度和忠诚度。而知识库作为客服中心的核心资源之一,其管理水平的高低更是直接影响着客服的工作效率和问题解决能力。本文将深入探讨一系…

Django之JsonResponse对象

【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 在Django框…

“LangChain实战:探索回调函数的应用

前言 毫无疑问,2024将是人工智能丰收年,开始寒假的我,准备先把LangChain捋一遍。 这篇文章来学习下callback机制, 之前聊过AutoGen的callback机制,我们来对比下。 回调和异步 作为js开发者,对于回调函数…

springboot智能健康管理平台-计算机毕业设计源码57256

摘要 在当今社会,人们越来越重视健康饮食和健康管理。借助SpringBoot框架和MySQL数据库的支持,开发智能健康管理平台成为可能。该平台结合了小程序技术的便利性和SpringBoot框架的快速开发能力,为用户提供了便捷的健康管理解决方案。 通过智能…

无线磁吸充电宝哪个牌子值得入手?什么牌子磁吸充电宝性价比高?

在当下科技日新月异的时期,无线磁吸充电宝成为了众多电子设备用户的得力助手。然而,面对市场上众多品牌和型号的无线磁吸充电宝,消费者常常陷入选择的困境:到底哪个牌子值得入手?什么牌子的磁吸充电宝性价比高&#xf…

【JavaScript】详解默认导出和命名导出的区别

文章目录 一、默认导出二、命名导出三、默认导出和命名导出的区别四、实际应用案例五、总结 在JavaScript模块化开发中,导入和导出模块是核心操作。ES6引入的模块化语法提供了两种主要的导出方式:默认导出(default export)和命名导…

【2024蓝桥杯/C++/B组/宝石组合】

代码来源2024第十五届蓝桥杯 C/CB组真题题解_蓝桥杯2024b组c语言答案-CSDN博客 证明s的简化式子

【Linux】命令行通配符

Linux在文件管理方面提供了丰富的功能,例如通配符,它是一种用于匹配文件名的特殊字符。通配符在Linux中可以帮助我们更加方便和快捷地查找和操作文件。 1.命令行通配符 通配符是一种特殊语句,主要有星号(*)、问号(?)等表示,用来…

记一个搞笑的自写类加载TemplatesImpl

今天没事想自己写个CC3类加载 结果为了顺利触发到TemplatesImpl#getTransletInstance的newInstance给我整急眼了,使劲改字段强行通过循环 结果搞了个下面的代码出来 import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; import com.sun.org.apa…

手机买对不买贵!性价比之王再升级,致敬奋斗者

众所周知,比起旗舰机,中端机一年要发几次新款机型,因此,一两千元的价位段就尤其的卷。那此时作为消费者的我们就是赚了,花更少的钱就能买到更好的产品。华为畅享70S这款手机是今年最新的一款针对性价比用户推出的千元机…