stm32——GPIO学习

        对于许多刚入门stm32的同学们来说,GPIO是我们的第一课,初出茅庐的我们会对GPIO的配置感到疑惑不解,也是劝退我们的第一课,今天我们就来一起学习一下stm32的GPIO,提振一下信心。好的,发车了小卷卷们!!!

Step 1.GPIO简介

1.认识GPIO

        首先,什么是GPIO呢?我们学过51单片机的小伙伴们,肯定会知道一个概念,叫做IO口,这里的“I”其实就是input,“O”其实就是output,就是输入输出嘛。然后什么是GPIO呢?GPIO的全称是General Purpose Input Output,就是通用输入输出端口的意思。它们有什么区别呢,其实对于我们来说,二者就是一样的,就是GPIO相比于IO,听起来牛逼一点而已都是输入输出端口。

2.GPIO的作用

        GPIO的作用:负责采集外部器件的信息或者控制外部器件工作,就是输入输出。这里我们分别举两个例子来理解:

a.输入

        这里我们的IO口和VCC相连,如果按键不按下,IO口的输入就是VCC高电平,如果按键按下,IO口就变成了GND低电平,这是一个GPIO输入的例子 

 

b.输出

        这里如果IO口输出高电平,就是1,LED灯就亮,如果输出低电平,就是0,LED灯就不亮 

3.GPIO特点

【1】不同型号的芯片IO口的数量是不一样的

【2】快速翻转,每次翻转最快只需要两个时钟周期

【3】每个IO口都可以做中断(这点相比于传统的51单片机要好很多,传统的51单片机只有INT0,INT1可以做外部中断)

【4】有8中工作模式(这也是最令人头疼的) 

4.GPIO电气特性

stm32的工作电压范围是2v ≤ VDD ≤ 3.6v

GPIO的电压识别范围:

                -0.3v ≤ V低 ≤ 1.164v

                1.833v ≤ V高 ≤ 3.6v

一般要避免电压在1.164和1.833之间,这里电压到底是0还是1是不确定的 

手册里标注FT的是TTL端口的,没有标注的就是CMOS端口的

5.GPIO的输出电流

        F103系列的芯片最大输出电流是150毫安,单个IO口的电流输出最大是25毫安,而且不能保证每个IO口能同时输出这个电流

6.GPIO的引脚分布

 不多说了,就是看图吧,图上很明确了

电源引脚:V字母开头的都是电源引脚

复位引脚:NRST就是复位引脚 

下载引脚;

 晶振引脚

ROOT引脚;

GPIO引脚:P字母开头的,基本都是GPIO引脚,一般来说是16个端口,从0到15

Step 2.GPIO结构 

我们先看一幅图

 

 我们一步一步来分析这个图

1.保护二极管      

        首先我们要知道1处这两个二极管的作用,这两个二极管是保护二极管,这两个二极管的作用是什么呢?当外界输入较高的电平时VDD导通,我们都知道二极管有钳制电位的作用,所以高电平就被限制了,同理,当外界输入低电平时(这个东西可以是负的)Vss导通,同样将电平限制在了安全范围里。

2.施密特触发器       

        其次,我们去看这个施密特触发器,其实应该是肖特基触发器的,这里手册上的图翻译错了,它的特点就是当电压低于某一个值,表现为逻辑0,高于某一个值时,表现为高电平。处于中间位置时候,电平信号不变,我们可以通过一个图去理解它:

 3.几个图像

        好的下边我们来分析整个图,这个图可以分为两部分,输入部分和输出部分,那么输入和输出到底应该怎么去理解呢?其实stm32的参考手册也给出了输入和输出时候的图,我们可以研究一下 。

a.输入图像

 

当我们的IO口配置为输入时,有:

 ● 输出缓冲器被禁止

● 施密特触发输入被激活

● 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接

● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器

● 对输入数据寄存器的读访问可得到I/O状态

b.输出图像 

 当我们的IO口配置为输出时,有:

● 输出缓冲器被激活 ─ 开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。 ─ 推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。

● 施密特触发输入被激活

● 弱上拉和下拉电阻被禁止

● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器

● 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态

● 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值

c.复用图像

此时,有:

● 在开漏或推挽式配置中,输出缓冲器被打开

