第14章. GPIO简介

目录

0. 《STM32单片机自学教程》专栏

14.1 GPIO基本结构

14.1.1 保护二极管 

14.1.2 上拉、下拉电阻 

14.1.3 施密特触发器

14.1.4  P-MOS 管和 N-MOS 管

14.1.5 输出数据寄存器

14.1.6 输入数据寄存器

14.2 GPIO工作模式

14.2.1 输入模式

14.2.1.1 输入浮空模式

14.2.1.2 输入上拉模式 

14.2.1.3 输入下拉模式

14.2.1.4 模拟输入模式

14.2.2 输出模式 

14.2.2.1 推挽输出模式

14.2.2.2 开漏输出模式


0. 《STM32单片机自学教程》专栏

        本文作为专栏《STM32单片机自学教程》专栏其中的一部分,返回专栏总纲,阅读所有文章,点击Link:  

STM32单片机自学教程-[目录总纲]_stm32 学习-CSDN博客     

        从本章开始我们就要开始外设等相关模块的介绍。 我们首先要介绍的就是GPIO,因为我认为GPIO是最基础也是最重要的一个外设功能。那么后续针对每一个外设,我们大致都会从下面几个部分进行讲解:

        1.硬件结构及原理

        2.相关寄存器

        3.相关库函数

        4.实例练习

14.1 GPIO基本结构

        GPIO 有八种工作模式,为讲清楚这些模式的实现原理,我们需要先讲解GPIO的基本结构,总的框图如图14.1-1所示。右边I/O 引脚就是我们可以看到的芯片实物的引脚,其余部分均为GPIO 的内部结构。 

图14.1-1 GPIO的基本结构图

14.1.1 保护二极管 

        引脚的两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于VDD 时,上方的二极管导通,当引脚电压低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。 虽然有二极管的保护,但这样的保护却很有限,大电压大电流的接入很容易烧坏芯片。

14.1.2 上拉、下拉电阻 

        上下拉电阻的阻值大概在30~50K欧之间,可以通过上、下两个对应的寄存器控制开关。当引脚外部的器件没有干扰引脚的电压时,即没有外部的上、下拉电压,引脚的电平由引脚内部上、下拉决定。内部上拉电阻工作时引脚电平为高电平,内部下拉电阻工作时,则引脚电平为低电平。如果内部上、下拉电阻都不开启,这种情况就是浮空模式。浮空模式下引脚的电平是不可确定的。引脚的电平可以由外部的上、下拉电平决定。由于上下拉电阻的阻值较大,STM32的内部上拉是一种“弱上拉”,这样的上拉电流很弱,如果有要求大电流还是得外部上拉。

14.1.3 施密特触发器

        图中的TTL肖特基触发器即为施密特触发器,当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变。也就是说输出由高电平翻转为低电平,或是由低电平翻转为高电电平对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。这种双阈值动作被称为迟滞现象。我们软件开发种经常用到“滞环调节”,是一个道理,一个经常的应用场景是防止在边界附件来回震荡。施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波信号。

14.1.4  P-MOS 管和 N-MOS 管

        这种双MOS管结构,主要控制GPIO的开漏输出和推挽输出两种模式。这里我们只用记住,PMOS输入低电平时导通,NMOS输入高电平时导通即可。详细内容,后面还会介绍。

14.1.5 输出数据寄存器

        刚到的双MOS管结构电路的输入信号,是由GPIO“输出数据寄存器GPIOx_ODR”提供的,因此我们通过修改输出数据寄存器的值就可以修改GPIO引脚的输出电平。也可以通过“置位/复位寄存器GPIOx_BSRR”修改输出数据寄存器的值,来控制电路的输出。

14.1.6 输入数据寄存器

        GPIO引脚经过内部的上、下拉电阻,可以配置成上/下拉输入,然后再连接到施密特触发器,信号经过触发器后,模拟信号转化为0、1的数字信号,然后存储在“输入数据寄存器GPIOx_IDR”中,通过读取该寄存器就可以了解GPIO引脚的电平状态。

