天天看點

ESP8266--SDK開發(GPIO輸入輸出)

文章目錄

  • ​​一、前言​​
  • ​​二、接口​​
  • ​​三、執行個體​​

一、前言

點燈是學習單片機的第一步,就好像學習程式設計語言的第一步一定是輸出Hello World一樣。點燈需要操作GPIO,接下來就介紹ESP8266如何操作GPIO。

二、接口

1、配置GPIO

PIN_FUNC_SELECT(PIN_NAME, FUNC)
PIN_FUNC_SELECT(IO口的寄存器位址 , 功能)      

可以使用Open Declearation來檢視可選參數

ESP8266--SDK開發(GPIO輸入輸出)
ESP8266--SDK開發(GPIO輸入輸出)
//舉例1:配置GPIO2作為普通IO
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);

//舉例2:配置GPIO作為序列槽功能
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_UART1_TXD_BK);

//舉例3:配置GPIO5作為普通IO
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);      

2、輸出高低電平

GPIO_OUTPUT_SET(gpio_no, bit_value)
GPIO_OUTPUT_SET(gpio編号, 輸出值0-1)      
//舉例1:GPIO2輸出高電平
GPIO_OUTPUT_SET(2, 1)

//舉例2:GPIO2輸出低電平
GPIO_OUTPUT_SET(2, 0)      

3、讀取GPIO狀态

GPIO_INPUT_GET(gpio_no)
GPIO_OUTPUT_SET(gpio編号)      
//檢測輸入的第一種方式:在引腳為輸出的狀态下,檢測引腳輸入狀态
//舉例1:檢測GPIO2
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2); //配置GPIO2
GPIO_OUTPUT_SET(2, 1);  //設定GPIO2輸出高電平
if(GPIO_INPUT_GET(2) == 1) {
  //GPIO2目前為高電平
}      

如果某個引腳控制傳感器,傳感器本身引腳有很強的拉低能力,也可以用此模式檢測,例如:開發闆GPIO0外接的按鈕

ESP8266--SDK開發(GPIO輸入輸出)
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U,FUNC_GPIO0); //配置GPIO0
GPIO_OUTPUT_SET(0, 1);  //設定GPIO0輸出高電平
if(GPIO_INPUT_GET(2) == 0) {
  //GPIO2目前為低電平,按鈕按下
  //解釋:即使控制引腳輸出了高電平,當按下按鈕的時候,引腳接地,引腳強制被拉低.
}      

如果所接傳感器的輸出能力不強,則需要看下面第二種方式

//檢測輸入的第二種方式:檢測輸入的時候設定管腳為輸入然後再做檢測,該模式主要應用于和晶片之間通信;
//設定引腳輸入上拉 PIN_PULLUP_EN(引腳的寄存器位址)。
//舉例1:檢測GPIO0
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U,FUNC_GPIO0); //配置GPIO0
GPIO_DIS_OUTPUT(0); //如果以前設定過GPIO為輸出,則調用此函數關閉GPIO0輸出
PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);//上拉輸入

if(GPIO_INPUT_GET(0) == 0) {
  //引腳被拉低
}      

4、配置多個引腳為輸入

GPIO_AS_INPUT(gpio_bits)

//舉例1:配置GPIO2,GPIO13為輸入
GPIO_AS_INPUT(BIT2 | BIT3);      

三、執行個體

esp8266闆載自帶一個led接在GPIO2上,高電平點亮

ESP8266--SDK開發(GPIO輸入輸出)

1、點亮led小燈

//主函數入口
void ICACHE_FLASH_ATTR
user_init(void)
{
    os_printf("=== System start ===\n");
    os_printf("SDK version:%s\n", system_get_sdk_version());

    //配置GPIO2為普通IO
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
    //GPIO2輸出高電平
    GPIO_OUTPUT_SET(2,1);
}      
ESP8266--SDK開發(GPIO輸入輸出)
// 自定義的毫秒延時函數
void ICACHE_FLASH_ATTR delay_ms(u32 C_time)
{   for(;C_time>0;C_time--)
    { os_delay_us(1000);}
}

//主函數入口
void ICACHE_FLASH_ATTR
user_init(void)
{
    os_printf("=== System start ===\n");
    os_printf("SDK version:%s\n", system_get_sdk_version());

    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);

    while(1) {
        system_soft_wdt_feed(); //這裡我們喂下看門狗  ,不讓看門狗複位
        
        GPIO_OUTPUT_SET(2,1);
        delay_ms(1000);
        
        GPIO_OUTPUT_SET(2,0);
        delay_ms(1000);
    }
}