ESP8266学习历程——GPIO配置

本文详细介绍了ESP8266的GPIO配置与使用,包括管脚选择、中断模式设置及实例演示,适合初学者入门。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据上一篇博客,成功搭建好ESP8266在Linux下的开发环境后,正式开始入坑8266的学习和使用;本文基于NodeMCU进行学习,NodeMCU是一款开源的物联网平台,底层使用ESP8266 sdk 0.9.5版本。该平台使用了很多开源项目, 例如 lua-cjson, spiffs. NodeMCU包含了可以运行在 esp8266 Wi-Fi SoC芯片之上的固件,以及基于ESP-12模组的硬件。

在这里插入图片描述

管脚的选择

LabelGPIOInputOutputNotes
D0GPIO16no interruptno PWM or I2C supportHIGH at boot used to wake up from deep sleep
D1GPIO5OKOKoften used as SCL (I2C)
D2GPIO4OKOKoften used as SDA (I2C)
D3GPIO0pulled upOKconnected to FLASH button, boot fails if pulled LOW
D4GPIO2pulled upOKHIGH at boot connected to on-board LED, boot fails if pulled LOW
D5GPIO14OKOKSPI (SCLK)
D6GPIO12OKOKSPI (MISO)
D7GPIO13OKOKSPI (MOSI)
D8GPIO15pulled to GNDOKSPI (CS) Boot fails if pulled HIGH
RXGPIO3OKRX pinHIGH at boot
TXGPIO1TX pinOKHIGH at boot debug output at boot, boot fails if pulled LOW
A0ADC0Analog InputX

GPIO6至GPIO11通常连接到ESP8266板上的flash芯片。因此,不建议使用这些引脚。

使用

使用ESP8266的GPIO最起码得包含相关引脚的头文件吧

#include "driver/gpio.h"

GPIO的初始化设置与STM32提供的标准库大同小异,都是通过一个结构体来进行配置,如下:

typedef struct {
    uint32_t pin_bit_mask;          /*!< GPIO pin: 配置某一号管脚 */
    gpio_mode_t mode;               /*!< GPIO mode: 设置输入输出模式de */
    gpio_pullup_t pull_up_en;       /*!< GPIO pull-up:使能上拉 */
    gpio_pulldown_t pull_down_en;   /*!< GPIO pull-down:使能下拉 */
    gpio_int_type_t intr_type;      /*!< GPIO interrupt type:是否使能中断,并配置中断模式 */
} gpio_config_t;

中断模式:

typedef enum {
    GPIO_INTR_DISABLE = 0,    /*!< Disable GPIO interrupt 失能中断*/
    GPIO_INTR_POSEDGE = 1,    /*!< GPIO interrupt type : 上升沿触发 */
    GPIO_INTR_NEGEDGE = 2,    /*!< GPIO interrupt type : 下降沿触发 */
    GPIO_INTR_ANYEDGE = 3,    /*!< GPIO interrupt type : 双边沿触发 */
    GPIO_INTR_LOW_LEVEL = 4,  /*!< GPIO interrupt type : 输入低电平触发 */
    GPIO_INTR_HIGH_LEVEL = 5, /*!< GPIO interrupt type : 输入高电平触发 */
    GPIO_INTR_MAX,
} gpio_int_type_t;c

用例1(不开启中断)

#define GPIO_OUTPUT_IO_0    15
#define GPIO_OUTPUT_IO_1    16
#define GPIO_OUTPUT_PIN_SEL  ((1ULL<<GPIO_OUTPUT_IO_0) | (1ULL<<GPIO_OUTPUT_IO_1))
//1ULL-->unsigned long long
void app_main(void)
{
	gpio_config_t io_conf;				 	   //创建一个GPIO结构体
    io_conf.intr_type = GPIO_INTR_DISABLE;		//失能中断服务
    io_conf.mode = GPIO_MODE_OUTPUT;			//设置成输出模式
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;	 //指定要配置的GPIO
    io_conf.pull_down_en = 0;				    //不使能下拉
    io_conf.pull_up_en = 0;					    //不使能上拉
    
    gpio_config(&io_conf);  					//配置GPIO
}

用例2(开启中断)