14.2 GPIO工作模式

        GPIO有八种工作模式,分别如下,我们分输入,输出和复用功能3个大类进行描述。

        1、输入浮空

        2、输入上拉

        3、输入下拉

        4、模拟输入

        5、开漏输出

        6、推挽输出

        7、开漏式复用功能

        8、推挽式复用功能

14.2.1 输入模式

        在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器GPIOx_IDR读取I/O状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。

14.2.1.1 输入浮空模式

        上拉/下拉电阻为断开状态,施密特触发器打开,输出被禁止。输入浮空模式下,IO口的电平完全是由外部电路决定。如果IO引脚没有连接其他的设备,那么检测其输入电平是不确定的。该模式通常用于按键检测等场景。

图14.2-1 输入浮空模式 

14.2.1.2 输入上拉模式 

        上拉电阻导通,施密特触发器打开,输出被禁止。在需要外部上拉电阻的时候,可以使用内部上拉电阻,这样可以节省一个外部电阻,但是内部上拉电阻的阻值较大,所以只是“弱上拉”,不适合做电流型驱动。

图14.2-2 输入上拉模式 

14.2.1.3 输入下拉模式

        下拉电阻导通,施密特触发器打开,输出被禁止。在需要外部下拉电阻的时候,可以使用内部下拉电阻,这样可以节省一个外部电阻,但是内部下拉电阻的阻值较大,所以不适合做电流型驱动。  

图14.2-3 输入上拉模式 

14.2.1.4 模拟输入模式

        此模式下上下拉电阻断开,施密特触发器关闭,双 MOS 管也关闭。其他外设可以通过模拟通道输入输出。该模式下需要用到芯片内部的模拟电路单元单元,用于ADC/DAC等操作模拟信号的外设。  

        当GPIO引脚用于ADC采集电压的输入通道时,用作“模拟输入”功能,此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有0、1两种状态,所以ADC外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。同样,当GPIO引脚用于DAC作为模拟电压输出通道时,此时作为“模拟输出”功能,DAC的模拟信号输出就不经过双MOS管结构,模拟信号直接输出到引脚。

图14.2-4 模拟输入模式 

14.2.2 输出模式 

        输出模式主要是由双MOS管的开闭控制来实现的,画了一个示意图,如图14.2-5所示。在输出模式中,推挽模式时双MOS管以轮流方式工作,输出数据寄存器GPIOx_ODR可控制I/O输出高低电平。开漏模式时,只有N-MOS管工作,输出数据寄存器可控制I/O输出高阻态或低电平。输出速度可配置,有2MHz\10MHz\50MHz的选项。此处的输出速度即I/O支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。

        在输出模式时施密特触发器是打开的,即可通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。

        下面我们分别进行介绍。

图14.2-5 输出模式控制示意图

14.2.2.1 推挽输出模式

图14.2-6 推挽模式等效电路 

        推挽输出模式,是根据这两个MOS管的工作方式来命名的。在该结构中输入高电平时,经过反向后,上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平;而在该结构中输入低电平时,经过反向后,N-MOS管导通,P-MOS关闭,对外输出低电平。当引脚高低电平切换时,两个管子轮流导通,PMOS管负责灌电流-“推”,NMOS管负责拉电流-“挽”,使其负载能力和开关速度都比普通的方式有很大的提高。推挽输出的低电平为0伏,高电平为3.3伏,如上图所示推挽输出模式时的等效电路。 

        由于推挽输出模式下输出高电平时,是直接连接 V DD ,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达 25mA,但是芯片的总电流有限,所以并不建议这样用,最好还是使用芯片外部的电源。 

14.2.2.2 开漏输出模式

图14.2-7 开漏输出等效电路 

        在开漏输出模式时,上方的P-MOS管完全不工作。如果我们控制输出为0低电平,N-MOS管导通,使输出接地,若控制输出为1(它无法直接输出高电平)时,则P-MOS管和N-MOS管都关闭,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须外部接上拉电阻,等效电路如上图。它具有“线与”特性,也就是说,若有很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平0。 

        那么开漏输出模式的应用场景是什么的?总结下来主要有2个:

        1.电平不匹配的场合 

        STM32输出的高电平是3.3V,如果外部需要更高或者更低的电压,那么推挽输出就不合适了。此时就可以在外部接一个上拉电阻,上拉电源为外部需要的电压,如5V,并且把GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5伏的电平,输出低电平时则输出低电平0V,如图14.2-8。

