ESP8266 SDK開發篇(五)——GPIO

這次讓我來說說ESP8266操作GPIO的方法,首先引入三個頭文件,這裏包括了所有GPIO接口。

#include "gpio.h"
#include "eagle_soc.h"
#include "gpio16.h"

然後是引腳定義,引腳有三種定義類型,分別是:

PIN_PULLUP_DIS(PIN_NAME);           //管腳上拉屏蔽
PIN_PULLUP_EN(PIN_NAME);            //管腳上拉使能
PIN_FUNC_SELECT(PIN_NAME,FUNC) ;    //管腳功能選擇

前兩個我基本沒用過,我主要是用第三個,另外有些GPIO口是沒有內部上拉的,好像是GPIO4、GPIO5,記不太清了,有興趣瞭解的朋友就要另外度娘了,也可以在評論區留言互相學習。
關於PIN_NAME和FUNC可以在頭文件eagle_soc.h中找到定義,也可以去樂鑫官網找管腳清單,裏面對寄存器的說明很詳細。
例子:PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); \\對GPIO4的定義


設置GPIO管腳的輸入輸出可以通過如下函數

gpio_output_set(uint32 set_mask,    //設置輸出高電平的位,無則爲0
                uint32 clear_mask,  //設置輸出低電平的位,無則爲0
                uint32 enable_mask, //設置使能輸出位
                uint32 disable_mask //設置使能輸入位)
例子:
gpio_output_set(BIT12, BIT13, BIT12|BIT13, 0);設置GPIO12輸出高電平,GPIO13輸出低電平; 
gpio_output_set(0, 0, 0, BIT12);設置GPIO12爲輸入

此外還能通過相關輸入輸出宏達到同樣的效果

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_OUTPUT_SET(GPIO_ID_PIN(13), 1);    //GPIO13輸出高電平
GPIO_DIS_OUTPUT(0);                     //設置GPIO0爲輸入管腳
GPIO_INPUT_GET(GPIO_ID_PIN(5));         //讀取GPIO5管腳電平

這樣對GPIO管腳的定義和操作就結束了,最好把GPIO的初始化放到函數裏,避免user_init()函數過長。


最後再說一個小方法,我在學校做項目的時候,因爲要自己設計pcb板,有時候管腳連線會發生變化,而我寫的函數有很多,這樣要在那麼長的代碼裏找到gpio_init()這個函數實在麻煩,所以可以通過宏定義的方式來定義GPIO口,比如:

#define RELAY_LED_PIN_NUM         4
#define RELAY_LED_PIN_FUNC        FUNC_GPIO4
#define RELAY_LED_PIN_MUX         PERIPHS_IO_MUX_GPIO4_U
#define RELAY_LED_PIN_RD_INIT()   PIN_FUNC_SELECT( RELAY_LED_PIN_MUX, RELAY_LED_PIN_FUNC )
#define RELAY_LED_PIN_SET_HIGH()  GPIO_OUTPUT_SET(RELAY_LED_PIN_NUM,1)
#define RELAY_LED_PIN_SET_LOW()   GPIO_OUTPUT_SET(RELAY_LED_PIN_NUM,0)
#define RELAY_LED_PIN_STATUS      ( GPIO_INPUT_GET(RELAY_LED_PIN_NUM) != 0 )

這樣一來只需要在程序開頭修改就可以作用整個文件,比較方便。

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