ESP8266 ESP8285 之使用細則
本文是我使用 ESP8266 一年有餘的使用認知整理。基於自己的經驗與記憶所述,不見得正確,若對於所述有存疑尚需再找多方資訊以佐證。
ESP8285 是 ESP8266 的改版,embedded 了 1MBytes flash,不過其關聯的 GPIOs 並沒有釋放出來,也就是已用掉了,也就是,flash 就只能是 1MB。不過 chip size 或說整合系統的呎吋得以縮小了,應用層面更廣。它與 8266 的使用差異,是只能使用 QOUT compatible 模式,而 8266 則 QOUT,QIO 二種模式皆可使用。除此之外別無區別。QOUT/QIO 是什麼?不知應無妨。
以下所述,若屬基本認知的不再提及。
GPIOs
GPIO | Function | State | Restrictions |
---|---|---|---|
0 | Boot mode select | normal mode – no restriction 0V – entering boot mode while POR | No Hi-Z |
1 | TX0 | – | Not usable during Serial transmission |
2 | Boot mode select TX1 | normal mode – no restriction 3.3V – entering boot mode or normal mode while POR | Don’t connect to ground at boot time Sends debug data at boot time |
3 | RX0 | – | Not usable during Serial transmission |
4 | SDA (I²C) | – | – |
5 | SCL (I²C) | – | – |
6 – 11 | Flash connection | x | Not usable, and not broken out |
12 | MISO (SPI) | – | – |
13 | MOSI (SPI) | – | – |
14 | SCK (SPI) | – | – |
15 | CS (SPI) | normal mode – might restriction(*1) 0V – entering boot mode or normal mode while POR | Pull-up resistor not usable *1: if this pin is used in normal mode, what connects should Hi-Z during POR or might POR fail |
16 | Wake up from sleep | – | No pull-up resistor, but pull-down instead Should be connected to RST to wake up |
ADC | – | 1.0Vmax | 10-bit blocking wait for sampling @ 16kHz Max |
RST | – | keep high | low active |
EN | – | keep high | high active |
Vcc | – | 2.7V – 3.6V | – |
Gnd | – | – | – |
- 說明
- GPIOs 0-15 都有可軟體設定的 internal pull-up。GPIO 16 有可設定 internal pull-down。GPIOs tolerance 3.3Vmax。
- POR 時,透過 GPIOs 0/2/15 的狀態,以選擇進入哪種模式,有三種模式 bootloader mode,簡稱 boot mode,和 normal mode,或說 flash mode,sketch mode,running mode,和 SD mode。前二種常用。第三種沒用過。
- boot mode GPIO(0, 2, 15)=(LOW, HIGH, LOW),POR 時
- normal mode GPIO(0, 2, 15)=(X, HIGH, LOW),POR 時
- 因此應用上,我們透過 GPIO 0 來切換 boot mode or normal mode,將呈,
- GPIO 2 pull-high,
- GPIO 15 pull-low,
- GPIO 0,可透過指撥開關或 jumper,切換。jumper 為佳。但 ESP8266 OTA 成熟,也唯有第一次燒錄需關注 GPIO 0,故盡量使用製具燒錄以減小 board size。製具,只需連接 GND/VCC/TX0/RX0/GPIO0(to GND)。注意,GPIO 0 pull-down 無效,需直接接地。
註:OTA:ota 使用 bin file。其在 arduino 編譯完成後的輸出訊息欄中可索引到。找一下例如
/home/ken/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/xtensa-lx106-elf-size -A /tmp/arduino_build_624590/sketch_jul31a.ino.elf
類似這樣的輸出行,該路徑 /tmp/arduino_build_624590/ 就是 bin file 的輸出與存放路徑,至該路徑取出 .bin file。 - 處於 boot mode 以後,TX0/RX0 用於 flash programming
- 處於 normal mode 以後,此三 pin 可複用。TX0/RX0 可複用
- 當用於馬達控制時,於 POR 時,所有 GPIOs,除了 GPIO 4,GPIO 5 以外,皆可能造成問題,因為其餘 pins,將同時有短暫的 high level,且 pull-low 無效。GPIO 4/5 則無此狀態。
- GPIO 16 可用於 sleep mode。但非必要。
- EN pin 可應用於單鍵開機關機,但於關機狀態下仍有不小的功耗有別於斷電。
- digitalWrite() 原則上需使用 HIGH/LOW,若使用變數或 0/1 已測得某些 pins(0, 16)會導致 wdt reset,原因未知。
- 存取 GPIOs 若使用變數來代表腳位,變數必須為 volatile。例如 pinMode,digitalRead/Write 等。
- 於此特別指出 esp8266 的 gpio 頻寬是 1M/即 high-low 變化的最小時間/請自行量測與換算時間,然而不同腳位有可能不一樣,但差異應都不大;甚者,在此假定一樣的前提下我們加測 probe ah->bh->al->bl->ah->bh;
- 當某支腳位 a 上升 “成” high 的同時,另一支腳位 b 是接著上升 “而成” high 需時 12M。因 low-high 變化固定,故此時間為 “指令上升時間”,”low-high 狀態變化時間” 則未定。
- 同理,”指令下降時間” 需時 8M。
- 故,或許可因此透過多腳位組合産生的時間差來增加頻寬;可用有限腳位數於有限的狀態變化延遲下由更細微的指令時間來彌補這種延遲。前題是能夠組合及所對接的是更高的頻寬。(這段話純嘴炮XD)
模組板 或 開發板
- 我們買來的通常就是模組板或開發板,其 GPIOs 可能就已被“處理過”。
- 因此,除了看該板子的 datasheet 外,
- 還有一個方式可確認 GPIO 狀態。
- 先說 TX0/RX0 可能已接到 USB2UR IC,故其 GPIO 狀態便屬未定狀態,於 pin 複用他用時,應留意 USB2UR 的影響或甚至於無法複用。
- 量測,這邊當然也只是指,GPIO 0/2/15,RST,EN,ADC 等,其與 GND 或 Vcc 間的阻值。10k/12k,就表示已被 pull-high/low,則不需再外撲了。
- 就模組板而言,最差的情況就是所有的 GPIO 都“未被開發”過。這時便需追加外部線路,GPIO2 pull-high,GPIO15 pull-low,EN pull-high,RST pull-high,ADC 3.3V-to-1V divided voltage。
- 就 AI 出的模組而言,通常 GPIO 2/15/EN/RST 已開發,ADC 則不一定。
Arduino IDE & esp8266.com BSP
- esp8266.com 這個社群 open source 了 esp8266/esp8285 bsp(board-level supporting package) 使得能在 arduino ide 下開發 esp
- 以下介紹在 arduino ide 下的編譯與燒錄與除錯等選項。
- 該指出的,bsp 2.7.4 版,我用了好長一段時間,蠻穩定的。
- 出了 3.0.0 版,建議不要用因為原本的使用 2.7.4 版的板子,用上 3.0.0 跑起來變得很慢。
- 過了約一個月後出了 3.0.1 版,速度回昇,但仍覺得比 2.7.4 版稍慢。
- 過了幾天,出了 3.0.2 版,速度上與 3.0.1 版無異。
- 目前建議仍用 2.7.4 版。
- 不過,3.0.2 版新增了更多客製化選項,有其不可不用的情況,例如自訂 IRAM size。
- 使用開發板,例如 D1 mini,我們可從“開發板管理員”中選擇此板子,則編譯與燒錄除錯選項(以下簡稱“板設選項”)便自動設定,便可順利編譯與執行。
- 但我建議,不管哪一張板子,一律使用 Generic ESP8266/8285 Module 此選項,則所有板設選項便可自訂。我們只要熟悉各選項,便能來者不拒了。
- 以下便是說明板設選項,並以 3.0.2 板來說明,因其選項更多,沒提及的是我沒用過或不知道,就不再強調。
- BuiltinLed:通常是 2,可能是因 2 不得不 pull-high,就順便連接 led
- UploadSpeed:單看 USB2UR IC 的支援及 ESP crystal。我設 115200,921600 皆可行。
- CPUfrequency:設 160MHz,但功耗會增加。
就算於 80MHz,WiFi stack 有些時機將短暫設成 160。
手動切換:
system_update_cpu_freq(SYS_CPU_80MHZ);
system_update_cpu_freq(SYS_CPU_160MHZ); - CrystalFrequency:26MHz,沒看過板上使用 40MHz 的。其影響 TX/RX baud-rate。
- Flash Size:若有 filesystem 需求則變更其配置比例。但若 filesystem 配置得太大將可能導致無法 OTA。因 OTA 需有一塊空間存放上傳的 bin file,其於 reboot 時被換用。
- Flash Mode:DOUT。只選這個就是了。
- FlashFrequency:預設 40。不過我都改成 80,沒遇過問題。
- lwIP Variant:與 ram-size 的耗用,code-size,cpu-utilize,internet throughput 等有關
- VTables:可能是中斷向量表,當然置於 ram 速度會更快。heap 區 也是 ram,僅是屬性與對象不同。唯一考量就是空間夠用即可。不過 heap 區會變動,iram 不會,故 iram 較安全。
- Stack Protection:後來的版本才有此選項,增加了 stackoverflow 保護。但犧牲了速度。既然會 stackoverflow,那就是程式沒寫好,不保護為佳。debug 目的較可能。
- Erase Flash:看它的設定以判斷,至少有分出三個區塊,其第三個區塊或許是如 WiFi 的功率設定之類的。其中 WiFi settings,我已知至少包含 SSID/PW credentials;也就是只要呼叫過相關函式,提供的 credential 就會被儲存於非 sketch flash zone。故例如後續有某 SSID 已使用過但不想再使用,便需完整 flash,不然仍有可能再用上。該注意的是,OTA,也只有更新 sketch zone。
- MMU:RAM 的分割配置,有 IRAM,CACHE,HEAP。官方數據指出在使用 wifi code 的前提下,SRAM 的最高可用空間(heap + user data)為 50KB。
cache 用於 flash-code 的預設快取。BSP(or SDK/bootloader or by compiler) 預設行為將正在執行的 flash code 快取到 ram 以加快執行速度。
IRAM 用於程式碼的硬快取。即使用者明白指出某函式/某靜態變數於 booting 時複製至 ram,之後,該函式或變數將有更快的執行速度。isr functions 必要使用 iram。IRAM 很好用但忌濫用。IRAM 是 4-alignment,非 4-aligned 存取將會 wdt-reset。
HEAP 就是動態記憶體配置區。
個人偏好 16k cache + 48k iram。因如此我可濫用 iram,讓程式飛快。iram 若用超過會編譯不過以此來判別。
官方文件後來有更新,可參考之。 - 結論:
因 ESP 的一大優點就是有相當大的 ram,這在其他 micro-controllers 是不多見的。
160MHz + comparable RAM size + WiFi + 1MB embedded flash(8285),會異軍崛起不是沒有原因的。想想看 microchip 走了那麼多年,也沒像 esp 那麼風光過。atmel 多少也因 arduino 而廣為使用。8051s,熟紫了且從未沒落過,但因製它者規格上保守了數十年。。。終將被淹沒。MSP430/C2000 則曲高和寡,能善用的人不多,不然相當黑科技。
esp 缺點:
power-reduced mode,是有點跛腳。
功耗,是除了 MSP430 外,各家的夢魘。
有 1us GPIO latency,這真的是天大的缺點!
有 4us ISR latency,難以致信,且是該敗的缺點!
不然就完美了!
發佈留言