图14.2-8 开漏模式输出5V电压 

        2.需要“线与”功能的总线电路 

        如 I2C通讯等需要“线与”功能的总线电路中一般要用开漏模式。多个控制器全部输入1高阻态时则为1,只要有一个为低电平,那么整个电路就是0.此时推挽输出模式就不可以了,因为有的控制器输入1,PMOS导通,有的控制器输入0,NMOS导通,此时双MOS管都存在导通的情况,直接就短路了。

未完待续.....

参考资料:

        【1】哔站江协科技STM32入门教程

        【2】《STM32单片机原理与项目实战》刘龙、高照玲、田华著

        【3】《ARM Cortex-M3嵌入式原理及应用》黄可亚著

        【4】《STM32嵌入式微控制器快速上手》陈志旺著

        【5】《STM32单片机应用与全案例实践》沈红卫等著

        【6】《野火STM32开发指南》

        【7】《正点原子STM32开发指南》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 18.04 server源码编译安装freeswitch 1.10.7支持音视频通话、收发短信——筑梦之路

软件版本说明 ubuntu版本18.04:https://releases.ubuntu.com/18.04.6/ubuntu-18.04.6-live-server-amd64.iso freeswitch 版本1.10.7:https://files.freeswitch.org/freeswitch-releases/freeswitch-1.10.7.-release.tar.gz spandsp包:https:…

【电路笔记】-共发射极放大器

共发射极放大器 文章目录 共发射极放大器1、概述2、完整的CEA配置3、直流等效电路4、交流等效电路5、输入阻抗6、输出阻抗7、电压增益8、微分电容的重要性9、信号源的衰减10、电流增益11、相位反转12、总结1、概述 在本文中,我们将介绍基于双极晶体管的放大器的最后一种拓扑:…

51-52Windows密码安全性测试与Windows提权

目录 Windows密码安全性测试 一、本地管理员密码如何直接提取 1、直接通过mimikatz读取管理员密码 2、使用laZagne工具读取管理员密码 二、利用Hash远程登录系统 window提权 三、远程webshell执行命令解决 不能执行原因: 解决方法:单独上传cmd.e…

Leetcode84 柱状图中最大的矩形

题目描述 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积 解题思路 思路一:暴力寻找,从每个位置出发,向左右两边扩…

Android View点击事件分发原理,源码解读

View点击事件分发原理,源码解读 前言1. 原理总结2.1 时序图总结2.2 流程图总结 2. 源码解读2.1 Activity到ViewGroup2.2 ViewGroup事件中断逆序搜索自己处理点击事件ViewGroup总结 2.3 ViewOnTouchListeneronTouchEvent 3. 附录:时序图uml代码 前言 两年…

Windows Api如何创建一个快捷方式并且在开始菜单搜索到自己的应用

原文链接:http://cshelloworld.com/home/detail/1804473083243925504 当我们点击win10系统搜索框的时候,输入名称 ,win10会帮助我们匹配到对应的应用。这里搜索框实际上就是windows系统的开始菜单。 接下来我们随便找一个应用,右…

Adobe XD最新2023资源百度云盘下载(附教程)

如大家所了解的,Adobe XD是一种基于矢量的UI和UX设计工具,可用于设计从智能手表应用程序到成熟网站的任何内容,功能非常强大且操作便捷。目前最新已推出2023版本。 Adobe XD解决了Photoshop和其他图形应用程序无法解决的两个主要问题&#xf…

LSSS算法实现,基于eigen和pbc密码库【一文搞懂LSSS,原理+代码】

文章目录 一. LSSS简介1.1 概述1.2 线性秘密分享方案(LSSS)与 Shamir的秘密分享方案对比LSSS1.2.1 Shamir的秘密分享方案1.2.2 线性秘密分享方案(LSSS)1.2.3 主要区别 二. 基于矩阵的LSSS加解密原理分析2.1 LSSS矩阵构造2.1.1 定义…

