STM32单片机(三)第一节:GPIO输出

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习STM32单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

STM3单片机安装软件、各种资料以及源码的路径:
链接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取码:asdf

链接里压缩包的解压密码:32

本大节主要学习GPIO通用输入输出口,包含两部分,第一小节主要学习GPIO的输出,第二小节是写三个简单的程序进行练习,分别是LED闪烁、LED流水灯、蜂鸣器等;第三小节是学习GPIO输入,第四小节是写两个简单的程序进行练习,分别是按键控制LED和光敏传感器控制蜂鸣器;
本小节主要学习GPIO的基础知识、GPIO的输出、以及STM32外部设备和电路;

文章目录

  • 一、GPIO基础知识
    • 1.1 GPIO简介
    • 1.2 GPIO基本结构
    • 1.3 GPIO位结构
      • 1.3.1 输入部分
      • 1.3.2 输出部分
    • 1.4 GPIO模式
  • 二、STM32外部设备和电路
    • 2.1 LED和蜂鸣器介绍
    • 2.2 LED和蜂鸣器硬件电路
    • 2.3 面包板

一、GPIO基础知识

1.1 GPIO简介

在这里插入图片描述

  • GPIO的引脚电平是0V~3.3V;数据0就是低电平,也就是0V,数据1就是高电平,也就是3.3V;部分引脚可容忍5V,容忍5V的意思是可以在这个端口输入5V的电压,也认为是高电平;但是对于输出而言,最大就只能输出3.3V,因为供电就只有3.3V;具体哪些端口可以容忍5.5V,可以参考一下STM32的引脚定义;如下图所示:
    在这里插入图片描述
    带FT的就是可以容忍5V的,不带FT的,就只能介入3.3V的电压;

  • 关于第四条,我们此节要演示的现象,比如LED和蜂鸣器,就使用到了GPIO的输出模式,另外在其他场景,只要是可以用高低电平来进行控制的地方,都可以用GPIO来完成;如果是控制的功率比较大的设备,只需要再加入驱动电路即可;除此之外,我们可以用GPIO来模拟通讯协议,比如I2C、SPI或者某个芯片特定的协议,我们都可以用GPIO的输出模式来模拟其中的输出时序部分;

  • 关于第五条,输入模式最常见的就是读取按键了;用来捕获我们的按键按下事件,另外也可以读取带有数字输出的一些模块;比如我们套件里的光敏电阻模块、热敏电阻模块等;如果这个模块输出的是模拟量,那GPIO还可以配置成模拟输入的模式,再配合内部的ADC外设,就能直接读取端口的模拟电压了;除此之外,模拟通信协议时,接受数据通信上的数据,也是靠GPIO的输入来完成的;

1.2 GPIO基本结构

在这里插入图片描述

上图是GPIO的整体构造,左边是APB2外设总线,其在STM32系统结构图的位置如下图所示:

在这里插入图片描述
在STM32中,所有的GPIO都是挂载在APB2外设总线上的,其中GPIO外设的名称是按照GPIOA、GPIOB、GPIOC等等这种方式来命名的;每个GPIO外设,总共有16个引脚,编号是0~15;例如GPIOA的第0个引脚,我们称它为PA0,GPIOA的第1个引脚称为PA1,以此列推,一直到PA15;

在每个GPIO模块内,主要包含了寄存器和驱动器这些东西;寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,这样就可以完成输出电平和读取电平的功能了;寄存器的每一位对应着一个引脚,其中输出起存器写1,对应的引脚就会输出高电平,写0,就输出低电平;输入寄存器读取1,就证明对应的端口目前是高电平,读取0,就是低电平;

因为STM32是32位的单片机,所以STM32内部的寄存器都是32位的,但是这个端口只有16位,所以这个寄存器只有低16位对应有端口 ,高16位是没有用到的;

在GPIO基本结构图中,驱动器是用来增加信号的驱动能力的,寄存器只负责存储数据,如果要进行点灯这样的操作的话,还是需要驱动器来负责增大驱动能力;

以上这些就是GPIO的整体基本结构了。

1.3 GPIO位结构

在这里插入图片描述

下面来看一下GPIO中每一位的具体电路结构,上图就是STM32参考手册中的GPIO位结构的电路图了;左边三个是寄存器,中间部分是驱动器,最右边就是某一个IO口的引脚了;

在这里插入图片描述

整体结构可以分为两部分,上面是输入部分,下面是输出部分。

在这里插入图片描述

