NodeMCU ESP8266 GPIO使用详解(附带图文说明)

NodeMCU ESP8266 GPIO使用详解

文章目录

  • NodeMCU ESP8266 GPIO使用详解
  • 前言
  • 什么是GPIO?
  • GPIO 的使用
  • GPIO模式
  • 作为输出
  • 输出高电平
  • 输出低电平
  • 作为输入
  • 上拉输入
  • 下拉输入
  • 读取输入值
  • 总结
  • 前言

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

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

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

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

    什么是GPIO?

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

  • 可以读取输入信号;
  • 可以输出信号;
  • 接收外部的中断信号;
  • 在NodeMCU ESP8266上的GPIO,简单整理了一下,具体如下所示;

    Alt text

    开发板的引脚名称 ESP8266 内部引脚名称
    D0 GPIO16
    D1 GPIO5
    D2 GPIO4
    D3 GPIO0
    D4 GPIO2
    D5 GPIO14
    D6 GPIO12
    D7 GPIO13
    D8 GPIO15
    D9/RX GPIO3
    D10/TX GPIO1
    D11/SD2 GPIO9
    D12/SD3 GPIO10

    再复杂一点的话,会有特定时序的信号,比如串口,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);
    }
    

    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
    

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

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

    作为输出

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

    pinMode(2,OUTPUT);
    

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

    pinMode(2,OUTPUT_OPEN_DRAIN);
    

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

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

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

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

    digitalWrite(2, HIGH);`
    

    输出低电平

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

    digitalWrite(2, LOW);`
    

    作为输入

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

    pinMode(2, INPUT);
    

    上拉输入

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

    pinMode(2, INPUT_PULLUP);
    

    下拉输入

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

    pinMode(2, INPUT_PULLDOWN_16);
    

    读取输入值

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

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

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

    pinState = digitalRead(2);
    

    总结

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

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

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

    物联沃分享整理
    物联沃-IOTWORD物联网 » NodeMCU ESP8266 GPIO使用详解(附带图文说明)

    发表评论