前面的文章中我们已经学习了如何点亮一个LED灯,在嵌入式的世界里,这个相当于我们初学一门编程语言,写下的Hello World程序。
为了让LED闪烁,我们需要操作芯片的GPIO,这是硬件最底层的概念,只不过Arduino
的编程中,底层的库函数已经为我们做好了硬件的封装,只要调用相应的API接口就对GPIO进行操作。
如果是更纯粹的单片机开发,我们可能还需要读写各种寄存器,通常这些会出现在单片机的裸机代码或者驱动程序中。
我们在嵌入式开发的过程中,也有必要学习和了解GPIO的相关硬件知识和概念,下面我们会进一步学习。
GPIO叫通用输入输出(General Purpose Input Output
),它在集成电路中扮演着非常重要的角色;
在NodeMCU ESP8266上的GPIO,简单整理了一下,具体如下所示;
开发板的引脚名称 | 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让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);
}
下面是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
:具体的输出状态,通常是HIGH
和LOW
;将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函数操作。
由于作者能力有限,文章中难免存在错误和纰漏,请大胆指正,如果对于文章中存在疑惑或者问题,欢迎在评论区进行留言。
如果文章帮到了你,请帮忙点赞,三连支持。