NodeMCU ESP8266 GPIO使用详解

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

前言

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

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

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

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

什么是GPIO?

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

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

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

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

再复杂一点的话,会有特定时序的信号,比如串口,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函数操作。

10-13 23:42