0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GPIO的定义和GPIO不同模式间的区别与实现方式

电子工程师 来源:嵌入式悦翔园 作者:嵌入式悦翔园 2022-08-08 10:51 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、前言

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

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

二、GPIO内部结构

d086b12a-16c2-11ed-ba43-dac502259ad0.png

我们在使用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

这里详细讲一下几个常用的模式:

3.1 浮空输入

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

d0b249a2-16c2-11ed-ba43-dac502259ad0.png

3.2 上拉输入模式

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

d0d96cb2-16c2-11ed-ba43-dac502259ad0.png

3.3 下拉输入模式

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

d0fd4e52-16c2-11ed-ba43-dac502259ad0.png

3.4 模拟输入模式

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

d122b57a-16c2-11ed-ba43-dac502259ad0.png

3.5 开漏输出模式

见上面二中的详细介绍;

3.6 开漏复用输出模式

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

3.7 推挽输出模式

见上面二中的详细介绍;

3.8 推挽复用输出模式

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

d146c4ce-16c2-11ed-ba43-dac502259ad0.png

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

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

d159db7c-16c2-11ed-ba43-dac502259ad0.png

五、STM32中GPIO的配置

在固件库开发中,操作寄存器 CRHCRL 来配置 IO 口的模式和速度是通过 GPIO 初始化函数完成:

voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)/*第一个参数是用来指定 GPIO,取值范围为 GPIOA~GPIOG。
*第二个参数为初始化参数结构体指针,结构体类型为GPIO_InitTypeDef
*/

初始化 GPIO 的常用格式是:

GPIO_InitTypeDefGPIO_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 口速度设置有三个可选值:

typedefenum