● 内置外设的信号驱动输出缓冲器(复用功能输出)

● 施密特触发输入被激活

● 弱上拉和下拉电阻被禁止

● 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器

● 开漏模式时,读输入数据寄存器时可得到I/O口状态

● 在推挽模式时,读输出数据寄存器时可得到最后一次写的值 下图示出了I/O端口位的复用功能配置。详见stm32f103系列参考手册8.4节-AFIO寄存器描述。 一组复用功能I/O寄存器允许用户把一些复用功能重新映象到不同的引脚。 

d.模拟输入 

此时,有: 

● 输出缓冲器被禁止;

● 禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;

● 弱上拉和下拉电阻被禁止;

● 读取输入数据寄存器时数值为’0

相信大家看到这里会有点懵逼,你给我一堆这,我也不知道该怎么用啊!那么下面我们就来具体看看IO口的8种输入输出模式

4.GPIO口的八种模式

首先要知道都有哪几种工作模式吧,大概就是四输入,四输出;

输入:输入浮空 ─ 输入上拉 ─  输入下拉  ─  模拟输入

输出:开漏输出 ─ 推挽式输出 ─ 推挽式复用功能 ─ 开漏复用功能

下面允许我先啰嗦一下,因为很多人就算知道这些东西,也会一头雾水,到底什么时候要用什么呢?因为我是暖男,我安排好了:

GPIO引脚可以根据需要配置成多种模式,以适应不同的硬件接口需求。下面详细解释您提到的各种输入和输出模式,以及它们的用途。

功能分析

a.输入模式
输入浮空 (Floating Input)

    •    描述:在此模式下,GPIO引脚既没有连接到高电平(VCC)也没有连接到低电平(GND),其状态由外部电路的输入决定,但在没有外部输入时状态不确定。
    •    用途:通常用于高阻抗传感器的接口,或者在外部电路确保将输入引脚拉高或拉低的情况下使用。但浮空输入容易受到噪声的影响,可能导致读值不稳定。

输入上拉 (Input Pull-up)

    •    描述:在此模式下,GPIO引脚通过一个上拉电阻连接到高电平,确保在外部设备未接入或开关未关闭时,GPIO引脚为高电平状态。
    •    用途:常用于按钮或开关,当按键未按下时默认读取为高电平,按下时连接到地(GND)读取为低电平。

输入下拉 (Input Pull-down)

    •    描述:与上拉输入相对,引脚通过一个下拉电阻连接到低电平,确保在外部设备未接入或开关未闭合时,GPIO引脚为低电平状态。
    •    用途:常用于按钮或开关,当按键未按下时默认读取为低电平,按下时连接到高电平(VCC)读取为高电平。

模拟输入 (Analog Input)

    •    描述:GPIO引脚配置为读取模拟信号,这通常需要芯片内部集成的模拟到数字转换器(ADC)。
    •    用途:用于读取各种类型的模拟传感器输出,如温度传感器、光照传感器、湿度传感器等的模拟信号。

b.输出模式
开漏输出 (Open Drain Output)

    •    描述:在此模式下,GPIO引脚在输出低电平时直接连接到地(GND),在输出高电平时不驱动,输出端实际上是“开放”的,需要外部上拉电阻以确保能够读取到高电平。
    •    用途:常用于I2C通讯协议的数据线和时钟线,多个设备可以共用同一条线,通过外部上拉电阻来控制线路状态。

推挽式输出 (Push-Pull Output)

    •    描述:GPIO引脚可以输出高电平和低电平,高电平时连接到电源(VCC),低电平时连接到地(GND)。
    •    用途:适合于大多数控制应用,如LED指示灯、继电器控制等,因为它可以提供足够的电流来驱动外部负载。

推挽式复用功能 (Push-Pull Alternate Function)

    •    描述:此模式与推挽式输出类似,但允许GPIO引脚用于特定的复用功能,例如USART(通用同步/异步接收/发送)的TX/RX、SPI的MOSI/MISO等。
    •    用途:用于需要GPIO引脚执行特定硬件功能的应用,使得引脚除了基本的输入输出功能外,还能承担如串行通信等特定任务。

