• NodeMCU ESP8266 GPIO使用详解(图文并茂)


    NodeMCU ESP8266 GPIO使用详解


    前言

    前面的文章中我们已经学习了如何点亮一个LED灯,在嵌入式的世界里,这个相当于我们初学一门编程语言,写下的Hello World程序。

    为了让LED闪烁,我们需要操作芯片的GPIO,这是硬件最底层的概念,只不过Arduino的编程中,底层的库函数已经为我们做好了硬件的封装,只要调用相应的API接口就对GPIO进行操作。

    如果是更纯粹的单片机开发,我们可能还需要读写各种寄存器,通常这些会出现在单片机的裸机代码或者驱动程序中。

    我们在嵌入式开发的过程中,也有必要学习和了解GPIO的相关硬件知识和概念,下面我们会进一步学习。

    什么是GPIO?

    GPIO叫通用输入输出(General Purpose Input Output),它在集成电路中扮演着非常重要的角色;

    • 可以读取输入信号;
    • 可以输出信号;
    • 接收外部的中断信号;

    在NodeMCU ESP8266上的GPIO,简单整理了一下,具体如下所示;

    Alt text

    开发板的引脚名称ESP8266 内部引脚名称
    D0GPIO16
    D1GPIO5
    D2GPIO4
    D3GPIO0
    D4GPIO2
    D5GPIO14
    D6GPIO12
    D7GPIO13
    D8GPIO15
    D9/RXGPIO3
    D10/TXGPIO1
    D11/SD2GPIO9
    D12/SD3GPIO10

    再复杂一点的话,会有特定时序的信号,比如串口,I2C总线,SPI等等;

    GPIO 的使用

    GPIO模式通常分为以下几种;

    • 输出模式;
    • 输入模式;
    • 模拟模式;
    • 功能复用模式;

    前面小节中有实现用GPIO让LED闪烁的代码,具体如下所示;

    void setup() {
      // put your setup code here, to run once:
      pinMode(2, OUTPUT);
      digitalWrite(2,LOW);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      delay(2000);
      digitalWrite(2,LOW);  // 2 表示D2/GPIO4 开发板上连接的是LED
      delay(2000);
      digitalWrite(2,HIGH);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    GPIO模式

    下面是Arduino.h头文件中定义的几种GPIO模式,基本上是输出和输入两种模式,通常在嵌入式的开发中还有复用模式以及高阻抗的状态,下面我们先介绍输入和输出模式的几种情况,具体定义如下所示;

    #define INPUT             0x00
    #define INPUT_PULLUP      0x02
    #define INPUT_PULLDOWN_16 0x04 // PULLDOWN only possible for pin16
    #define OUTPUT            0x01
    #define OUTPUT_OPEN_DRAIN 0x03
    
    • 1
    • 2
    • 3
    • 4
    • 5

    通常我们要看一下芯片的用户手册;举个例子,看一下相应的GPIO是否支持内部上拉或者内部下拉的输入;上述代码中,我可以使用pinMode函数来指定具体的GPIO的工作模式。

    下面我们进一步介绍,会涉及到一些硬件方面的知识,遇到相关不懂的概念,可以先记下来,后面慢慢消化。

    作为输出

    下面的函数可以让D2接口作为默认输出输出,具体的输出模式需要参考用户手册,一般来说是推挽输出模式;

    pinMode(2,OUTPUT);
    
    • 1

    下面的函数可以让D2接口作为开漏输出模式,具体如下所示;

    pinMode(2,OUTPUT_OPEN_DRAIN);
    
    • 1

    这种输出模式有个特点就是可以输出低电平,但是不能输出高电平,通常要在外部增加上拉电阻。

    这里已经设置了输出的模式,如何输出就需要用函数digitalWrite(GPIO, STATE);

    • GPIO:具体的引脚;
    • STATE:具体的输出状态,通常是HIGHLOW

    输出高电平

    D2硬件接口输出为高电平,具体如下所示;

    digitalWrite(2, HIGH);`
    
    • 1

    输出低电平

    D2硬件接口输出为低电平,具体如下所示;

    digitalWrite(2, LOW);`
    
    • 1

    作为输入

    D2硬件接口输出设置为输入模式,具体如下所示;

    pinMode(2, INPUT);
    
    • 1

    上拉输入

    D2硬件接口设置为上拉输入模式,具体如下所示;

    pinMode(2, INPUT_PULLUP);
    
    • 1

    下拉输入

    D2硬件接口设置为下拉输入模式,具体如下所示;

    pinMode(2, INPUT_PULLDOWN_16);
    
    • 1

    读取输入值

    读取相应的硬件引脚上的状态需要用到函数digitalRead(),函数原型如下;

    extern int digitalRead(uint8_t pin) __attribute__ ((weak, alias("__digitalRead"), nothrow));
    
    • 1

    D2硬件接口的状态读取到变量 pinState 中,高电平返回1,低电平返回0,具体如下所示;

    pinState = digitalRead(2);
    
    • 1

    总结

    本文简单介绍GPIO的一些基本概念,以及NodeMCU ESP8266 基于 Arduino接口的GPIO函数操作。

    由于作者能力有限,文章中难免存在错误和纰漏,请大胆指正,如果对于文章中存在疑惑或者问题,欢迎在评论区进行留言。

    如果文章帮到了你,请帮忙点赞,三连支持👍👍👍。

  • 相关阅读:
    Scala学习笔记16: 注解
    相对路径的使用
    C++:继承、模板、CRTP:谈谈C++多态设计模式
    迷宫问题(只有一条路径)【dfs 判断是否继续dfs 的三种方法】
    前后端交互实例(javaweb05)
    【无标题】
    Iocomp ActiveX v5 SP6 带OPC -Crack
    和琪宝的深圳,香港之旅~
    【Java-LangChain:使用 ChatGPT API 搭建系统-4】评估输入-分类
    opencv+vs studio环境配置
  • 原文地址:https://blog.csdn.net/u010632165/article/details/133818399