Bytebase 对接本地部署的 llama3 开启ChatSQL功能

Bytebase 是为开发人员、测试、DBA和运维工程师构建的数据库 DevOps 领域的,类 GitLab/GitHub 平台。 这篇文章主要关注 Bytebase SQL 编辑器中的 AI 增强功能。使用此功能您可以使用自然语言在 Bytebase SQL 编辑器中查询数据库。同时还能给出针对查询的索引建议&…

WSL+Anconda(pytorch深度学习)环境配置

动机 最近在读point cloud相关论文,准备拉github上相应的code跑一下,但是之前没有深度学习的经验,在配置环境方面踩了超级多的坑,依次来记录一下。 一开始我直接将code拉到了windows本地来运行,遇到了数不清的问题&a…

骑马与砍杀-战团mod制作-基础篇-武器模型入骑砍(二)

骑马与砍杀战团mod制作-基础-武器模型入骑砍笔记(二) 资料来源 学习的资料来源: b站【三啸解说】手把手教你做【骑砍】MOD,基础篇,链接为: https://www.bilibili.com/video/BV19x411Q7No?p4&vd_sour…

【Python】已解决:安装python-Levenshtein包时遇到的subprocess-exited-with-error问题

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例及解决方案五、注意事项 已解决:安装python-Levenshtein包时遇到的subprocess-exited-with-error问题 一、分析问题背景 在安装python-Levenshtein这个Python包时,有时会…

Applied Spatial Statistics(七):Python 中的空间回归

Applied Spatial Statistics(七):Python 中的空间回归 本笔记本演示了如何使用 pysal 的 spreg 库拟合空间滞后模型和空间误差模型。 OLS空间误差模型空间滞后模型三种模型的比较探索滞后模型中的直接和间接影响 import numpy as np impor…

【人工智能】—XGBoost算法在构建互联网防火墙异常行为识别模型应用案例

摘要: 近年来,各地党委、政府加快推进新型工业化,部署实施制造强市战略,提出工业企业“智改数转”是推动全市工业经济稳增长的重要引擎,更是稳增长、促发展的重要抓手。今天博主就以互联网防火墙异常行为识别为例给大家…

js实现canvas截图功能

关键代码 使用canvas的导出功能和drawImage函数 class CropShape{cropShape(shape){let {x,y,w,h} shapeconsole.log(x,y,w,h)const roiCanvas document.createElement(canvas);document.getElementById(app).append(roiCanvas)const roiCtx roiCanvas.getContext(2d);roi…

CTO的职责是什么?

看《架构思维》作者是这样讲的: CTO 到底是做什么的? 我当下的答案是:“CTO 就是一个从技术视角出发,为公司或者所在的部门做正确决策的 CEO。”怎么理解这句话呢?作为一个 CTO,其长期目标和决策优先级与…

vscode用vue框架2,续写登陆页面逻辑,以及首页框架的搭建

目录 前言: 一、实现登录页信息验证逻辑 1.实现登录数据双向绑定 2.验证用户输入数据是否和默认数据相同 补充知识1: 知识点补充2: 二、首页和登录页之间的逻辑(1) 1. 修改路由,使得程序被访问先访问首页 知识点补充3&am…

经典机器学习方法(7)—— 卷积神经网络CNN

参考:《动手学深度学习》第六章 卷积神经网络(convolutional neural network,CNN)是一类针对图像数据设计的神经网络,它充分利用了图像数据的特点,具有适合图像特征提取的归纳偏置,因而在图像相…

信息安全基础知识(完整)

信息安全基础知识 安全策略表达模型是一种对安全需求与安全策略的抽象概念表达,一般分为自主访问控制模型(HRU)和强制访问控制模型(BLP、Biba)IDS基本原理是通过分析网络行为(访问方式、访问量、与历史访问…

程序猿大战Python——面向对象——继承进阶

方法重写 目标:掌握方法的重写。 当父类的同名方法达不到子类的要求,则可以在子类中对方法进行重写。语法: class 父类名(object):def 方法A(self):代码... class 子类名(父类名):def 方法A(self):代码... 例如,一起来完成&…