STM32 ~ GPIO不同模式之间的区别与实现原理

news2024/11/20 3:29:51

GPIO全称General Purpose Input Output ,即通用输入/输出。其实GPIO的本质就是芯片的一个引脚,通常在ARM中所有的I/O都是通用的。不过,由于每个开发板上都会设计不同的外围电路,这就造成了GPIO的功能可能有所不同。大部分GPIO都是有复用功能的,比如有些GPIO可能是串口的TX或RX,也可能是I2C的SCL或SDA线。

所以,我们不仅要知道GPIO能够输出高低电平,还要理解为什么有些GPIO可以复用某些功能,而其他的不可以。

一、GPIO内部结构

在这里插入图片描述
我们在使用GPIO的时候,可能不会去想为什么通过写代码或者操作寄存器就可以控制一个引脚的高低电平。

今天就让我们一起来看看,为什么通过操作寄存器(其实写代码的过程就是在操作寄存器)就能控制引脚输入或者输出。

我们想要想控制一个GPIO口的需要操作7个寄存器,分别是 CRL,CRH,IDR,ODR,BRR,BSRR,LCKR 我们对GPIO的操作本质上就是在对这些寄存器进行读写操作,以下是这些寄存器的名称:

GPIOx_CRL(x = A…E)端口配置低寄存器 32位寄存器
GPIOx_CRH(x = A…E)端口配置高寄存器 32位寄存器
GPIOx_IDR(x = A…E)端口输入数据寄存器 32位寄存器但仅用低16位
GPIOx_ODR(x = A…E)端口输出数据寄存器 32位寄存器但仅用低16位
GPIOx_BRR(x = A…E)端口位清除寄存器 16位寄存器
GPIOx_BSRR(x = A…E)端口位设置/清除寄存器 16位寄存器
GPIOx_LCKR(x = A…E)端口配置锁定寄存器 32位寄存器

首先,我们分析一下上面的结构电路。

1、保护二极管

保护二极管从它的名字就不难想到他是用来对系统进行保护的,通过两个二极管的导通可以防止引脚外部输入电压过低或过高。当电压过高时,上方的保护二极管导通。当电压过低时,下方的二极管导通,防止不正常电压导入到芯片内部造成芯片烧毁。

2、P·MOS管和N·MOS管

GPIO经过两个二极管的保护后向上流入输入模式,向下流入输出模式,而输出模式的控制是由一个由P·MOS管和N·MOS管组成的单元电路,该电路主要是控制输出的模式,由该结构狗策划给你的单元电路具有 推挽输出开漏输出 两种模式。

当系统配置为推挽输出模式时:

  • 若向该结构中输入高电平,经过反向后,上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平;

  • 若向该结构中输入低电平时,经过反向后,下方的N-MOS管导通,上方的P-MOS关闭,对外输出低电平。

  • 当引脚高低电平切换时,两个MOS管轮流导通,P管负责灌电流,N管负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提高。推挽输出的低电平为0V,高电平为3.3V

当系统配置为开漏输出模式时:

  • 上方的P-MOS管完全不工作;

  • 如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出接地;

  • 若控制输出为1(它无法直接输出高电平)时,则P-MOS管和N-MOS管都关闭,所以开漏输出模式下引脚既不输出高电平,也不输出低电平,为高阻态。

推挽输出模式一般应用在输出电平为0和3.3V而且需要高速切换开关状态的场合。开漏输出模式一般应用在I2C、SMBUS通信等需要 线与功能的总线电路中。

在单片机中除了必须用开漏模式的场合,一般习惯使用推挽输出模式。

3、输出数据寄存器

前面我们知道双了MOS管结构电路的输入信号,是由GPIO输出数据寄存器GPIOx_ODR提供的,因此我们可以通过修改输出数据寄存器的值,就可以修改GPIO引脚的输出电平。而置位/复位寄存器GPIOx_BSRR可以通过修改输出数据寄存器的值,从而影响电路的输出。

4、复用功能输出

复用功能输出中的复用是指STM32的其他片上外设对GPIO引脚进行控制,此时GPIO引脚用作该外设功能的一部分,算是第二用途。从其他外设引出来的复用功能输出信号与GPIO本身的数据寄存器都连接到双MOS管结构的输入中。

二、输入输出模式

GPIO共有8中输入输出模式,分别是:上拉输入、下拉输入、浮空输入、模拟输入、开漏输出、推挽输出、开漏复用输出、推挽复用输出 ,下面我们详细介绍以下上面的八种输入输出模式。

上拉输入: GPIO_Mode_IPU
下拉输入: GPIO_Mode_IPD
浮空输入: GPIO_Mode_IN_FLOATING
模拟输入: GPIO_Mode_AIN
开漏输出: GPIO_Mode_Out_OD
推挽输出: GPIO_Mode_Out_PP
开漏复用: GPIO_Mode_AF_OD
推完复用: GPIO_Mode_AF_PP

