• GPIO输入输出模式分析(详解)


     1.前言

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

    所以我们不仅要知道GPIO能够输出高低电平,还要理解为什么有些GPIO可以复用某些功能,而其他的不可以。GPIO的模式如同所示,这么多模式如何理解呢?下面一一分析

    2.GPIO组寄存器

     我们想要想控制一个GPIO口的需要操作7个寄存器,分别是CRL,CRH,IDR,ODR,BRR,BSRR,LCKR,其实我们对GPIO的操作本质上就是在对这些寄存器进行读写操作。这些寄存器的每一个位的作用可以去查ST公司提供的参考手册(有中文的),这里主要是介绍GPIOx_CRL(x = A..E)和GPIOx_CRH(x = A..E)这两个寄存器里面的模式,如上面那个图

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

    3.GPIOx_CRL(x = A..E)和GPIOx_CRH(x = A..E)区别

    CRL用来存放低八位的IO口(GPIOx0—GPIOx7)的配置,CRH用来存放高八位的IO口(GPIOx8—GPIOx15)的配置。(因为需要4个位配置一个输入/输出的IO位),所以ST公司就设计了两个32位寄存器去控制一个16位的寄存器模式(输入/输出寄存器)。

    4.输出模式

    输出模式就是下面四种,其实本质就是两种,后面两种就是开启复用的特殊模式而已。 

    00:通用推挽输出模式

    01:通用开漏输出模式

    10:复用功能推挽输出模式

    11:复用功能开漏输出模式

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

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

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

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

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

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

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

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

    4.3两种模式应用场景

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

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

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

    5.输入模式 

    • 上拉输入: GPIO_Mode_IPU

    • 下拉输入: GPIO_Mode_IPD

    • 浮空输入: GPIO_Mode_IN_FLOATING

    • 模拟输入: GPIO_Mode_AIN

    前面三种输入的区别在于,有没有使用上拉电阻,和下拉电阻。浮空输入是没有使用电阻的。

      输入模式主要图片上面的一部分。

    5.1.浮空输入

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

    5.2上拉输入模式

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

     5.3.下拉输入模式

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

     5.4 模拟输入模式

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

     6.总结

    本文主要介绍了GPIO的定义和GPIO不同模式间的区别与实现方式,观看完本文相信你对于GPIO会有一个更深的理解,我们如果是做软件的可以不用太关注于GPIO是如何实现的,但是我们需要知道每个模式下GPIO的特点和应用场合,只有这样我们在实际应用中才能更好的配置出最合适的那个。

    参考链接: 本文主要是在参考链接基础进行一些总结的。

    一文看懂GPIO!-面包板社区 (eet-china.com)

  • 相关阅读:
    SpringBoot+Vue实现前后端分离的中学成绩管理系统
    mac电脑监控软件哪个好
    JavaScript的位操作符你知道吗?
    Unity入门教程(上)
    作为程序员,你可能不知道,Stream竟然还有应用进阶学习?
    学习C++第二十二课--类模版概念与函数模版的定义、调用笔记
    宿舍管理系统的设计与实现/学生宿舍管理系统
    Linux- 内存映射文件(Memory-Mapped File)
    用友GRP-U8 SQL注入漏洞复现
    springboot web 06 SpringBoot集成JSP
  • 原文地址:https://blog.csdn.net/m0_46392035/article/details/126929119