今天我們來(lái)點(diǎn)燈。
多路復(fù)用器與GPIO矩陣
ESP32芯片有34個(gè)物理 GPIO Pad,每個(gè)Pad可以當(dāng)作通用IO,也可以當(dāng)作外設(shè)的引腳,GPIO 引腳通過(guò)非常復(fù)雜的 GPIO 矩陣互連,這基本上就是是一個(gè)多路復(fù)用器,我們可以非常靈活的選擇哪些GPIO引腳在內(nèi)部路由到哪個(gè)外設(shè)的信號(hào),大家可以看下圖:
IO_MUX 中每個(gè) GPIO pad 有一組寄存器。每個(gè) pad 可以配置成 GPIO 功能(連接 GPIO 交換矩陣)或者 直連功能。
有一些高速信號(hào)如以太網(wǎng)、SDIO、SPI、JTAG、UART 等會(huì)旁路 GPIO 交換矩陣以實(shí)現(xiàn)更好的高頻數(shù)字特性。所以高速信號(hào)會(huì)直接通過(guò) IO_MUX 輸入和輸出,這樣比使用 GPIO 交換矩陣的靈活度要低。
不同于STM32的簡(jiǎn)單復(fù)用,ESP32的多路復(fù)用器,使設(shè)計(jì)人員可以靈活地更改芯片內(nèi)部的 GPIO 引腳連接并將其路由到任何信號(hào),這樣硬件設(shè)計(jì)上,布線也方便的多。
通過(guò) IO_MUX、GPIO 交換矩陣的外設(shè)輸入
通過(guò) GPIO 交換矩陣輸出信號(hào)
ESP32還有18個(gè) GPIO 管腳具有低功耗(低功耗 RTC)和模擬功能,這個(gè)我們后面設(shè)計(jì)到具體案例再細(xì)說(shuō)。
完整管腳說(shuō)明需要去參考的樂鑫官方《ESP32 技術(shù)規(guī)格書》
特別提醒
ESP32的IO12上電時(shí)的電平會(huì)決定外部flash的工作電壓,上電時(shí)該腳為高則認(rèn)為flash工作于1.8V,為低則認(rèn)為flash工作于3.3V。常用的模塊該腳內(nèi)部已下拉,即flash是工作于3.3V的,若外部使用強(qiáng)上拉模塊就可能工作異常了。
硬件連接
數(shù)字輸出功能
這里我們就以一個(gè)LED燈來(lái)演示,首先,我們需要在setup()中初始化對(duì)應(yīng)的IO在輸出模式,使用pinMode函數(shù),第一個(gè)參數(shù)上對(duì)應(yīng)的IO序號(hào),第二個(gè)是IO的模式
pinMode(4, OUTPUT);
然后可以通過(guò)digitalWrite()函數(shù)改變數(shù)字引腳的電平狀態(tài),HIGH輸出高平,LOW輸出低電平
digitalWrite(4, HIGH); // 輸出高電平
digitalWrite(4, LOW); // 輸出低電平
所有 ESP32 GPIO 引腳都可以在輸入或輸出模式下運(yùn)行。引腳34-39只能用于輸入。還有其他一些引腳也有其它特性,這個(gè)我們現(xiàn)在也沒必要太糾結(jié),用到的時(shí)候再去看就好了。
數(shù)字輸入功能
在輸入模式下,我們可以通過(guò)IO來(lái)讀取外部數(shù)字信號(hào),我們這里用按鍵來(lái)表示。
跟輸出模式一樣,我們?cè)趕etup()中初始化對(duì)應(yīng)的IO在輸入模式,也使用pinMode函數(shù)
pinMode(2, INPUT);
然后通過(guò)digitalRead(GPIO_pin)就可以讀取對(duì)應(yīng)IO的電平了。
代碼示例
下面的代碼我們定義了2個(gè)GPIO引腳。GPIO2用于按鍵輸入,GPIO4用于LED輸出。
初始化之后,我們?cè)趌oop()中不斷的讀取按鍵的電平狀態(tài),并賦值給LED,實(shí)現(xiàn)按鍵下去燈熄滅,松開燈點(diǎn)亮的效果。
#define LED_GPIO 4
#define BTN_GPIO 2
int BTN_State = 0; //按鍵狀態(tài)
void setup()
{
pinMode(LED_GPIO, OUTPUT);
pinMode(BTN_GPIO, INPUT);
}
void loop()
{
// 讀取按鍵狀態(tài)
BTN_State = digitalRead(BTN_GPIO);
// 把按鍵狀態(tài)做為L(zhǎng)ED燈的輸出
digitalWrite(LED_GPIO, BTN_State);
}
我們按照前面的教程編譯程序,刷入開發(fā)板,看下效果:
接下來(lái)我們用中斷的方式實(shí)現(xiàn)一下:
attachInterrupt(uint8_t pin, void ()(void), int mode)函數(shù)用來(lái)配置中斷功能:
- 參數(shù)一,GPIO引腳號(hào)
- 參數(shù)二,中斷回調(diào)函數(shù)
- 參數(shù)三,中斷觸發(fā)模式(RISING、FALLING、CHANGE等)
參數(shù)三這個(gè)可以設(shè)置各種模式,例如上升沿觸發(fā),下降沿出發(fā),任意沿觸發(fā),電平信號(hào)等等模式。
我們用上面的例子改一下:
#define LED_GPIO 4
#define BTN_GPIO 2
int BTN_State = 0; //按鍵狀態(tài)
//中斷回調(diào)函數(shù)
void bt_callBack(void)
{
BTN_State = digitalRead(BTN_GPIO); // 讀取按鍵狀態(tài)
digitalWrite(LED_GPIO, BTN_State); // 把按鍵狀態(tài)做為L(zhǎng)ED燈的輸出
}
void setup()
{
pinMode(LED_GPIO, OUTPUT); //LED輸出模式
pinMode(BTN_GPIO, INPUT); //輸入上拉模式
attachInterrupt(BTN_GPIO, bt_callBack, CHANGE); //使能中斷
}
void loop()
{
}
主程序中不用做任何事情了,中斷檢測(cè)到有按鍵按下或松開(任意跳變沿),就會(huì)觸發(fā)執(zhí)行中斷回調(diào)函數(shù),然后把結(jié)果在LED上輸出。
ESP32的GPIO外設(shè)相對(duì)其它單片機(jī),功能還是略微復(fù)雜的,但是不管是SDK的開發(fā)還是Arduino方式,官方都幫我們寫好相應(yīng)的庫(kù)了,復(fù)雜的配置都已經(jīng)定義好了,我們直接調(diào)用即可,怎么樣,是不是非常簡(jiǎn)單?
-
以太網(wǎng)
+關(guān)注
關(guān)注
40文章
5465瀏覽量
172847 -
寄存器
+關(guān)注
關(guān)注
31文章
5372瀏覽量
121314 -
復(fù)用器
+關(guān)注
關(guān)注
1文章
737瀏覽量
28427 -
GPIO
+關(guān)注
關(guān)注
16文章
1217瀏覽量
52447 -
ESP32
+關(guān)注
關(guān)注
18文章
980瀏覽量
17582
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
ESP8266 NodeMCU怎樣讀取數(shù)字輸入跟數(shù)字輸出點(diǎn)亮一個(gè)led呢
5、ESP8266 NodeMCU 數(shù)字輸入和數(shù)字輸出
![5、<b class='flag-5'>ESP</b>8266 NodeMCU <b class='flag-5'>數(shù)字</b><b class='flag-5'>輸入</b>和<b class='flag-5'>數(shù)字</b><b class='flag-5'>輸出</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32 開發(fā)筆記(四)LVGL控件學(xué)習(xí) Window 窗口控件 X
![<b class='flag-5'>ESP32</b> 開發(fā)<b class='flag-5'>筆記</b>(四)LVGL控件<b class='flag-5'>學(xué)習(xí)</b> Window 窗口控件 X](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
[ESP32]學(xué)習(xí)筆記02
![[<b class='flag-5'>ESP32</b>]<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>02](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
esp32學(xué)習(xí)之按鍵檢測(cè)gpio中斷
![<b class='flag-5'>esp32</b><b class='flag-5'>學(xué)習(xí)</b>之按鍵檢測(cè)<b class='flag-5'>gpio</b>中斷](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ZYNQ學(xué)習(xí)筆記_GPIO之輸入輸出
![ZYNQ<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>_<b class='flag-5'>GPIO</b>之<b class='flag-5'>輸入輸出</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32入門之GPIO:點(diǎn)亮一盞LED燈
![<b class='flag-5'>ESP32</b>入門之<b class='flag-5'>GPIO</b>:點(diǎn)亮一盞LED燈](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
[ESP32]學(xué)習(xí)筆記04
![[<b class='flag-5'>ESP32</b>]<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>04](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32 之 ESP-IDF 教學(xué)(八)—— 模數(shù)轉(zhuǎn)換器(ADC)
![<b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP</b>-IDF 教學(xué)(八)—— 模數(shù)轉(zhuǎn)換器(ADC)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
SPI主線協(xié)議——ESP32學(xué)習(xí)筆記
![SPI主線協(xié)議——<b class='flag-5'>ESP32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32學(xué)習(xí)筆記---GPIO
![STM32<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>---<b class='flag-5'>GPIO</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32 單片機(jī)學(xué)習(xí)筆記 - 04 - ADC和定時(shí)器
![<b class='flag-5'>ESP32</b> 單片機(jī)<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 04 - ADC和定時(shí)器](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
數(shù)字輸入與輸出原理是什么
![<b class='flag-5'>數(shù)字</b><b class='flag-5'>輸入</b>與<b class='flag-5'>輸出</b>原理是什么](https://file1.elecfans.com/web2/M00/B3/1C/wKgZomVkEHKAK_L-AAIvlo1OAnw644.jpg)
評(píng)論