今天我們來點燈。
多路復用器與GPIO矩陣
ESP32芯片有34個物理 GPIO Pad,每個Pad可以當作通用IO,也可以當作外設的引腳,GPIO 引腳通過非常復雜的 GPIO 矩陣互連,這基本上就是是一個多路復用器,我們可以非常靈活的選擇哪些GPIO引腳在內部路由到哪個外設的信號,大家可以看下圖:
IO_MUX 中每個 GPIO pad 有一組寄存器。每個 pad 可以配置成 GPIO 功能(連接 GPIO 交換矩陣)或者 直連功能。
有一些高速信號如以太網、SDIO、SPI、JTAG、UART 等會旁路 GPIO 交換矩陣以實現更好的高頻數字特性。所以高速信號會直接通過 IO_MUX 輸入和輸出,這樣比使用 GPIO 交換矩陣的靈活度要低。
不同于STM32的簡單復用,ESP32的多路復用器,使設計人員可以靈活地更改芯片內部的 GPIO 引腳連接并將其路由到任何信號,這樣硬件設計上,布線也方便的多。
通過 IO_MUX、GPIO 交換矩陣的外設輸入
通過 GPIO 交換矩陣輸出信號
ESP32還有18個 GPIO 管腳具有低功耗(低功耗 RTC)和模擬功能,這個我們后面設計到具體案例再細說。
完整管腳說明需要去參考的樂鑫官方《ESP32 技術規格書》
特別提醒
ESP32的IO12上電時的電平會決定外部flash的工作電壓,上電時該腳為高則認為flash工作于1.8V,為低則認為flash工作于3.3V。常用的模塊該腳內部已下拉,即flash是工作于3.3V的,若外部使用強上拉模塊就可能工作異常了。
硬件連接
數字輸出功能
這里我們就以一個LED燈來演示,首先,我們需要在setup()中初始化對應的IO在輸出模式,使用pinMode函數,第一個參數上對應的IO序號,第二個是IO的模式
pinMode(4, OUTPUT);
然后可以通過digitalWrite()函數改變數字引腳的電平狀態,HIGH輸出高平,LOW輸出低電平
digitalWrite(4, HIGH); // 輸出高電平
digitalWrite(4, LOW); // 輸出低電平
所有 ESP32 GPIO 引腳都可以在輸入或輸出模式下運行。引腳34-39只能用于輸入。還有其他一些引腳也有其它特性,這個我們現在也沒必要太糾結,用到的時候再去看就好了。
數字輸入功能
在輸入模式下,我們可以通過IO來讀取外部數字信號,我們這里用按鍵來表示。
跟輸出模式一樣,我們在setup()中初始化對應的IO在輸入模式,也使用pinMode函數
pinMode(2, INPUT);
然后通過digitalRead(GPIO_pin)就可以讀取對應IO的電平了。
代碼示例
下面的代碼我們定義了2個GPIO引腳。GPIO2用于按鍵輸入,GPIO4用于LED輸出。
初始化之后,我們在loop()中不斷的讀取按鍵的電平狀態,并賦值給LED,實現按鍵下去燈熄滅,松開燈點亮的效果。
#define LED_GPIO 4
#define BTN_GPIO 2
int BTN_State = 0; //按鍵狀態
void setup()
{
pinMode(LED_GPIO, OUTPUT);
pinMode(BTN_GPIO, INPUT);
}
void loop()
{
// 讀取按鍵狀態
BTN_State = digitalRead(BTN_GPIO);
// 把按鍵狀態做為LED燈的輸出
digitalWrite(LED_GPIO, BTN_State);
}
我們按照前面的教程編譯程序,刷入開發板,看下效果:
接下來我們用中斷的方式實現一下:
attachInterrupt(uint8_t pin, void ()(void), int mode)函數用來配置中斷功能:
- 參數一,GPIO引腳號
- 參數二,中斷回調函數
- 參數三,中斷觸發模式(RISING、FALLING、CHANGE等)
參數三這個可以設置各種模式,例如上升沿觸發,下降沿出發,任意沿觸發,電平信號等等模式。
我們用上面的例子改一下:
#define LED_GPIO 4
#define BTN_GPIO 2
int BTN_State = 0; //按鍵狀態
//中斷回調函數
void bt_callBack(void)
{
BTN_State = digitalRead(BTN_GPIO); // 讀取按鍵狀態
digitalWrite(LED_GPIO, BTN_State); // 把按鍵狀態做為LED燈的輸出
}
void setup()
{
pinMode(LED_GPIO, OUTPUT); //LED輸出模式
pinMode(BTN_GPIO, INPUT); //輸入上拉模式
attachInterrupt(BTN_GPIO, bt_callBack, CHANGE); //使能中斷
}
void loop()
{
}
主程序中不用做任何事情了,中斷檢測到有按鍵按下或松開(任意跳變沿),就會觸發執行中斷回調函數,然后把結果在LED上輸出。
ESP32的GPIO外設相對其它單片機,功能還是略微復雜的,但是不管是SDK的開發還是Arduino方式,官方都幫我們寫好相應的庫了,復雜的配置都已經定義好了,我們直接調用即可,怎么樣,是不是非常簡單?
-
以太網
+關注
關注
40文章
5385瀏覽量
171162 -
寄存器
+關注
關注
31文章
5325瀏覽量
120052 -
復用器
+關注
關注
1文章
706瀏覽量
28292 -
GPIO
+關注
關注
16文章
1196瀏覽量
51934 -
ESP32
+關注
關注
18文章
960瀏覽量
17114
發布評論請先 登錄
相關推薦
評論