【STM32零基础入门教程03】GPIO输入输出之GPIO框图分析
本章节主要讲解点亮LED的基本原理,以及GPIO框图的讲解。
如何点亮LED(输出)
首先我们查看原理图,观察电路图中LED的连接情况,如下图可以看出我们的板子中LED一端通过限流电阻连接的PB0另一端连接的是高电平VCC,那么我们将PB0位置接地是不是灯就亮了,那我们就想办法在这一端通过单片机让这一端接地就可以了,具体怎么做到我们循序渐进后面一点点慢慢来。(和我使用的板子不一样也没有关系,原理是相通的我们学会原理其他的就不算问题了)。
如何识别按键是否按下(输入)
如下图所示当我们的开关闭合时单片机IO口引脚处的电压为GND,这样我们就可以通过单片机读取单片机IO的电平状态判断按键是否闭合了,具体怎么使用我们看下文。
GPIO的基本概念
通过上面的讲解我们已经知道了如何点亮LED灯,那么我们用单片机如何控制呢?这里需要引入GPIO的概念。
通常我们管GPIO叫做通用输入输出口,这里的关键词输入输出,我们点亮LED需要用到这个输出功能。我们接下来看下,在STM32单片机中是如何实现的输入输出功能。
上图是我们在STM32中文参考手册中找到的关于GPIO的框图,需要注意的是这个框图位于芯片内部,图中I/O引脚处表示的是单片机的引脚,这个引脚与芯片外部相连,像我们说的PB0就是一个I/O引脚。
GPIO输入分析
接下来我们来详细分析这个IO口框图,首先看上半部分,这部分表示的是输入,如下图所示。
IO口引脚连接一个电压时,电流会按照箭头的方向流动,首先我们看下1处,这里由两个二极管组成,通常情况下在STM32单片机里VDD表示3.3V那么vss就是表示0V。当1处的电压大于3.3V时,比如5V那么二极管这的电压分布情况就如下图所示。
可以看到二极管正极为5V负极为3.3V,那这里就产生了一个5V减去3.3v的压降,那么二极管就导通了,这高出的电压就被二极管分担了,所以能在一定程度上保护内部电路。下面的保护二极管同理。
接下来我们像向里走,2处这里经过了两个电阻,一个电阻接VDD叫上拉电阻,一个电阻接VCC叫下拉电阻。两个电阻处都有开和关字样,这就意味着这两个上下拉电阻我们是可以通过软件进行配置的。先看上拉电阻,当上拉电阻开关闭合2处如果没有外部电压输入,那么我们这里就是VDD的电压,这里的作用显而易见(可以在外部没有电平变化的情况下给一个默认的高电平VDD),假如外部IO引脚与地连接,那么这一点的状态可以等效为下图所示。
现在2处的电平为GND,那么我们在软件里就可以做判断了如果电平为高电平也就是1表示外面没有接低电平,反之为接低电平了(对应文章开始的图表示开关闭合了),那么如果这个上拉电阻不闭合呢?开关闭合能够识别到低电平,但是不闭合时的状态就不确定了,显然不是稳定的。(下拉电阻同样的道理)在这里我们看到了三种输入状态,上拉电阻闭合时叫上拉输入即电平默认状态为高电平,下拉电阻闭合时叫下拉输入即电平默认状态为低电平,如果上拉下拉都不闭合叫做浮空输入即默认电平状态不确定。
下面我们接着向里走,3处有个电子元器件叫施密特触发器,他的主要作用是做电压比较的,在STM32中当IO引脚处接电压,电压经过保护二极管上下拉电阻到达施密特触发器时如果电压值大于2V,那么施密特触发器输出高电平即输入数据寄存器(4处)(如果不知道寄存器是什么可以百度搜搜,这里不赘述了)会存入一个1,其实就是输入数据寄存器对应位变为了VDD通常情况下为3.3V,那么如果这个电压低于1.8V那么施密特触发器就输出低电平,4处的输入数据寄存器就会存入一个低电平。这时候我们是不是就可以通过读取输入数据寄存器里面的值判断,IO引脚处接的是低电平还是高电平了,文章开始的开关是不是就可以判断有没有闭合了(闭合读到的是低电平)。可能有人注意到了1.8V和2V之间怎么办?这就是一个不确定输入状态了。
5和6处我们还没有说,这两个比较特殊。先看5处,这里没有经过施密特触发器也就是说,外界输入多少电压就进去多少电压,这叫模拟输入(具体ADC章节会用到),6处经过了施密特触发器也就意味着只有0和1两种状态,这叫复用功能输入,后面会讲这里可以忽略。
GPIO输出框图分析
好了GPIO的输入框图分析完了,我们可以看下输出了,输出我们从单片机里面向外看,先上图。
图中0处先不用纠结,后面我们具体学寄存器时再回头看更容易些,先看1到2,这里我们对输出数据寄存器写1之后,1到了3处这是个选择器,选择上下两个线哪一个过去,下面是复用功能输出不用管他,我们假设选了上面的这跟线,这样3处的状态为1高电平状态,这里输出控制里少画了一个元器件,这个元器件叫反相器,即当我们3处为1高电平状态时4处为0低电平状态。这里又遇到了两个电子元器件,PMOS和NMOS,不要害怕这个我们只看4处的高低电平这两个元器件有什么影响就可以了。
先看上面这个PMOS当a处为低电平时b到c导通就相当于b和c之间有一个开关,a处为低电平时开关闭合,那么VDD也就是3.3V按照红线的方向导通,如果IO引脚处连接一个负极接地的发光二极管是不是发光二极管就亮了。这种情况叫输出高电平。接下来我们看NMOS。
如图当a处为高电平时b和c导通,相当于b和c之间有一个开关闭合了,这时如果外面接一个发光二极管,二极管正极接了VCC当NMOS处b和c之间的开关闭合,是不是电流就顺着vcc一直流到了vss处,那么灯就亮了。
我们总结下,当输出数据寄存器写1时经过反相器变为0,这时候PMOS导通IO引脚输出高电平,当输出数据寄存器写0时经过反相器变为1,这时候NMOS导通IO引脚输出低电平。
文章到这里就结束了,希望对您有所帮助,下章我们分析GPIO相关寄存器,并且使用寄存器点亮LED灯。
相关文章:

