這次讓我來說說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 )
這樣一來只需要在程序開頭修改就可以作用整個文件,比較方便。