文章目錄
- 一、前言
- 二、接口
- 三、執行個體
一、前言
點燈是學習單片機的第一步,就好像學習程式設計語言的第一步一定是輸出Hello World一樣。點燈需要操作GPIO,接下來就介紹ESP8266如何操作GPIO。
二、接口
1、配置GPIO
PIN_FUNC_SELECT(PIN_NAME, FUNC)
PIN_FUNC_SELECT(IO口的寄存器位址 , 功能)
可以使用Open Declearation來檢視可選參數
//舉例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外接的按鈕
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上,高電平點亮
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);
}
// 自定義的毫秒延時函數
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);
}
}