1.3.1 输入部分

在输部分,首先是这个IO引脚,可以看到IO口上下都结了两个保护二极管,这是对输入电压进行限幅的,上面这个二极管接VDD,3.3V,下面接VSS,0V;如果输入电压比3.3V还要高,那上方的这个二极管就会导通,输入电压产生的电流就会直接流入Vdd而不会流入内部电路,如下图:

在这里插入图片描述
这样就可以避免过高的电压对内部这些电路产生伤害;

同样的,如果输入电压比0V还要低,这个电压是相对于VSS的电压,所以是可以有负电压的,那这时下方这个二极管就会导通,电流会从VSS直接出去,也是可以保护内部电路的,如下图所示:

在这里插入图片描述

如果输入电压在0~3.3V之间,那两个二极管均不会导通,这时二极管对电路没有影响,这就是保护二极管的用途;

接下来如果是正常电压,电流的流向如下图所示:

在这里插入图片描述
这里连接了一个上拉电阻和一个下拉电阻,上拉电阻是VDD,下拉电阻是VSS,这个开关是可以通过程序进行配置的;如果上面导通,下面断开,就是上拉输入模式;如果下面导通,上面断开,就是下拉输入模式;如果两个都断开,就是浮空输入模式;

上拉和下拉的作用是为了给输入提供一个默认的输入电平的,因为对应一个数字的端口,输入不是高电平就是低电平,如果输入引脚什么都不接,那到底算是高电平还是低电平呢?所以实际情况是,如果输入啥都不接,这时输入就处于一种浮空的状态,引脚的输入电平极易受到外界干扰而改变,就像是一个物体悬浮在太空一样,它的位置是不确定的,受到一点扰动就会变化;为了避免引脚悬空导致的输入数据不确定,我们就需要在这里加上上拉或者下拉电阻了;

如果接入上拉电阻,当引脚悬空时,还有上拉电阻来保证引脚是高电平,所以上拉输入又可以称为是默认为高电平的输入模式,如下图所示:

在这里插入图片描述

下拉也是同理,就是默认为低电平的输入方式;

在这里插入图片描述

再往后是TTL肖特基触发器,其实英文文档里写的是施密特触发器,所以这里写肖特基触发器其实是一个翻译错误;这个施密特触发器的作用就是对输入电压进行整形的,它的执行逻辑是,如果输入电压大于某一阈值,输出就会瞬间升为高电平;如果输入电压小于某一阈值,输出就会瞬间降为低电平;能够抗干扰;

在这里插入图片描述

接下来经过施密特触发器整形的波形就可以直接写入输入数据寄存器了,如上图,我们再用程序读取输入数据寄存器对应的某一位的数据,就可以知道端口的输入电平了;

在这里插入图片描述

最后上面还有两路线路,这些就是链接到片上外设的一些端口,其中有模拟输入,这个是连接到ADC上的,因为ADC需要接受模拟量,所以这根线是接到施密特触发器前面的;另一个是复用功能输入,这个连接到其他需要读取端口的外设上的,比如串口的输入引脚等,这根线接收的是数字量,所以在施密特触发器的后面;

1.3.2 输出部分

在这里插入图片描述

输出部分可以由输出数据寄存器或片上外设控制,两种控制方式通过这个数据选择器接到了输出控制部分,如上图所示,如果选择输出数据寄存器进行控制,就是普通的IO口输出,写这个数据寄存器的某一位就可以操作对应的某个端口了;

在这里插入图片描述

左边还有个叫做位设置/清除寄存器,这个可以用来单独操作输出数据寄存器的某一位,而不影响其他位,因为这个输出寄存器同时控制16个端口,并且这个寄存器只能整体读写,所以如果想单独控制某一个端口而不影响其他端口的话,就需要一些特殊的操作方式,第一种方式是先读出这个寄存器,然后用按位与和按位或的方式更改某一位,最后再将更改后的数据写回去,在C语言中就是&=|=操作;这种方法比较麻烦,效率并不高,对于IO口的操作而言不太适合;第二种方式是通过设置这个位设置和位清除寄存器,如果我们要对某一位进行置1的操作,在位设置寄存器的对应位写1即可,剩下的不需要操作的位写0,这样它内部就会有电路,自动将输出数据寄存器中对应位置为1,而剩下的写0的位则保持不变;这样就保证了只操作其中某一位而不影响其他位,并且这是一步到位的操作; 如果想对某一位进行清零的操作,就在位清除寄存器的对应位写1即可,这样内部电路就会把这一位清0了; 这就是第二种方式也就是这个位设置和位清除寄存器的作用;另外还有第三种方式,那就是读写STM32中的“位带”区域,不再详细讲述;