开漏复用功能 (Open Drain Alternate Function)

    •    描述:与开漏输出相似,GPIO引脚在复用功能时也不主动驱动高电平,依赖外部上拉电阻来确定高电平状态。

    •    用途:用于那些在复用功能下需要多个设备共用单一物理连接的应用,如I2C总线的SCL和SDA线,允许多个设备连接至同一总线而不会造成信号冲突。
 

结构分析 

好的,下边我们就这些模式进行结构分析:

a.输入
 输入浮空:

 

[1]上拉电阻关闭

[2]下拉电阻关闭

[3]施密特触发器打开

[4]双MOS管都不导通

 

 输入浮空时,空闲时是高阻态,由外部的环境决定 

输入上拉:

[1]上拉电阻开启

[2]下拉电阻关闭

[3]施密特触发器打开

[4]双MOS管都不导通

 输入上拉时,空闲时是高电平,外部也是高电平,这里由于上拉电阻和下拉电阻都很大,所以是弱上拉

输入下拉: 

 

[1]上拉电阻关闭

[2]下拉电阻开启

[3]施密特触发器打开

[4]双MOS管都不导通

 

输入下拉,空闲时IO口是低电平 

模拟输入: 

[1]上拉电阻关闭

[2]下拉电阻关闭

[3]施密特触发器关闭

[4]双MOS管都不导通

专门用于模拟信号的输入或输出

b.输出 
开漏输出:

 

[1]上拉电阻关闭

[2]下拉电阻关闭

[3]施密特触发器打开

[4]P-MOS管始终不导通

[5]往ODR对应位写0,N-MOS导通,写1则不导通。

写0是外界低电平,写1时高阻态,开漏输出不能输出高电平,可以通过外部(内部F4,F7,H7型号)接上拉电阻来帮助输出高电平

开漏式复用功能:

[1]上拉电阻关闭

[2]下拉电阻关闭

[3]施密特触发器打开

[4]P-MOS管始终不导通

 特点:

1.开漏式复用不能输出高电平,可以通过外部(内部F4,F7,H7型号)接上拉电阻来帮助输出高电平

2.由其他外设控制输出

推挽输出: 

[1]上拉电阻关闭

[2]下拉电阻开启

[3]施密特触发器打开

[4]往ODR对应位写0,N-MOS导通,写1,P-MOS导通

特点:电源能直接驱动,驱动能力强

推挽式复用功能:

[1]上拉电阻关闭

[2]下拉电阻开启

[3]施密特触发器打开

特点:1.可以输出高,低电平,驱动能力强,

            2.由其他外设控制输出

Step.3结语 

        现在是2024年4月23日凌晨3:13分,已经很累了,我不知道我坚持的意义在哪里。耳机里放着Eason的《陀飞轮》,可是一事无成怎敢听《陀飞轮》。

        过去十八岁,没带表,不过有时间 ,连自己也都分清不了得到多与少。也许有一天会命中减少一秒多买一只表,我喜欢的会喜欢我,我执着的会回应我,晚安程明。

相关推荐

  1. 重新学习STM32(1)GPIO

    2024-04-26 12:10:07       3 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-26 12:10:07       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-26 12:10:07       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-26 12:10:07       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-26 12:10:07       18 阅读

热门阅读

  1. 【Redis】深度学习与实践指南系列

    2024-04-26 12:10:07       11 阅读
  2. Playwright

    2024-04-26 12:10:07       9 阅读
  3. GESP一级 - 第二章 - 第3节 - 数据类型的转换

    2024-04-26 12:10:07       9 阅读
  4. 笔记:Python循环结构编程题(练习题)

    2024-04-26 12:10:07       7 阅读
  5. MVVM开发模式的理解

    2024-04-26 12:10:07       11 阅读
  6. 现代软件为什么要采用微服架构

    2024-04-26 12:10:07       10 阅读
  7. wow-string-list文件说明

    2024-04-26 12:10:07       16 阅读
  8. 设置Ollama在局域网中访问的方法(Ubuntu)

    2024-04-26 12:10:07       12 阅读
  9. CentOS即将停服,国产化系统替代参考

    2024-04-26 12:10:07       11 阅读
  10. Pytorch:神经网络过程代码详解

    2024-04-26 12:10:07       13 阅读
  11. 算法之重:探寻开发者不可忽视的基石力量

    2024-04-26 12:10:07       9 阅读