{

GPIO_Speed_10MHz,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;

模式则有8个可选定义如下:

typedefenum

{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的特点和应用场合,只有这样我们在实际应用中才能更好的配置出最合适的那个。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    463

    文章

    54379

    浏览量

    468994
  • 寄存器
    +关注

    关注

    31

    文章

    5618

    浏览量

    130386
  • GPIO
    +关注

    关注

    16

    文章

    1333

    浏览量

    56430

原文标题:关于GPIO你真的懂了吗?这篇文章都给你整理好了!

文章出处:【微信号:嵌入式悦翔园,微信公众号:嵌入式悦翔园】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    驱动之路#21:一行 reset-gpios,驱动为何就能用 GPIO

    这行代码不是给 CPU 看的,而是给内核和驱动的 “约定说明书”,每一部分都有明确含义: reset-gpios:是 “属性名”,遵循 Linux 设备树的 GPIO 属性命名规范(后缀-gpios
    的头像 发表于 04-14 09:20 4606次阅读
    驱动之路#21:一行 reset-gpios,驱动为何就能用 <b class='flag-5'>GPIO</b>?

    深入解析RK平台GPIO驱动:从原理到调试,开发者必看指南

    )平台上,GPIO 驱动的实现直接影响着硬件交互的稳定性与效率。本文将带你深入剖析 RK 平台 GPIO 驱动的核心逻辑、使用方法,以及对调试工作的关键意义。
    的头像 发表于 02-03 15:53 1209次阅读
    深入解析RK平台<b class='flag-5'>GPIO</b>驱动:从原理到调试,开发者必看指南

    嵌入式新手必看!GPIO调试从0到1:计算、操作、排错全指南

    在嵌入式开发中,GPIO(通用输入输出口)是最基础也最常用的硬件接口 —— 小到控制一颗 LED 亮灭、读取一个按键状态,大到驱动传感器、控制外设,都离不开 GPIO。但对新手来说,“怎么确定
    的头像 发表于 02-01 16:55 3898次阅读
    嵌入式新手必看!<b class='flag-5'>GPIO</b>调试从0到1:计算、操作、排错全指南

    【MCU学习】GPIO详解

    本实验通过一个“小实验框架 GPIO Mode Lab”,在同一个 GPIO 引脚上依次配置不同模式,并用 ADC 探头测量电压、同时读取数字电平,系统化地观察。
    的头像 发表于 01-24 11:45 4811次阅读
    【MCU学习】<b class='flag-5'>GPIO</b>详解

    掌握 LuatIO:GPIO 复用模式初始化配置全流程解析

    在使用 LuatIO 进行嵌入式应用开发时,合理配置 GPIO 的复用功能是实现外设控制的前提。本文全面解析 GPIO 引脚由普通 IO 转换为复用功能引脚的初始化流程,包括时钟使能、模式
    的头像 发表于 01-23 15:28 2265次阅读
    掌握 LuatIO:<b class='flag-5'>GPIO</b> 复用<b class='flag-5'>模式</b>初始化配置全流程解析

    GPIO、PWM、ADC,到底怎么区分?

    在嵌入式开发中,我们经常听到GPIO、PWM、ADC这些术语。初学者常常搞不清楚它们的区别和用途:“它们不是都是和电平有关吗?为什么还要分这么多种?”今天,我们就把这些基础概念讲清楚,让你在动手开发
    的头像 发表于 11-14 10:28 1062次阅读
    <b class='flag-5'>GPIO</b>、PWM、ADC,到底怎么区分?

    GPIO输入输出调用方法的理解与分享

    和GPIOB。 变量mask表示GPIO的哪一些端口进行操作。例如:gpio_enable_output(GPIOA, 0x1)表示为将GPIOA[0]端口定义为输出模式
    发表于 10-29 06:24

    【NCS随笔】如何进入system_off深度睡眠模式以及配置GPIO中断唤醒

    【NCS随笔】如何进入system_off深度睡眠模式以及配置GPIO中断唤醒 本文章主要是讲解NCS下面使用nRF54L15如何进入system_off模式,以及如何配置通过按键唤醒 一、如何进
    的头像 发表于 09-29 00:56 909次阅读
    【NCS随笔】如何进入system_off深度睡眠<b class='flag-5'>模式</b>以及配置<b class='flag-5'>GPIO</b>中断唤醒

    【EK-RA6E2开发指南】GPIO使用

    我相信大多数学习嵌入式的朋友学习单片机的第一个程序都是点灯,毕竟点灯简单嘛,操作下GPIO即可。当然,本教程的第一个应用也从GPIO的使用开始。
    的头像 发表于 09-23 18:13 3622次阅读
    【EK-RA6E2开发指南】<b class='flag-5'>GPIO</b>使用

    RK3568驱动指南|第十二篇 GPIO子系统-第130章 GPIO的调试方法

    RK3568驱动指南|第十二篇 GPIO子系统-第130章 GPIO的调试方法
    的头像 发表于 06-03 11:32 1431次阅读
    RK3568驱动指南|第十二篇 <b class='flag-5'>GPIO</b>子系统-第130章 <b class='flag-5'>GPIO</b>的调试方法

    Air780EPM应用开发:解锁GPIO与LED的N种交互模式

    今天特别分享探索Air780EPM中GPIO与LED的多样交互!本文介绍N种交互模式,包括脉冲控制、状态切换及多LED联动,为智能设备开发提供丰富技术选型。适用于智能照明、状态指示等物联网场景。 一
    的头像 发表于 05-29 14:31 880次阅读
    Air780EPM应用开发:解锁<b class='flag-5'>GPIO</b>与LED的N种交互<b class='flag-5'>模式</b>

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数的引入

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数的引入
    的头像 发表于 05-29 14:05 1158次阅读
    迅为RK3568开发板驱动指南<b class='flag-5'>GPIO</b>子系统<b class='flag-5'>GPIO</b>子系统API函数的引入

    解锁Air780EPM:N种GPIO操控LED的实战技巧!

    在物联网项目中,灵活使用Air780EPM的GPIO控制LED至关重要。本文将展示实现方式,涵盖硬件配置与软件编程,满足不同场景需求。 今天特别分享基于Air780EPM的GPIO控制
    的头像 发表于 05-28 16:56 1045次阅读
    解锁Air780EPM:N种<b class='flag-5'>GPIO</b>操控LED的实战技巧!

    迅为RK3568驱动指南GPIO子系统 GPIO操作函数实验

    迅为电子RK3568开发板驱动指南GPIO子系统 GPIO操作函数实验
    的头像 发表于 05-28 15:24 1488次阅读
    迅为RK3568驱动指南<b class='flag-5'>GPIO</b>子系统 <b class='flag-5'>GPIO</b>操作函数实验

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制GPIO中断

    1、实验简介本实验将演示如何在小凌派-RK2206开发板上使用IOT库的GPIO中断模式,进行GPIO编程开发。例程将创建一个任务,通过配置GPIO引脚为中断
    的头像 发表于 04-21 10:39 1242次阅读
    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制<b class='flag-5'>GPIO</b>中断