在这里插入图片描述

输出控制之后就接到了两个MOS管,上面是P-MOS,下面是N-MOS,这个MOS管就是一种电子开关,我们的信号来控制开关的到同和关闭,开关负责将IO口接到VDD或者VSS;在这里可以选择推挽、开漏或关闭三种方式;

  • 在推挽输出模式下,P-MOS和N-MOS均有效,数据寄存器位1时,上管导通,下管断开,输出直接接到VDD,就是输出高电平;数据寄存器位0时,上管断开,下管导通,输出直接接到VSS,就是输出低电平;这种模式下,高低电平均有较强的驱动能力,所以推挽模式也可以叫强输出模式;在推挽模式下,STM32对IO口具有绝对的控制权,高低电平都由STM32说了算;
  • 在开漏输出模式下,这个P-MOS是无效的,只有N-MOS在工作,输出寄存器为1时,下管断开,这是输出相当于断开,也就是高阻模式;数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平;这种模式下,只有低电平具有驱动能力,高电平是没有驱动能力的;这个模式的用处就是开漏模式可以用作通信协议的驱动方式,如果I2C通信的引脚,用到就是开漏模式; 在多机通信的情况下,这个模式可以避免各个设备之间的相互干扰;另外开漏模式还可以用于输出5V的电平信号,比如IO口外接一个上拉电阻到5V的电源;当输出低电平时,由内部的N-MOS直接接VSS,当输出高电平时,由外部的上拉电阻拉高至5V;这样就可以输出5V的电平信号,用于兼容一些5V电平的设备;
  • 在关闭输出模式下,当引脚配置位输入输出模式的时候,这两个MOS管都无效,也就是输出关闭,端口的电平由外部信号来控制

这些就是GPIO位结构的全部介绍了。

1.4 GPIO模式

在这里插入图片描述

以上是GPIO的8中工作模式,通过GPIO端口配置寄存器,上一小节介绍的位结构电路就会根据我们的配置进行改变,比如开关的通断、N-MOS和P-MOS是否有效、数据选择器的选择等;这个端口的电路就可以配置成上图中的8种模式。

在使用浮空输入时,端口一定要接上一个连续的驱动源,不能出现悬空的状态;

浮空输入、上拉输入、下拉输入的电路图如下图所示:

在这里插入图片描述

模拟输入的电路图如下图所示:

在这里插入图片描述

在这里插入图片描述

其他地方都断开,只有模拟输入这一条路有用;所以当我们使用ADC的时候,将引脚配置位模拟输入就行了;其他时候一般用不到模拟输入;

开漏输入和推挽输入的电路结构如下图所示:

在这里插入图片描述
复用开漏输出和复用推挽输出的电路图如下所示:

在这里插入图片描述

二、STM32外部设备和电路

2.1 LED和蜂鸣器介绍

在这里插入图片描述

  • LED图标,左边是正极,右边是负极
  • LED实物图:左边(较小的一半)是正极,右边(较大的一半)是负极;
  • 本学习过程用的就是有源蜂鸣器,低电平触发

2.2 LED和蜂鸣器硬件电路

在这里插入图片描述

左边两个图是使用STM32的GPIO口驱动LED的电路,

  • 上面这个是低电平驱动的电路,LED正极接3.3V,负极通过一个限流电阻接到PA0上,当PA0输出低电平时,LED两端就会产生电压差,就会产生正向导通的电流,这样LED就会点亮;反之当PA0输出高电平时,因为LED两端都是3.3V的电压,灯则不会被点亮;中间的限流电阻一方面可以保护LED灯不会因电流过大时而烧毁,另一方面可以调整LED的亮度;
  • 下面这个图是高电平驱动的电路,正极通过一个限流电阻接到PA0上,这时就是高电平点亮,低电平熄灭了。

在单片机中,一般倾向于使用第一种接法;