【STM32零基础入门教程03】GPIO输入输出之GPIO框图分析
本章节主要讲解点亮LED的基本原理,以及GPIO框图的讲解。 如何点亮LED(输出) 首先我们查看原理图,观察电路图中LED的连接情况,如下图可以看出我们的板子中LED一端通过限流电阻连接的PB0另一端连接的是高电平VCC…...

高效管理,PDM系统与BOM系统携手合作
在现代制造业中,PDM系统(Product Data Management,产品数据管理)和BOM系统(Bill of Materials,物料清单管理)都扮演着关键的角色。PDM系统负责产品数据的统一管理,而BOM系统则专注于…...
Elasticsearch 使用scroll滚动技术实现大数据量搜索、深度分页问题 和 search
基于scroll滚动技术实现大数据量搜索 如果一次性要查出来比如10万条数据,那么性能会很差,此时一般会采取用scroll滚动查询,一批一批的查,直到所有数据都查询完为止。 scroll搜索会在第一次搜索的时候,保存一个当时的视…...

了解Swarm 集群管理
Swarm 集群管理 简介 Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。 支持的工具包括但不限…...

【Docker】Docker私有仓库的使用
目录 一、搭建私有仓库 二、上传镜像到私有仓库 三、从私有仓库拉取镜像 一、搭建私有仓库 首先我们需要拉取仓库的镜像 docker pull registry 然后创建私有仓库容器 docker run -it --namereg -p 5000:5000 registry 这个时候我们可以打开浏览器访问5000端口看是否成功&…...

基于arcFace+faiss开发构建人脸识别系统
在上一篇博文《基于facenetfaiss开发构建人脸识别系统》中,我们实践了基于facenet和faiss的人脸识别系统开发,基于facenet后续提出来很多新的改进的网络模型,arcFace就是其中一款优秀的网络模型,本文的整体开发实现流程与前文相同…...
C#设计模式(15)命令模式(Command Pattern)
命令模式(Command Pattern) 命令模式是一种数据驱动的设计模式,属于行为型模式类别。请求被包装在一个对象中作为命令,并传递给调用对象。调用对象寻找可以处理该命令的合适对象,并将命令传递给相应的对象,…...

快速排序和qsort函数详解详解qsort函数
💕是非成败转头空,青山依旧在,几度夕阳红💕 作者:Mylvzi 文章主要内容:快速排序和qsort函数详解 前言: 我们之前学习过冒泡排序,冒泡排序尽管很方便,但也存在一些局限性…...

