想用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);