ESP32 芯片是由樂鑫開發的芯片。下圖是基於 ESP32 芯片的開發板:
圖 1:ESP32 DevKitC V4 開發板
ESP32 的多種應用開發方式
至少有四種方式可以選擇:
- 樂鑫官方的 ESP-IDF[1]
- 樂鑫官方的 Arduino 開發工具包[2]
- MicroPython[3]
- TinyGo[4]
TinyGo 目前(2021-03-14)還未支持 ESP32 的 WiFi 和藍牙
為了方便開發,通常選擇 Arduino 開發工具包和 MicroPython。下文選擇介紹前者。
Arduino core for the ESP32
官方提供 Arduino 開發工具包是為了使用 Arduino IDE 和 Arduino 的生態,並不是要求一定要再買一塊 Arduino 板來連接。
其工具包在 GitHub 上:
要使用這個工具包進行開發,需要做好兩個准備:
- 下載和安裝 Arduino IDE
- 把 ESP32 開發工具包導入到 Arduino IDE
第一步簡單,到官方網站下載即可。以下簡要說明第二步。
安裝和配置 Arduino IDE 的 ESP32 開發環境
導入方式有三種,根據情況選擇。資料比較全,這里簡單列舉出來,不再過多重復。
-
最簡單的配置和安裝方式是使用 Arduino IDE 的開發板管理器:
https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/boards_manager.md (Installation instructions using Arduino IDE Boards Manager)
前提是能訪問 raw.githubusercontent.com 這個域名(被牆了)。
-
如果沒法訪問,那就自己用 Git 去 Clone GitHub 倉庫:
https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/windows.md (Steps to install Arduino ESP32 support on Windows)
不過這種方式比較慢,因為要 Clone 整個倉庫,比較大。
-
下載倉庫的壓縮文件:
https://www.cnblogs.com/codeit/p/14323836.html (Arduino配置ESP32開發環境)
不過由於不能執行 Git 方式的自動 Clone,需要自行下載 Git 子模塊。即文章里已經有提到的 ESP32_AzureIoT_Arduino。這個是開發包的官方依賴,不用擔心存在什么大問題,使用其他方式也得這樣安裝。
如果 GitHub 下載慢,試試 GitLab:
- https://gitlab.com/schaepher/arduino-esp32 (Arduino Esp32)
- https://gitlab.com/schaepher/ESP32_AzureIoT_Arduino (ESP32 AzureIoT Arduino)
選擇哪塊板
在 Arduino IDE 的 [ 工具 | 開發板 | ESP32 Arduino ]
菜單里面能夠看到有多個選項,不同的選項對應着不同的配置。為了不影響后續開發,需要選擇合適的板。
如果上面有和手頭上相同名稱的板,那么直接選擇就可以了。如果沒有相同名稱或者不太確定,那么就需要根據一些內容來判斷。
從已有信息中找到目標。
菜單的第一個選項是 ESP32 Dev Module。根據這個名稱到工具包代碼里搜索,找到 boards.txt 這個文件。里面就是各種板的配置。
大致對比了一下不同板的配置,基本都一樣。部分區別列舉如下:
- build.variant 選項
這個是跟引腳相關的配置。主要關注這個配置。 - build.flash_freq 選項
這個是 Flash 存儲器的頻率。默認的值有的是 40m 有的是 80m。 - menu.PSRAM.* 選項
有些板帶了 PSRAM,就會多出這部分配置
其他選項在目前階段看起來不太重要,因此這里主要關注 variant (變體)選項,確保選擇的板的引腳對應正確。
以 build.variant=esp32
為例。在 variants 文件夾里面找到 esp32 文件夾,打開里面的 pins_arduino.h
。再結合倉庫里的 README.md 底下的 PINMAP,就能知道 pins_arduino.h
里面配置的含義了。
圖 2:引腳配置文件里的數字與開發板引腳的對應關系
從上圖看出,數字不是亂選的。這些數字分別對應了通用輸入/輸出引腳(GPIO,General Purpose Input Output),其中有一部分引腳只能作為通用輸入(GPI)。
不同的開發板可能會在設計的時候就占用了不同的 GPIO 引腳,因此需要在開發板剩余的 GPIO 中選擇合適的引腳配置到 pins_arduino.h
里面。
在配置的時候,需要參考開發板的引腳文檔。如果缺少文檔,可以直接看板上的引腳數字。這些引腳表示對應數字的 GPIO 引腳。具體的 GPIO 引腳都可以用作哪些功能,可以參考芯片的數據手冊[5]。
在選擇開發板選項的時候,着重注意一下引腳文件的配置就行了。不要選擇那種配置了已被開發板元器件占用的引腳。
引腳配置文件里面還有開頭的幾個宏定義,這些是固定的。例如:
#define NUM_DIGITAL_PINS 40
表示芯片共有 40 個數字管腳。ESP 32 共有 49 個管腳,其中 9 個引腳的類型為 P,即 Power。剩下的要么是通用 I/O ,要么是獨用的 I 或者 O。
SPI 通信
變體引腳配置文件里面跟 SPI 相關的引腳使用的是:
- SS = GPIO5
- MOSI = GPIO23
- MISO = GPIO19
- SCK = GPIO18
查詢芯片的數據手冊可以看到這些引腳的功能。
圖 3:ESP32 數據手冊里的管腳描述[5]
一個引腳有多個功能,但在使用的時候只選擇一種。
ESP32 共有 3 組 SPI(SPI、HSPI、VSPI),這里是用到其中的 VSPI,沒啥特別。
拿個例子過一遍開發和上傳的流程
在官方的 Arduino 開發工具包里面找到 libraries/ESP32/examples
,里面有例子。
在將開發板連接到電腦之后,挑選一個例子的代碼復制到 Arduino IDE 的編輯器里面,編譯並上傳。
例如選擇 examples/ChipID/GetChipID/GetChipID.ino
文件里的代碼:
uint32_t chipId = 0;
void setup() {
Serial.begin(115200);
}
void loop() {
for(int i=0; i<17; i=i+8) {
chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
}
Serial.printf("ESP32 Chip model = %s Rev %d\n", ESP.getChipModel(), ESP.getChipRevision());
Serial.printf("This chip has %d cores\n", ESP.getChipCores());
Serial.print("Chip ID: "); Serial.println(chipId);
delay(3000);
}
然后編譯,這個選項在 [ 項目 | 驗證/編譯 ]
,或者用快捷鍵 Ctrl+R
。
編譯通過后上傳,這個選項在 [ 項目 | 上傳 ]
,或者用快捷鍵 Ctrl+U
。
以下是上傳的日志:
esptool.py v3.0-dev
Serial port COM7
Connecting.....
Chip is ESP32-D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: xx:xx:xx:xx:xx:xx
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 16383.2 kbit/s)...
Hash of data verified.
Compressed 18656 bytes to 12053...
Writing at 0x00001000... (100 %)
Wrote 18656 bytes (12053 compressed) at 0x00001000 in 0.2 seconds (effective 938.7 kbit/s)...
Hash of data verified.
Compressed 207008 bytes to 108334...
Writing at 0x00010000... (14 %)
Writing at 0x00014000... (28 %)
Writing at 0x00018000... (42 %)
Writing at 0x0001c000... (57 %)
Writing at 0x00020000... (71 %)
Writing at 0x00024000... (85 %)
Writing at 0x00028000... (100 %)
Wrote 207008 bytes (108334 compressed) at 0x00010000 in 2.2 seconds (effective 767.1 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 128...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (128 compressed) at 0x00008000 in 0.0 seconds (effective 4915.3 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
這樣就上傳成功了。
接着驗證結果。在 [ 工具 | 串口監視器 ]
里面,把波特率設置為 115200,就可以看到輸出。例如:
ESP32 Chip model = ESP32-D0WDQ6 Rev 1
This chip has 2 cores
Chip ID: 5940616
接下來就可以發揮創造力了~
參考
[1]: https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/ (ESP-IDF 編程指南)
[2]: https://github.com/espressif/arduino-esp32 (Arduino core for the ESP32)
[3]: http://docs.micropython.org/en/latest/esp32/quickref.html (Quick reference for the ESP32)
[4]: https://tinygo.org/microcontrollers/esp32-coreboard-v2/ (ESP32 - CORE BOARD)
[5]: https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_cn.pdf (ESP32系列芯片——技術規格書)