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)
示例:
//管脚功能选择(注意:参数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);