stm32——GPIO学习

news/2025/2/14 0:23:06/

        对于许多刚入门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的《陀飞轮》,可是一事无成怎敢听《陀飞轮》。

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


http://www.ppmy.cn/news/1431048.html

相关文章

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城

源码下载地址:完美运营版商城.zip 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本

Spring基础 SpringAOP

前言 我们都知道Spring中最经典的两个功能就是IOC和AOP 我们之前也谈过SpringIOC的思想 容器编程思想了 今天我们来谈谈SpringAOP的思想 首先AOP被称之为面向切面编程 实际上面向切面编程是面向对象的编程的补充和完善 重点就是对某一类问题的集中处理 前面我们写的统一异常管理…

java中spring底层核心原理解析(1)

相关系列 java中spring底层核心原理解析(2)-CSDN博客 总起 本章主要是讲以下的内容 Bean的生命周期底层原理依赖注入底层原理初始化底层原理推断构造方法底层原理 先看spring入门代码: ClassPathXmlApplicationContext context new ClassPathXmlApplicationCo…

入坑 Node.js 1

原文:https://blog.iyatt.com/?p14717 前言 前面刚刚对 Spring Boot 有了个概念,再来学学 Node.js,顺便当学 JavaScript,为后面入前端做准备。 环境 Node.js 20.12.2 官方 API 文档:https://nodejs.org/docs/lat…

CentOS 7虚拟机配置过程中所需组件的安装(二)

1.安装net-tools组件(解决无 ifconfig) # yum install net-tools 2.安装gcc、c编译器以及内核文件 # yum -y install gcc gcc-c kernel-devel 验证安装成功 3.安装nano(文本编辑器) # yum install nano

K8s: Ingress对象, 创建Ingress控制器, 创建Ingress资源并暴露服务

Ingress对象 1 )概述 Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTPIngress-nginx 本质是网关,当你请求 abc.com/service/a, Ingress 就把对应的地址转发给你,底层运行了一个 nginx但 K8s 为什么不…

Github 2024-04-22 开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-22统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4C++项目2Go项目2JavaScript项目1TypeScript项目1非开发语言项目1Zig项目1免费编程书籍和学习资源清单 创建周期:3762 天协议类型:…

数据库服务类--Redis--未授权访问终端Getshell

免责声明:本文仅做技术交流与学习. 目录 前提条件: windows上开启redis服务: Linux上创建&开启redis服务: 操作: 1-连接靶机redis 2-写入webshell 3-访问后门 redis--->webshell Redis未授权访问漏洞复现与利用 - 知乎 (zhihu.com) 前提条件: 端口开放(6379) 目录…