天天看點

ESP8266 GPIO入門(轉)

想用ESP8266作一個wifi的遊戲搖桿,但發現買的ESP8266子產品GPIO引腳數量有限。是以就想看能不能自已把SPI功能關了,使用引腳的GPIO功能。這樣就可以多出來三個引腳。找到了下邊的資源拿來分享。使用的開發闆是wemos d1的arduino開發闆,此開發闆隻有一個Esp8266子產品,但是可以使用arduino開發環境來作開發。

了解一款MCU無法是從了解時鐘配置以及GPIO開始,對于8266的GPIO,我們可以從官方的SDK文檔中查到

1. PIN 相關宏定義

以下宏定義控制 GPIO 管腳狀态

PIN_PULLUP_DIS(PIN_NAME)

管腳上拉屏蔽

PIN_PULLUP_EN(PIN_NAME)

管腳上拉使能

PIN_FUNC_SELECT(PIN_NAME, FUNC)

管腳功能選擇

?示例: 

// Use MTDI pin as GPIO12.

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);

2. gpio_output_set

功能:

設定 GPIO 屬性

函數定義: 

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 : 設定使能輸?入的位

傳回: 

?無

Espressif Systems

ESP8266  SDK 程式設計?手冊

?示例: 

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 為輸?入

3. 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 管腳的電平狀态。

4. GPIO 中斷

ETS_GPIO_INTR_ATTACH(func, arg)

注冊 GPIO 中斷處理函數

ETS_GPIO_INTR_DISABLE()

關 GPIO 中斷

ETS_GPIO_INTR_ENABLE()

開 GPIO 中斷

5. gpio_pin_intr_state_set

功能: 

設定 GPIO 中斷觸發狀态

函數定義: 

void gpio_pin_intr_state_set(

uint32 i, 

GPIO_INT_TYPE intr_state

)

Espressif Systems

ESP8266  SDK 程式設計?手冊

參數: 

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_ANYEGDE = 3,

GPIO_PIN_INTR_LOLEVEL = 4,

GPIO_PIN_INTR_HILEVEL = 5

} GPIO_INT_TYPE;

傳回: 

?無

6. 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);

從上面資料我們可以知道,對于8266的GPIO操作也是需要首先配置引腳為GPIO功能,比如配置GPIO12

隻需要配置以下幾步

// Use MTDI pin as GPIO12.

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);

輸出高電平

GPIO_OUTPUT_SET(FUNC_GPIO12, 1);

配置輸入

GPIO_DIS_OUTPUT(FUNC_GPIO12);

獲得GPIO電平

uin16 status=GPIO_INPUT_GET(FUNC_GPIO12);

配置GPIO中斷處理函數:

ETS_GPIO_INTR_ATTACH(func, arg) 

使用方法:先定義一個GPIO中斷處理函數,arg如果沒有參數直接輸入NULL

void GPIO_INTER(void)
  
  

   {
  
  

   uint32 gpio_status;
  
  

   gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
  
  

   //clear interrupt status
  
  

   GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
  
  

   }
  
  

   ETS_GPIO_INTR_ATTACH(GPIO_INTER, NULL);      

繼續閱讀