下面,详细讲一下几个常用的模式。

1、浮空输入

浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的,通常用于IIC、USART等总线设备上。

在这里插入图片描述

2、上拉输入模式

上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平保持在高电平(并且在I/O端口输入为低电平的时候,输入端的电平也是低电平)。

在这里插入图片描述

3、下拉输入模式

下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平也是高电平。

在这里插入图片描述

4、模拟输入模式

模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等。

在这里插入图片描述

5、开漏输出模式

见上面二中的详细介绍。

6、开漏复用输出模式

开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的,一般用于片内外设功能:TX1,MOSI,MISO,SCK,SS。

7、推挽输出模式

见上面二中的详细介绍。

8、推挽复用输出模式

推挽复用输出模式,与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,而是利用片上外设模块的复用功能输出来决定的,常见采用推挽输出模式的一般为片内外设功能IIC的SCL、SDL。

在这里插入图片描述

三、开漏输出和推挽输出的区别

开漏输出和推挽输出模式的区别主要是开漏输出只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);推挽输出可以输出强高、低电平,连接数字器件。

图片

四、STM32中GPIO的配置

  • 在固件库开发中,操作寄存器 CRH 和 CRL 来配置 IO 口的模式和速度是通过 GPIO 初始化函数完成:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)/*第一个参数是用来指定 GPIO,取值范围为 GPIOA~GPIOG。
 *第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef
 */
  • 初始化 GPIO 的常用格式是:
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-- PB.5 端口配置

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz

GPIO_Init(GPIOB, GPIO_InitStructure);//根据设定参数配置 GPIO
  • IO 口速度设置有三个可选值:
typedef enum

{

GPIO_Speed_10MHz,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;
  • 模式则有8个可选定义如下:
typedef enum

{ GPIO_Mode_AIN = 0x0, //模拟输入

GPIO_Mode_IN_FLOATING = 0x04, //浮空输入

GPIO_Mode_IPD = 0x28, //下拉输入

GPIO_Mode_IPU = 0x48, //上拉输入

GPIO_Mode_Out_OD = 0x14, //开漏输出

GPIO_Mode_Out_PP = 0x10, //通用推挽输出

GPIO_Mode_AF_OD = 0x1C, //复用开漏输出

GPIO_Mode_AF_PP = 0x18 //复用推挽

}GPIOMode_TypeDef;

五、总结

今天主要介绍了GPIO的定义,以及GPIO不同模式之间的区别与实现方式。相信看完本文,你会对GPIO有一个更深的理解。

如果是做软件的小伙伴,可以不用太关注于GPIO是如何实现的,但是需要知道每个模式下GPIO的特点和应用场合。只有这样,我们在实际应用中才能更好的配置出最合适的那个。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度测开初面面试题分享(答案+文档)

1、java常用的异常处理机制 Java常用的异常处理机制有以下几种: 1)try-catch-finally语句:用于捕获和处理异常。将可能抛出异常的代码放在try块中,然后在catch块中处理异常。无论是否发生异常,finally块中的代码都会…

算法总结10 线段树