搭建 elasticsearch8.8.2 伪集群 windows
下载windows 版本 elasticsearch8.8.2 以下链接为es 历史版本下载地址: Past Releases of Elastic Stack Software | Elastic windows 单节点建立方案: 下载安装包 elasticsearch-8.8.2-windows-x86_64.zip https://artifacts.elastic.co/download…...

C++ 运算符重载为成员函数
运算符重载实质上就是函数重载,重载为成员函数,他就可以自由访问本类的数据成员。实际使用时,总是通过该类的某个对象来访问重载的运算符。 如果是双目运算符,左操作数是对象本身的数据,由this指针指出,右…...

51单片机程序烧录教程
STC烧录步骤 (1)STC单片机烧录方式采用串口进行烧录程序,连接的方式如下图: (2)所以需要先确保USB转串口驱动是识别到,且驱动运行正常;是否可通过电脑的设备管理器查看驱动是否正常…...

Linux C++ 链接数据库并对数据库进行一些简单的操作
一.引言(写在之前) 在我们进行网络业务代码书写的时候,我们总是避免对产生的数据进行增删改查,为此,本小博主在这里简历分享一下自己在Linux中C语言与数据之间交互的代码的入门介绍。 二.代码书写以及一些变量和函数的…...
Linux进程间通信--msgsnd函数的作用
msgsnd函数用于将消息发送到消息队列中。它的原型如下: int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数解释: msqid:消息队列标识符,由msgget函数返回。msgp:指向要发送的消息的指针&…...

P1629 邮递员送信(最短路)(内附封面)
邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点 1 1 1。他总共要送 n − 1 n-1 n−1 样东西,其目的地分别是节点 2 2 2 到节点 n n n。由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有 m m m 条道路。这…...

网络安全--原型链污染
目录 1.什么是原型链污染 2.原型链三属性 1)prototype 2)constructor 3)__proto__ 4)原型链三属性之间关系 3.JavaScript原型链继承 1)分析 2)总结 3)运行结果 4.原型链污染简单实验 1)实验一 2࿰…...

Harbor企业镜像仓库部署
目录 一、Harbor 架构构成 二、部署harbor环境 1、安装docker-ce(所有主机) 2、阿里云镜像加速器 3、部署Docker Compose 服务 4、部署 Harbor 服务 5、启动并安装 Harbor 6、创建一个新项目 三、客户端上传镜像 1、在 Docker 客户端配置操作如下…...
【AI】《动手学-深度学习-PyTorch版》笔记(十一):分类问题-softmax回归
AI学习目录汇总 1、线性回归和softmax回归的区别 1)连续值与离散值 线性回归模型,适用于输出为连续值的情景。 softmax回归模型,适用于输出为离散值的情景。例如图像类别,就需要对离散值进行预测。softmax回归模型引入了softmax运算,使输出更适合离散值的预测和训练。 …...
【排序算法略解】(十种排序的稳定性,时间复杂度以及实现思想)(含代码)(完工于2023.8.3)
文章目录 1、冒泡排序/选择排序/插入排序冒泡排序(Bubble Sort)选择排序(Selection Sort)插入排序(Insertion Sort) 2、希尔排序(Shells Sort)3、快速排序(Quick Sort)4、堆排序(Heap Sort)5、归并排序(Merge Sort)6、桶排序/计数排序/基数排序桶排序(Bucket sort)计数排序(Cou…...

学编程实用网站
牛客网:面试刷题和面试经验分享的网站牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)https://www.nowcoder.com/ 慕课网:在线学习 慕课网-程序员的梦工厂 (imooc.com)https://www.imooc.com/ …...
Camunda 7.x 系列【5】 员工请假流程模型
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 模型设计2.1 基础配置2.2 启动事件2.3 填写请假单2.4 上级领导审批3.5 经理审批3…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...

【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...
C++ 变量和基本类型
1、变量的声明和定义 1.1、变量声明规定了变量的类型和名字。定义初次之外,还申请存储空间,也可能会为变量赋一个初始值。 如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量: e…...
LeetCode第244题_最短单词距离II
LeetCode第244题:最短单词距离II 问题描述 设计一个类,接收一个单词数组 wordsDict,并实现一个方法,该方法能够计算两个不同单词在该数组中出现位置的最短距离。 你需要实现一个 WordDistance 类: WordDistance(String[] word…...