博客專欄

        EEPW首頁 > 博客 > 老宇哥帶你玩轉(zhuǎn)ESP32:03 GPIO數(shù)字輸入與數(shù)字輸出

        老宇哥帶你玩轉(zhuǎn)ESP32:03 GPIO數(shù)字輸入與數(shù)字輸出

        發(fā)布人:芯片之大家 時間:2023-07-06 來源:工程師 發(fā)布文章
        image.png


        今天我們來點燈

        多路復(fù)用器與GPIO矩陣

        ESP32芯片有34個物理 GPIO Pad,每個Pad可以當(dāng)作通用IO,也可以當(dāng)作外設(shè)的引腳,GPIO 引腳通過非常復(fù)雜的 GPIO 矩陣互連,這基本上就是是一個多路復(fù)用器,我們可以非常靈活的選擇哪些GPIO引腳在內(nèi)部路由到哪個外設(shè)的信號,大家可以看下圖:

        image.png


        IO_MUX 中每個 GPIO pad 有一組寄存器。每個 pad 可以配置成 GPIO 功能(連接 GPIO 交換矩陣)或者 直連功能。

        有一些高速信號如以太網(wǎng)、SDIO、SPI、JTAG、UART 等會旁路 GPIO 交換矩陣以實現(xiàn)更好的高頻數(shù)字特性。所以高速信號會直接通過 IO_MUX 輸入和輸出,這樣比使用 GPIO 交換矩陣的靈活度要低。

        不同于STM32的簡單復(fù)用,ESP32的多路復(fù)用器,使設(shè)計人員可以靈活地更改芯片內(nèi)部的 GPIO 引腳連接并將其路由到任何信號,這樣硬件設(shè)計上,布線也方便的多。

        image.png


        通過 IO_MUX、GPIO 交換矩陣的外設(shè)輸入

        image.png


        通過 GPIO 交換矩陣輸出信號

        ESP32還有18個 GPIO 管腳具有低功耗(低功耗 RTC)和模擬功能,這個我們后面設(shè)計到具體案例再細(xì)說。

        完整管腳說明需要去參考的樂鑫官方《ESP32 技術(shù)規(guī)格書》

        特別提醒

        ESP32的IO12上電時的電平會決定外部flash的工作電壓,上電時該腳為高則認(rèn)為flash工作于1.8V,為低則認(rèn)為flash工作于3.3V。常用的模塊該腳內(nèi)部已下拉,即flash是工作于3.3V的,若外部使用強(qiáng)上拉模塊就可能工作異常了。

        硬件連接
        image.png


        數(shù)字輸出功能

        這里我們就以一個LED燈來演示,首先,我們需要在setup()中初始化對應(yīng)的IO在輸出模式,使用pinMode函數(shù),第一個參數(shù)上對應(yīng)的IO序號,第二個是IO的模式

        pinMode(4, OUTPUT);

        然后可以通過digitalWrite()函數(shù)改變數(shù)字引腳的電平狀態(tài),HIGH輸出高平,LOW輸出低電平

        digitalWrite(4, HIGH); // 輸出高電平digitalWrite(4, LOW);  // 輸出低電平

        所有 ESP32 GPIO 引腳都可以在輸入或輸出模式下運行。引腳34-39只能用于輸入。還有其他一些引腳也有其它特性,這個我們現(xiàn)在也沒必要太糾結(jié),用到的時候再去看就好了。

        數(shù)字輸入功能

        在輸入模式下,我們可以通過IO來讀取外部數(shù)字信號,我們這里用按鍵來表示。

        跟輸出模式一樣,我們在setup()中初始化對應(yīng)的IO在輸入模式,也使用pinMode函數(shù)

        pinMode(2, INPUT);

        然后通過digitalRead(GPIO_pin)就可以讀取對應(yīng)IO的電平了。

        代碼示例

        下面的代碼我們定義了2個GPIO引腳。GPIO2用于按鍵輸入,GPIO4用于LED輸出。

        初始化之后,我們在loop()中不斷的讀取按鍵的電平狀態(tài),并賦值給LED,實現(xià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)做為LED燈的輸出
          digitalWrite(LED_GPIO, BTN_State);
        }

        我們按照前面的教程編譯程序,刷入開發(fā)板,看下效果:


        接下來我們用中斷的方式實現(xiàn)一下:

        attachInterrupt(uint8_t pin, void ()(void), int mode)函數(shù)用來配置中斷功能:

        • 參數(shù)一,GPIO引腳號

        • 參數(shù)二,中斷回調(diào)函數(shù)

        • 參數(shù)三,中斷觸發(fā)模式(RISING、FALLING、CHANGE等)

        參數(shù)三這個可以設(shè)置各種模式,例如上升沿觸發(fā),下降沿出發(fā),任意沿觸發(fā),電平信號等等模式。

        我們用上面的例子改一下:

        #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)做為LED燈的輸出} 
        void setup(){
          pinMode(LED_GPIO, OUTPUT); //LED輸出模式
          pinMode(BTN_GPIO, INPUT); //輸入上拉模式
          attachInterrupt(BTN_GPIO, bt_callBack, CHANGE); //使能中斷} 
        void loop(){  
        }

        主程序中不用做任何事情了,中斷檢測到有按鍵按下或松開(任意跳變沿),就會觸發(fā)執(zhí)行中斷回調(diào)函數(shù),然后把結(jié)果在LED上輸出。

        ESP32的GPIO外設(shè)相對其它單片機(jī),功能還是略微復(fù)雜的,但是不管是SDK的開發(fā)還是Arduino方式,官方都幫我們寫好相應(yīng)的庫了,復(fù)雜的配置都已經(jīng)定義好了,我們直接調(diào)用即可,怎么樣,是不是非常簡單?

        感興趣的同學(xué)也可以打開官方的庫,看看是怎么配置寄存器的,會有一個更深的理解。

        感謝大家,關(guān)于ESP32的學(xué)習(xí),希望大家Enjoy!


        *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



        關(guān)鍵詞: 芯片

        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 江山市| 盐亭县| 桑植县| 高青县| 儋州市| 响水县| 曲靖市| 朝阳市| 彭山县| 基隆市| 陇南市| 泸水县| 淳化县| 石屏县| 石台县| 昌宁县| 新田县| 南丰县| 苍南县| 曲阜市| 抚顺县| 乾安县| 图们市| 和田县| 虞城县| 大庆市| 宝鸡市| 巴林右旗| 潼关县| 全椒县| 曲水县| 宁城县| 平江县| 武威市| 济南市| 广丰县| 旌德县| 青州市| 田阳县| 嘉鱼县| 崇礼县|