ESP8266 GPIO 使用說明

1. 概述

    ESP8266 共有 16 個通用 IO,管腳的位置和管腳的名稱分別爲:

GPIO NO.      pin NO.        pin name

GPIO0

      pin 15   GPIO0_U
GPIO1       pin 16   U0TXD_U
GPIO2       pin 14   GPIO2_U
GPIO3       pin 25    U0RXD_U
GPIO4       pin 16    GPIO4_U
GPIO5       pin 24    GPIO5_U
GPIO6       pin 21    SD_CLK_U
GPIO7       pin 22    SD_DATA0_U
GPIO8       pin 23    SD_DATA1_U
GPIO9       pin 18    SD_DATA2_U
GPIO10       pin 19    SD_DATA3_U
GPIO11       pin 20    SD_CMD_U
GPIO12       pin 10    MTDI_U
GPIO13       pin 12    MTCK_U
GPIO14       pin 9    MTMS_U
GPIO15       pin 13    MTDO_U

其中,在四線(QUAD)模式 flash 下,有六個 IO 口用於 flash 通訊。

在兩線(DUAL)模式 flash 下,有四個 IO 口用於與 flash 通訊。

2. GPIO寄存器說明

   2.1 GPIO 功能選擇寄存器

下面以8266的MTDI爲例,說明GPIO功能的選擇。

功能選擇寄存器 PERIPHS_IO_MUX_MTDI_U (不同的GPIO,該寄存器不同)

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);

此處的FUNC_GPIO12 = 3;

不同的 PIN 腳,配置不同。

配置的時候,請參考 ESP8266_Pin_List_xxxxxx.xlsx 表格,在該表格的 Digital Die Pin List 頁中可以查到通用的 GPIO 以及複用功能。在 Reg 頁可以查閱到 GPIO 功能選擇相關的寄存器。

Digital Die Pin List 該頁中的 FUNCTION 下拉選擇項就是功能的配置選項。需要注意的是,如果需要配置爲 FUNCTION3, 應該往寄存器對應的位中寫 2,如果需要配置爲 FUNCTION2, 應該往寄存器對應的爲中寫 1, 以此類推。

2.2 GPIO 輸出寄存器

    a) 輸出使能寄存器 GPIO_ENABLE_W1TS

    b) 輸出禁用寄存器 GPIO_ENABLE_W1TC

     c) 輸出使能狀態寄存器 GPIO_ENABLE

     d) 輸出低電平寄存器 GPIO_OUT_W1TC

     e) 輸出高電平寄存器 GPIO_OUT_W1TS

     f)輸出狀態寄存器 GPIO_OUT

2.3 GPIO 輸入寄存器

      輸入狀態寄存器 GPIO_IN

2.4 GPIO 中斷寄存器

    a) 中斷類型寄存器 GPIO_PIN12    (中斷禁用,上升沿觸發,下降沿觸發,雙沿觸發,低電平,高電平)

    b) 中斷狀態寄存器 GPIO_STATUS 

    c) 清中斷寄存器 GPIO_STATUS_W1TC

2.5 GPIO16 對應接口

      GPIO16(XPD_DCDC) 不屬於通用GPIO模塊,屬於RTC模塊。可以用來在深度睡眠時候喚醒整個芯片,可以配置爲輸入或者輸出模式,但無法觸發 IO 中斷。使用接口如下:

    a). gpio16_output_conf(void):  將 GPIO16 配置爲輸出模式。

    b). gpio16_output_set(uint8 value):

         從 GPIO16 輸出高電平/低電平,需要先配置爲輸出模式。

    c). gpio16_input_conf(void)

         將 GPIO16 的輸入電平狀態,需要先配置爲輸入模式。

    d). gpio16_input_get(void)

         讀取 GPIO16 的輸入電平狀態,需要先配置爲輸入模式。

3 參數配置

    應用場景

    1)  配置 MTDI 輸出高電平,並能使其上拉;

    2)  配置 MTDI 爲輸入模式,並獲取其電平狀態;

    3)  配置 MTDI 爲下降沿觸發中斷。

3.1 應用場景1參數配置

    Step 1) 配置 MTDI 爲 GPIO 模式

           PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);

           該語句的作用是向 PERIPHS_IO_MUX_MTDI_U 寄存器的第4位、第5位寫1。

PERIPHS_IO_MUX_MTDI_U 寄存器的第4位和第5位置1表示將 MTDI 配置爲 GPIO 功能。 PERIPHS_IO_MUX_MTDI_U 寄存器。

    Step 2) 配置 MTDI 輸出高電平

            GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);

    該語句有兩個作用:

  • 向 GPIO_ENABLE_W1TS 的寄存器第12位寫1,該位置1表示使能 MTDI 的輸出功能。
  • 向 GPIO_OUT_W1TS 的寄存器第12位寫1,該位置1表示將 MTDI 輸出爲高電平。

