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

news/2024/5/19 8:46:45/文章来源:https://blog.csdn.net/AnChenliang_1002/article/details/130881501

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括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灯的电路;

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

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

相关文章

rust 中protobuf生成与使用

首先创建一个项目proto 进入到这个文件夹中 创建我们的proto文件 初始化的项目结构是这个样子的 新建一个hello.proto文件内容如下 syntax "proto3";package hello;service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {} }message HelloRequest …

落地页设计的营销心理学(二)

作为一个营销落地页的设计者,最关注的问题:怎么样设计才能让我的落地页有转化? 当然这可能有很多影响因素。但是,你有没有想过在用户打开落地页时,运用心理学概念留住他们,促使他们完成留资、下载、购买等动…

Unity | HDRP高清渲染管线学习笔记:示例场景解析

目录 一、HDRP入门 1.HDRP设置 1.1 HDRP配置文件中的全部设置项 1.1.1 Rendering下的Lit Shader Mode 1.1.2 Lighting 下的Volumetrics(体积光)和Screen Space Reflection(屏幕空间反射) 2.离线渲染VS实时渲染 3.Volume组件 …

把字节大佬花3个月时间整理的软件测试面经偷偷给室友,差点被他开除了···

写在前面 “这份软件测试面经看起来不错,等会一起发给他吧”,我看着面前的面试笔记自言自语道。 就在这时,背后传来了leder“阴森森”的声音:“不错吧,我可是足足花了三个月整理的” 始末 刚入职字节的我收到了大学室…

照片资源异地共享 ? tftgallery、xampp、快解析三种工具就能实现!

我的工作中,经常会收到处理各种图片的任务,在处理完图片之后,怎么发送给客户呢?传输的实现,需要一个安全而稳定的环境和即时方便的工具去进行操作与下载。一般情况下,我们大多会选择微信、QQ来作为传输下载…

基于stm32F407的hal库,移植FreeRTOS的具体步骤和遇到的问题(看正点原子的视频)

1. 资料准备 因为板子是stm32F407的第二版的,所以开始下的资料是旧版本的,但是旧版本的FreeRTOS工程没有hal库的,都是标准库的,这里是下载stm32F407最新版的资料,进行移植。 资料可以在正点原子官网下载,…

什么是可视化开发平台?拥有什么优势?

随着科技的进步和发展,可视化开发平台拥有广阔的市场前景,在提升企业办公企业效率、做好数据管理等方面具有自身的特色和优势。在办公自动化发展的年代,低代码开发平台是助力企业实现提质增效办公效率的得力助手,其可视化、易操作…

淘宝层级改版,五力模型上线!

最近临近618,淘系又各种功能改版,现在店铺层级也开始陆续改版了。从原来的只需要提升销售金额,到现在的五力模型。我们先说一下原来的店铺层级考核,跟现在的区别主要是哪? 1.原来店铺层级的考核升级特别简单&#xff0…

论文解读 | IROS 2022:MV6D:在RGB-D图像上使用深度逐点投票网络进行多视角6D姿态估计

原创 | 文 BFT机器人 01 研究背景 在计算机视觉领域,6D姿态估计是一种重要的任务,用于确定物体在3D空间中的位置和方向。它在许多应用领域具有广泛的应用,如机器人操作、虚拟现实、增强现实、物体跟踪等。 然而,传统的6D姿态估计方…

Windows Copilot,来了!

公众号关注 “GitHubDaily” 设为 “星标”,每天带你逛 GitHub! 5 月 23 日,微软 2023 Build 开发者大会正式开幕,跟 Google I/O 和 Apple WWDC 一样,每年微软都会在 Build 大会上发布各种新产品。 由于最近几个月 Cha…

webpack简单的搭建和使用

随便创建一个空的文件夹,例如说:explore 然后我们测试一下我们的node是否存在 可以正确打印出版本 我们再次输入:npm init -y 创建一个package.json文件 出现这样的情况就成功了 然后我们要安装webpack在终端上输入命令: npm i …

智能排班系统 【管理系统功能、操作说明——下篇】

文章目录 页面与功能展示排班日历月视图(按职位查询)月视图(按员工查询)周视图 排班任务管理创建排班计算任务设置任务的排班规则设置工作日客流量导入任务计算查看任务结果发布任务任务多算法计算 页面与功能展示 排班日历 在排…

LiveGBS流媒体平台国标GB/T28181功能-作为下级级联到海康大华宇视华为等第三方国标平台同样支持对接政务公安内网国标视频平台

LiveGBS流媒体平台国标GB/T28181功能-作为下级级联到海康大华宇视华为等第三方国标平台同样支持对接政务公安内网国标视频平台 1、什么是GB/T28181级联2、搭建GB28181国标流媒体平台3、获取上级平台接入信息3.1、如何提供信息给上级3.2、上级国标平台如何添加下级域3.2、接入Li…

注意力Transformer

注意力 注意力分为两步: 计算注意力分布 α \alpha α 其实就是,打分函数进行打分,然后softmax进行归一化 根据 α \alpha α来计算输入信息的加权平均(软注意力) 其选择的信息是所有输入向量在注意力下的分布 打…

如何快速搭建SpringBoot+Vue前后端分离的开发环境

唠嗑部分 今天我们来说一说,如何快速搭建SpringBootVue前后端分离的开发环境 需要前置环境nodejs,请自行安装(傻瓜式安装) SpringBoot采用2.4.2版本,Vue采用Vue2版本 言归正传 创建Vue项目 1、安装vue npm install -g vue/cli2、检查v…

当二叉树遇上递归:如何判断单值二叉树?

本篇博客会讲解力扣“965. 单值二叉树”的解题思路,这是题目链接。 先来审题: 以下是输出示例: 以下是提示: 本题非常适合使用递归实现。分以下情况讨论: 若是空树,则符合单值二叉树的性质。若非空&am…

【亲测有效】idea部署jrebel插件

idea部署jrebel插件 1.背景 最近在维护tomcat项目,工程修改代码后需要rebuild才能更新class文件,进而运行生效。 同事介绍jrebel可以实现热部署,于是接入使用。 2.简介 JRebel是一套JavaEE开发工具。 Jrebel 可快速实现热部署&#xff0c…

软考A计划-2022年05月软件设计师下午真题及答案解析

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

Axure教程—水平方向多色图(中继器)

本文将教大家如何用AXURE制作动态水平方向多色图 一、效果介绍 如图: 预览地址:https://l83ucp.axshare.com 下载地址:https://download.csdn.net/download/weixin_43516258/87822666 二、功能介绍 简单填写中继器内容即可生成动态水平多色…

类和对象 --- 封装+对象特性

👂 快乐E调 - 林澜叶 - 单曲 - 网易云音乐 👂 Plain Jane (Freestyle) - Ombre2Choc Nation - 单曲 - 网易云音乐 1.5倍速,跟着敲,初识C 目录 🏆封装 🌳属性和行为作为整体 🌳案例 -- 设置…