左边两个图是使用STM32的GPIO口驱动蜂鸣器的电路,使用了三极管开关的驱动方案,三极管开关是最简单的驱动电路了,对于功率稍微大一点的,直接使用IO口驱动会导致STM32负担过重,这时就可以用一个三极管驱动电路来完成驱动的任务

  • 上面这个图是PNP三极管的驱动电路,三极管的左边是基极,带箭头的是发射极,剩下的是集电极;左边的基极给低电平,三极管就会导通,那通过3.3V和GND,就可以给蜂鸣器提供驱动电流了;反之基极给高电平,三极管截止,蜂鸣器就没有电流。
  • 下面这个图是NPN三极管的驱动电路,同样左边是基极,带箭头的是发射极,剩下的是集电极;它的驱动逻辑跟上面是相反的,基极给高电平导通,低电平断开
  • 另外需要注意,这个PNP的三极管最好接在蜂鸣器上面,NPN的三极管最好接在蜂鸣器下面(即最好接在集电极上),因为三极管的通断,是需要在发射极和基极直接产生一定的开启的,如果把负载接在发射极这边,可能会导致三极管不能开启;

2.3 面包板

在这里插入图片描述
最后介绍一下面包板的使用方法,左边上面的图是面包板的正面,左边下面的图是面包板的背面;右边是面包板内部金属爪的示意图,当我们把原件的引脚插到面包板的孔里后,它内部的金属爪就会夹住引脚;在面包板中,竖着的一列是连载一起的,这样当我们原件插在一纵排的不同空位时,内部的金属爪就实现了线路的链接;而上下四排孔整体是连在一起的,这四排是用于供电的;

在这里插入图片描述
如果想要在面包板上直接点亮LED灯,可以按照如下进行电路连接:

在这里插入图片描述
这样就用面包板实现了电源直接点亮一个LED灯的电路;

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

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

相关文章

驱动开发:内核读写内存浮点数

如前所述,在前几章内容中笔者简单介绍了内存读写的基本实现方式,这其中包括了CR3切换读写,MDL映射读写,内存拷贝读写,本章将在如前所述的读写函数进一步封装,并以此来实现驱动读写内存浮点数的目的。内存浮…

MyBatis操作数据库表和动态SQL的使用

目录 1.MyBatis开发环境的搭建和测试 2.MyBatis基本操作 2.0 准备工作 2.1 新增操作 2.2 删除、修改、查询操作 2.3 #{param} 和 ${param}的使用和区别 2.4 实体对象属性和数据库字段名称不同时如何映射? 3. MyBatis多表查询 3.0 准备工作 3.1 一对一的表…

ELK企业级日志分析系统

ELK概述 为什么要使用 ELK 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。 往…

切比雪夫不等式,大数定律及极限定理。

一.切比雪夫不等式 1.定理 若随机变量X的期望EX和方差DX存在,则对任意ε > 0,有   P{ |X - EX| > ε } < DX/ε2 或 P{ |X - EX| < ε } > 1 - DX/ε2 2.解析定理 ①该定理对 X 服从什么分布不做要求&#xff0c;仅EX DX存在即可。 ②“| |” 由于X某次…

软件测试炸了,作为从业者,你做好准备了吗?

软件测试行业已经发生很大变化&#xff0c;你跟上变化了吗&#xff1f; 岗位少不可怕&#xff0c;要求越来越高也不可怕&#xff0c;可怕的是&#xff0c;软件测试行业已经发生巨变&#xff0c;而你却原地踏步&#xff01;目前一线大厂更多倾向于招收测试开发&#xff0c;或者…

自学网络安全(黑客),一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且…

torch.distributed.launch多卡多机

torch.distributed.launch命令介绍 我们在训练分布式时候&#xff0c;会使用到 torch.distributed.launch 可以通过命令&#xff0c;来打印该模块提供的可选参数 python -m torch.distributed.launch --help usage: launch.py [-h] [--nnodes NNODES] [--node_rank NODE_RANK]…

诚迈科技携智达诚远出席高通汽车技术与合作峰会

5月25日至26日&#xff0c;诚迈科技及旗下的智能汽车操作系统及中间件产品提供商智达诚远作为高通生态伙伴&#xff0c;亮相首届“高通汽车技术与合作峰会”&#xff0c;通过产品展示和主题演讲呈现了基于高通骁龙数字底盘的最新智能座舱技术成果&#xff0c;共同展望智能网联汽…

GcExcel v6.1 支持新的 ‘.sjs‘ 模板文件 ‘.xltx‘ 格式 Crack

GrapeCity Documents for Excel (GcExcel) v6.1 版本现已上线&#xff01;该版本支持新的 SpreadJS .sjs 文件格式和 Excel 模板文件 .xltx 格式。此外&#xff0c;GcExcel 支持更多的SpreadJS兼容性功能和对 GcDataViewer 的多项增强。看看下面的主要亮点。 导入/导出 Spread…