void app_main(void)
{
	io_conf.intr_type = GPIO_INTR_POSEDGE;      //设置中断类型为上升沿触发
    io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;  //GPIO引脚
    io_conf.mode = GPIO_MODE_INPUT;     //设置GPIO模式
    io_conf.pull_up_en = 1;             //使能上拉
    gpio_config(&io_conf);              //配置GPIO

    //改变指定的GPIO中断触发方式为双边沿触发,将GPIO_INPUT_IO_0的中断触发改为双边沿触发
    gpio_set_intr_type(GPIO_INPUT_IO_0, GPIO_INTR_ANYEDGE);
    
    gpio_install_isr_service(0);		//安装GPIO中断服务程序,即使能中断
    //配置某管脚中断事件触发的回调函数,参数:GPIO引脚,指定中断处理函数,传递给处理函数的参数
    gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void *) GPIO_INPUT_IO_0);
    gpio_isr_handler_add(GPIO_INPUT_IO_1, gpio_isr_handler, (void *) GPIO_INPUT_IO_1);

	//移除对应的GPIO中断处理程序,此处移除GPIO_INPUT_IO_0中断触发的回调函数
    gpio_isr_handler_remove(GPIO_INPUT_IO_0);
   
}

输出

设置GPIO输出电平

//参数:GPIO编号,输出电平状态:0低电平,1高电平,返回的是成功与否状态码
esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level);

输入检测

读取GPIO引脚电平

//参数:GPIO编号,返回的是电平状态
int gpio_get_level(gpio_num_t gpio_num);

中断相关

gpio_isr_registergpio_install_isr_service的区别

gpio_isr_register 函数是统一为所有的GPIO口注册一个全局的ISR,即任何的GPIO中断触发,都会调用该中断处理函数;

esp_err_t gpio_isr_register(void (*fn)(void *), void *arg, int no_use, gpio_isr_handle_t *handle_no_use);
参数解析
fn中断处理函数。
arg传递给中断处理函数的参数。
no_useno_use为了与esp32兼容,这个参数没有实际意义,可以用0来填充。
handle_no_use指针返回句柄。为了与esp32兼容,这个参数没有实际意义,可以用NULL来填充。

gpio_install_isr_service函数与gpio_isr_register不兼容,gpio_install_isr_service主要是开启中断服务,不针对某一个GPIO,需要搭配gpio_isr_handler_add使用;

esp_err_t gpio_install_isr_service(int no_use);

此处的no_use为了与esp32兼容,这个参数没有实际意义,可以用0来填充。

esp_err_t gpio_isr_handler_add(gpio_num_t gpio_num, gpio_isr_t isr_handler, void *args);
参数解析
gpio_num指定GPIO口
isr_handler对应的中断处理函数
args传递给中断处理函数的参数

更多接口原型,可以查看SDK目录/include/driver/gpio.h


我的GITHUB

我的个人博客

CSDN

### ESP8266 IO 引脚配置及操作方法 #### 配置引脚为输入或输出模式 对于ESP8266而言,每一个GPIO都可以被设定为输入或者输出状态。当作为输入使用时,可以通过`pinMode(pin, INPUT)`语句指定;而要将其设为输出,则应采用`pinMode(pin, OUTPUT)`的方式[^1]。 ```cpp // 设置D0 (即 GPIO16 ) 为输出模式 pinMode(D0, OUTPUT); ``` #### 数字I/O的操作 一旦完成了上述的模式定义之后,就可以利用`digitalWrite()`函数向选定的端口发送高低电平信号了。同样地,通过调用`digitalRead()`可以从该端口中获取当前的状态值——高电平或是低电平。 ```cpp // 向 D0 输出 HIGH 电平 digitalWrite(D0, HIGH); // 读取 D2 的逻辑电平并存储于变量 state 中 int state = digitalRead(D2); ``` #### 模拟输入功能的应用 值得注意的是,尽管大多数GPIO只支持数字级别的通信,但是ESP8266还提供了一个特殊的A0引脚用于处理模拟信号。这意味着能够接收来自传感器或者其他设备产生的连续变化的数据流,并且这些数据会被量化成介于0至1023之间的整数表示范围内的电压水平[^2]。 ```cpp void setup(){ pinMode(A0, INPUT); // 将 A0 设定为模拟输入模式 } void loop(){ int sensorValue = analogRead(A0); // 获取 A0 上的模拟电压对应的数值 } ``` #### 使用PWM实现模拟输出效果 虽然大部分GPIO不具备真正的DAC(数模转换器),但借助PWM技术可以在某些特定条件下模仿出近似的模拟输出行为。这通常涉及到周期性的改变占空比从而影响平均功率传输给负载元件比如LED灯泡亮度调节等场景下非常有用[^3]。 ```cpp analogWrite(D6, brightnessLevel); // 对接收到的 PWM 值进行调整以改变 LED 明暗程度 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大棋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值