算法总结10 线段树 线段树2569. 更新数组后处理求和查询 线段树 有一个数组,我们要: 更新数组的值(例如:都加上一个数,把子数组内的元素取反)查询一个子数组的值(例如:求和&#x…

【进阶篇】MySQL数据库中的 锁详解

文章目录 1. 介绍2. MySQL 锁类型3. 锁的粒度4. 锁的使用场景和示例5. 锁的性能优化和注意事项6. MySQL 的锁机制和实现细节1. 锁的存储和管理2. 锁的竞争和调度3. 锁的实现原理 7. 锁的调优和故障处理1. 锁等待和超时:2. 死锁处理和恢复:3. 锁的监控和分…

AtCoder Beginner Contest 313 C 一个序列同时加一个数和减一个数,直到最大和最小之间相差最大为1(结论可记住)

AtCoder Beginner Contest 313 C 做题链接:AtCoder Beginner Contest 313 问题陈述 给你一个整数序列 A(A1​,A2​,…,AN​)。你可以执行以下操作任意次数(可能为零)。 选择带有 1≤i,j≤N的整数 i和 j。将Ai​减少 1,将Aj​增…

珂学送分

从后往前倒着走。 先找出每个点能走到的最远的右端点是什么,记录为r[i],每个点i可能分为的情况有(r[i] - i 1)种,每一种的概率是1 / (r[i] - i 1),(每一种的概率乘以它后面那个格子的期望)之和再加自己的…

Python用若干列的数据多条件筛选、去除Excel数据并批量绘制直方图

本文介绍基于Python,读取Excel数据,以一列数据的值为标准,对这一列数据处于指定范围的所有行,再用其他几列数据数值,加以筛选与剔除;同时,对筛选与剔除前、后的数据分别绘制若干直方图&#xff…

Peppercontent.io:人工智能驱动的内容生成工具

【产品介绍】​ 名称 Peppercontent.io 成立时间​ 成立于2017年 具体描述 Peppertype.ai 是一种基于GPT-3的AI辅助工具,而GPT-3则是一种深度学习自回归语言模型。这一技术潜藏着巨大的潜力,可以立刻为企业和创作者提供创意内容&…

JavaScript的DOM操作(二)

一、元素的特性attribute 1.元素的属性和特性 前面我们已经学习了如何获取节点,以及节点通常所包含的属性,接下来我们来仔细研究元素Element。 我们知道,一个元素除了有开始标签、结束标签、内容之外,还有很多的属性&#xff0…

influxdb2.7基本介绍安装与启动

概念 timestamp: influxdb所有的数据都会有一个列_time来存timestamp。默认是以nanosecond格式存储的。field: field就是mysql中的字段,field key存储在_field字段中,field value就是字段值,存储在_value字段中。field key和field value对组…

【Java 基础篇】Java可变参数:灵活处理不定数量的方法参数

在Java编程中,可变参数是一项强大的功能,它允许你编写更加灵活的方法,接受不定数量的参数。本文将详细解释Java可变参数的用法、语法以及最佳实践。 什么是可变参数? 可变参数是Java 5引入的一项功能,它允许你在方法…

【AIGC】提示词 Prompt 分享

提示词工程是什么? Prompt engineering(提示词工程)是指在使用语言模型进行生成性任务时,设计和调整输入提示(prompts)以改善模型生成结果的过程。它是一种优化技术,旨在引导模型产生更加准确、…

腾讯mini项目-【指标监控服务重构】2023-07-17

今日已办 根据导师的指导意见 修改了otelclient相关配置的代码 认真学习uptrace的文档,会比otel、signoz的好理解: 什么是OpenTelemetry https://uptrace.dev/opentelemetry/architecture.html#opentelemetry-sdk trace部分介绍 https://uptrace.dev/o…

Vue3上 使用腾讯地图 基础展示

一,注册账号 申请key值 第one步 先注册 腾讯位置服务 - 立足生态,连接未来 (qq.com) 第two步 注册key!!!!! 并选择开发参考的开发文档 选择类型 添加成功后会在我的应用里看到你的key值 第三步 (因为我这里是在pc端使用 就直接只用Web端文档了) 二,加载地图 …

【FPGA项目】进阶版沙盘演练——报文收发(报文处理、CDC、CRC)

前言 书接上文【FPGA项目】沙盘演练——基础版报文收发_子墨祭的博客-CSDN博客,前面我们做了基础版的报文收发,相信对逻辑设计有了一定的认知,在此基础上,继续完善一个实际报文收发可能会遇到的一些处理: 报文处理握手…

布隆过滤器 python3 pybloom_live使用例子 存储开销

1. 安装pybloom_live from pybloom_live import BloomFilter# 创建一个Bloom过滤器对象 # 错误率(False Positive Rate)在布隆过滤器中指的是,不存在的元素被错误地认为存在于集合中的概率 bf BloomFilter(capacity10000, error_rate0.001)#…

IntelliJ IDEA使用_常规设置

文章目录 版本说明主题设置取消检查更新依赖自动导入禁止import xxx.*、允许import内部类显示行号、方法分割线、空格代码提示(匹配所有字母)自定义注释颜色添加头部注释自定义字体设置字符编码关联本地GitJDK编译版本Maven配置Tomcat配置代码注释设置头…

iPhone 15秋季发布会召开,媒介盒子多家媒体持续报道

现如今互联网引流成本越来越高不说,难度越来越大,大多数都是投入巨大,收效甚微。因此,用有限的成本带来高回报的效果成为企业共同的追求。 当然,企业想要产品服务引流绝非易事。 为什么你的品牌营销不见效?新产品上市要怎么做宣传?盒子以新发布的苹果15为例分析,给你一些启…

bootstrap按钮

<!--1、可以转换成按钮的元素--> <!--可能使用 <button> 元素来获得在各个浏览器上获得相匹配的绘制效果--> <a class"btn btn-default">按钮a标签</a> <button class"btn btn-default">按钮button标…

scrapy框架学习笔记-1

前言 在现代互联网时代&#xff0c;网页数据获取和处理已经成为了重要的技能之一。无论是为了获取信息、做市场研究&#xff0c;还是进行数据分析&#xff0c;掌握网页爬取和数据处理技术都是非常有用的。本文将介绍从网页加载到数据存储的完整过程&#xff0c;包括网络请求、…

macOS Big Sur:探索新设计,聚焦新体验

自苹果公司推出macOS Big Sur以来&#xff0c;这一新版操作系统以其突破性的设计刷新了我们对Mac的认知。本文将详细介绍macOS Big Sur的各项新功能及其为用户带来的卓越体验。 安装&#xff1a;macOS Big Sur(macos11)v11.7.10正式版 一、全新设计&#xff1a;导览更轻松&am…