備註:需要 MTDI 配置輸出低電平,將該函數額第二個參數設置爲0即可。

    Step 3) 使能 MTDI 上拉

             PIN_PULLUP_EN(PERIPHS_IO_MUX_MTDI_U);

             該語句作用是向 PERIPHS_IO_MUX_MTDI_U 的第7位寫1.該位置 1 表示使能MTDI 的上拉功能。

備註:如果需要關閉 MTDI 的上拉功能,請使用如下語句

          PIN_PULLUP_DIS(PERIPHS_IO_MUX_MTDI_U);

3.2 應用場景2參數配置

      Step 1) 配置 MTDI 爲 GPIO 模式

                  PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);

                  該語句的作用: 向 PERIPHS_IO_MUX_MTDI_U 寄存器的第4位、第5位寫 1。PERIPHS_IO_MUX_MTDI_U 寄存器的第4位和第5位置1 表示 將 MTDI 配置爲 GPIO 功能。

       Step 2) 配置 MTDI 爲輸入模式

                   GPIO_DIS_OUTPUT(GPIO_ID_PIN(12));

       Step 3) 獲取 MTDI 管腳的電平狀態

                   Uint8 level = 0;

                   level = GPIO_INPUT_GET(GPIO_ID_PIN(12));

                   GPIO_INPUT_GET(GPIO_ID_PIN(12)) 語句實際是獲取 GPIO_IN 寄存器第 12 位的狀態,該寄存器的值反映的是對應的管腳的輸入電平(必須使能對應的管腳的輸入功能,該寄存器的狀態纔有效)。

備註:

        如果 MTDI 的電平爲高電平,那麼 GPIO_INPUT_GET 的返回值爲 1,level = 1;

        如果 MTDI 的電平爲低電平,那麼 GPIO_INPUT_GET 的返回值爲 0,level = 0;

3.3 應用場景3參數配置

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_INIT_TYPE;
    該結構體用來配置 gpio 的中斷觸發方式,該結構體在 gpio.h 中聲明。
Step 1) 配置 MTDI 爲 GPOI 模式
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
    該語句的作用是向 PERIPHS_IO_MUX_MTDI_U 寄存器的第4位、第5位寫1.PERIPHS_IO_MUX_MTDI_U 寄存器的第4位和第5位置1表示將 MTDI 配置爲 GPIO 功能。
Step 2) 配置 MTDI 爲輸入模式
    GPIO_DIS_OUTPUT(GPIO_ID_PIN(12));
Step 3) 禁止所有的IO中斷
    ETS_GPIO_INTR_DISABLE();
Step 4) 設置中斷處理函數
    ETS_GPIO_INTR_ATTACH(GPIO_INTERRUPT, NULL);
Step 5) 配置 MTDI 爲下降沿中斷觸發的方式
    gpio_pin_intr_state_set(GPIO_ID_PIN(12), GPIO_PIN_INTR_NEGEDGE);
    該語句的作用 向GPIO_PIN12 的寄存器的 [9:7]位寫入0x02,向該位域內寫入0x02, 表示配置爲下降沿中斷。
備註:若需要禁用 MTDI 的中斷功能,只需要將向 GPIO_PIN12 的寄存器的 [9:7]位寫入0x00即可。如需配置爲其他的中斷觸發模式,請參閱 GPIO 寄存器章節。
Step 6) 使能 gpio 中斷
    ETS_GPIO_INTR_ENABLE();

3.4 中斷函數處理流程說明

Step 1) 清除該中斷
    Uint16 gpio_status = 0;
    gpio_status = GPIO_REG_READ(GPIO_STATUS);
    GPIO_REG_WRITE(GPIO_STATUS_W1TC, gpio_status);
    GPIO_STATUS 和 GPIO_STATUS_W1TC 說明請參閱 GPIO 寄存器章節。
Step 2) 判斷是哪個IO觸發的中斷(當有多個IO都配置爲中斷方式時)
    If(gpio_status == GPIO_Pin_12)
Step 3) 如果是雙沿中斷,應該判斷此次中斷爲上升沿中斷還是下降沿中斷
    If(!GPIO_INPUT_GET(GPIO_ID_PIN(12)))    // 如果 MTDI 此次觸發方式爲下降沿

3.5 中斷函數處理流程示例

void gpio_intr_handler()
{
    uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);    // read interrupt status
    uint8 level = 0;
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);      // clear interrupt mask
    if (gpio_status & (BIT(12)))   // judeg whether interrupt source is gpio12
    {
        if (GPIO_INPUT_GET(12))    // if gpio12 is high level
        {

        }
        else    // if gpio12 is low level
        {
            
        }
    }
    else
    {

    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章