GPIO 相关接⼝位于 /ESP8266_NONOS_SDK/include/eagle_soc.h & gpio.h。 使⽤示例可参考 /ESP8266_NONOS_SDK/examples/IoT_Demo/user/user_plug.c

一、宏定义控制GPIO管脚状态

PIN_PULLUP_DIS(PIN_NAME) 管脚上拉屏蔽

PIN_PULLUP_EN(PIN_NAME) 管脚上拉使能

PIN_FUNC_SELECT(PIN_NAME, FUNC) 管脚功能选择//PIN_NAME所对应得8266管脚(管脚可使用 PERIPHS 10 MUX +8266管教名宏定义所对应所有引脚)FUNC对应功能(参数设为功能号-1)

esp8266 gpio 数量 esp8266 gpio入门篇_esp8266 gpio 数量

示例:

//管脚功能选择(注意:参数1 [PIN _NAME]管脚名、参数2 [FUNC]管脚功能)
PIN FUNC SELECT(PERIPHS 10 MUX GPIO4 U. FUNC GPIO4)// GPIO4设为IO口
//将相应管脚设为输出模式,并输出对应电平(参数1 [gpio_ no]、参数2:输出电平)
GPIO_ OUTPUT SET(GPIO_ 1D_ PIN(4), 1);// IO4 = 1 (高电平)

二、gpio_output_set

  • 功能:设置 GPIO 属性,(将GPIO口设置为输出模式,输出参数2所对应得电平)静止IO口输出功能。
  • 函数定义
void	gpio_output_set
{
				uint32	set_mask;
				uint32	clear_mask;
				uint32	enable_mask;	
				uint32	disable_mask;
}
  • 参数:
    uint32 set_mask:设置输出为⾼的位,对应位为1,输出⾼,对应位为0,不改变状态
    uint32 clear_mask:设置输出为低的位,对应位为1,输出低,对应位为0,不改变状态
    uint32 enable_mask:设置使能输出的位
    uint32 disable_mask:设置使能输⼊的位
  • 返回::⽆
  • 示例1
gpio_output_set(BIT12,	0,	BIT12,	0)//设置 GPIO12 输出⾼电平;
gpio_output_set(0,	BIT12,	BIT12,	0)//设置 GPIO12 输出低电平;
gpio_output_set(BIT12,	BIT13,	BIT12|BIT13,0)//设置 GPIO12 输出⾼电平,GPIO13 输出低电平;
gpio_output_set(0,	0,	0,	BIT12)//设置 GPIO12 为输⼊
  • 示例2
    //
//初始化LED(注意[PIN_ NAME]、[FUNC] 、[gpio_ no]不要混淆)
PIN_ FUNC_ SELECT (PERIPHS_ IO _MUX_ GPIO4_ U,FUNC_ GPIO4) ;// GPIO_ 4设为IO口
GPI0_ OUTPUT_ SET(GPIO_ ID_ PIN(4),1); //GPIO_4=1
//初始化按键(BOOT == GPIO0)
PIN_ FUNC_ SELECT (PERIPHS_ IO_ MUX_ GPIO0_ U, FUNC_ GPIO0); // GPIO_0设为IO口
GPIO_ DIS_ OUTPUT(GPIO_ ID_ PIN(0)) ;//GPIO_0失能输出(默认)
PIN_ PULLUP_ DIS (PERIPHS_ IO_ MUX_ GPIO0_ U) ;//GP1O_0关闭内部上拉(默认)GPIO0外接上拉。
// PIN_ PULLUP_ EN(PERIPHS_IO_ MUX_GPIO0_U) ;// GPIO_0打开内部上拉

三、GPIO 输⼊输出相关宏

GPIO_OUTPUT_SET(gpio_no,bit_value)//设置 gpio_no 管脚输出 bit_value,与上⼀节的输出⾼低电平的示例相同。
GPIO_DIS_OUTPUT(gpio_no) //设置 gpio_no 管脚输⼊,与上⼀节的设置输⼊示例相同。
GPIO_INPUT_GET(gpio_no) //获取 gpio_no 管脚的电平状态。

四、GPIO 中断

ETS_GPIO_INTR_ATTACH(func,	arg) //注册 GPIO 中断处理函数
ETS_GPIO_INTR_DISABLE() //关 GPIO 中断
ETS_GPIO_INTR_ENABLE() //开 GPIO 中断

五、gpio_pin_intr_state_set

  • 功能:设置 GPIO 中断触发状态
  • 函数定义:
void	gpio_pin_intr_state_set
{
				uint32	i,	
				GPIO_INT_TYPE	intr_state
}
  • 参数:
    uint32 i:GPIO pin ID,例如设置 GPIO14,则为 GPIO_ID_PIN(14);GPIO_INT_TYPE intr_state 中断触发状态:
typedef	enum	
{
				GPIO_PIN_INTR_DISABLE	=	0,
				GPIO_PIN_INTR_POSEDGE	=	1,
				GPIO_PIN_INTR_NEGEDGE	=	2,
				GPIO_PIN_INTR_ANYEDGE	=	3,
				GPIO_PIN_INTR_LOLEVEL	=	4,
				GPIO_PIN_INTR_HILEVEL	=	5
}	
	GPIO_INT_TYPE;
  • 返回:⽆
  • 示例
// GPIO_ 0中断设置
ETS_ GPIO_ INTR_ DISABLE();//关闭GPIO中断功能
ETS_ GPIO_ INTR_ ATTACH((ets_ isr_ t) GPIO_ INTERRUPT, NULL) ;//注册中断回调函数
gpio_ pin_ intr_ state_ set(GPIO_ TD_ PIN(O), GP1O PIN_ INTR_ NEGEDGE); // GPIO_0下降沿中断
//GPIO_ PIN_ INTR_ DISABLE = 0; // 不触发中断
//GPIO_ PIN_ INTR_ POSEDGE = 1; // 上升沿中断
//GPIO_ PIN_ INTR_ NEGEDGE = 2; // 下降沿中断
//GPIO_ PIN_ INTR_ ANYEDGE = 3; // 双边沿中断
//GPIO_ PIN_ INTR_ LOLEVEL = 4; // 低电平中断
//GPIO_ PIN_ INTR_ HILEVEL = 5; // 高电平中断
ETS_ GP1O_ INTR_ ENABLE() ;//打开GPIO中断功能
//自定义一个中断函数,注意中断函数前不要有"ICACHE_ FLASH_ ATTR"宏
void GPIO INTERRUPT(void)
{
u32 S_GPIO_INT; //所有IO口的中断状态
u32 F_GP1O 0 INT; // GPIO 0的中断状态
...
}

六、GPIO 中断处理函数

在 GPIO 中断处理函数内,需要做如下操作来清除响应位的中断状态:

uint32	gpio_status;
gpio_status	=	GPIO_REG_READ(GPIO_STATUS_ADDRESS);//clear	interrupt	status
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS,gpio_status);

七、管脚清单

esp8266 gpio 数量 esp8266 gpio入门篇_中断处理_02