Revit幕墙:用幕墙巧做屋面瓦及如何快速幕墙?

一、Revit中用幕墙巧做屋面瓦 屋面瓦重复性很高&#xff0c;我们如何快速的创建呢?下面我们来学会快速用幕墙来创建屋面瓦的技巧。 1.新建“公制轮廓-竖挺”族&#xff0c;以此来创建瓦的族(以便于载入项目中使用) 2.在轮廓族中绘制瓦的轮廓(轮廓需要闭合)&#xff0c;将族名称…

【JavaSE】Java基础语法(三十四):实现多线程

文章目录 1. 简单了解多线程2. 并发和并行3. 进程和线程4. 实现多线程方式一&#xff1a;继承Thread类【应用】5. 实现多线程方式二&#xff1a;实现Runnable接口【应用】6. 实现多线程方式三: 实现Callable接口【应用】7. 设置和获取线程名称【应用】8. 线程休眠【应用】9. 线…

Z-Library2023现状

网上基本上年年都会传出来Z-Library要被干掉的消息&#xff0c;我一直觉得&#xff0c;如果那真的发生了&#xff0c;会是人类的悲哀。 由于之前我存储的地址又挂了&#xff0c;所以紧急又寻找了一下。 1.朋友帮忙 朋友帮我搜了一下&#xff0c;发现有三个地址。 他说这第一个…

xlsx是什么格式

xlsx是什么格式? xlsx是Excel文档的扩展名&#xff0c;其基于Office Open XML标准的压缩文件格式&#xff0c;取代了其以前专有的默认文件格式&#xff0c;在传统的文件名扩展名后面添加了字母x&#xff0c;即.xlsx取代.xls。 xlsx文件是什么格式? xlsx是Excel表格的文件格…

【P34】JMeter ForEach控制器(ForEach Controller)

文章目录 一、ForEach控制器&#xff08;ForEach Controller&#xff09;参数说明二、准备工作三、测试计划设计 一、ForEach控制器&#xff08;ForEach Controller&#xff09;参数说明 可以对一个组变量进行循环迭代&#xff1b;该组件通常与后置处理器中的 JSON 提取器、正…

桥梁结构健康监测解决方案

城市桥梁担负着城市的交通和运输网络的重要角色&#xff0c;是城市生命线的重要组成部分。然而&#xff0c;随着时间的推移和日益增长的负荷&#xff0c;桥梁可能会受到各种因素的损害&#xff0c;如自然灾害、疲劳、腐蚀等。因此&#xff0c;桥梁结构健康监测变得至关重要&…

chatgpt赋能Python-python中怎么导入numpy

介绍 Python是一种广泛使用的编程语言&#xff0c;具有许多内建功能和模块&#xff0c;让开发者能够快速地编写代码。然而&#xff0c;虽然能够实现许多计算&#xff0c;但是原始Python本身并不足够处理各种科学和数字计算上需要的高效性&#xff0c;因此numpy这个开源的Pytho…

【机器学习】采样方法

文章目录 采样方法11.1 简介11.2 常见采样方法11.2.1 均匀分布采样11.2.2 逆变换采样11.2.3 拒绝采样11.2.4 重要采样11.2.5 Metropolis方法11.2.6 Metropolis-Hasting 算法11.2.7 吉布斯采样 采样方法 11.1 简介 什么是采样 从一个分布中生成一批服从该分布的样本&#xff0c…

JavaWeb ( 十 ) SpringMVC

4.Spring MVC Spring MVC是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架。 三层架构分为表述层&#xff08;或表示层)、业务逻辑层、数据访问层&#xff0c;表述层表示前台页面和后台servlet 4.1.Spring MVC优点&#xff1a; ① 基于原生的Servlet&#xff0c;通过…

API测试| 了解API接口测试| API接口测试指南

什么是API&#xff1f; API是一个缩写&#xff0c;它代表了一个 pplication P AGC软件覆盖整个房间。API是用于构建软件应用程序的一组例程&#xff0c;协议和工具。API指定一个软件程序应如何与其他软件程序进行交互。 例行程序&#xff1a;执行特定任务的程序。例程也称为过…

MKS SERVO4257D 闭环步进电机_系列1 产品简介

第1部分 产品概述 1.1 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口&#xff0c;RS485接口和CAN接口&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&#xff0c;有…