下載模式
ESP8266/ESP32進入下載模式的條件很簡單:
EN(也稱為RST)上升沿時候GPIO0保持為低電平,如圖所示

分析
下載電路如下所示,其結構與RS觸發器比較類似,注意EN和IO0信號均連接在三極管集電極,通過控制三極管只能拉低此信號,若三極管截止,則此信號的狀態由其他電路決定(一般來說,此類信號會默認接電阻上拉到VCC)

邏輯關系如下
DTR = 0; RTS = 0, 此時Q1截止,Q2截止,EN = 1; IO0 = 1
DTR = 0; RTS = 1,此時Q1截止,Q2導通, EN = 1; IO0 = 0
DTR = 1; RTS = 0, 此時Q1導通,Q2截止, EN = 0; IO0 = 1
DTR = 1; RTS = 1, 此時Q1截止,Q2截止, EN = 1; IO0 = 1
串列如下
| DTR | RTS | EN | IO0 |
|---|---|---|---|
| 0 | 0 | 1 | 1 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 |
簡單總結:當DTR和RTS同時為0或者同時為1時,三極管Q1和Q2均為截止狀態,此時EN和IO0的狀態由其他電路決定(內部/外部上拉電阻),
當不同時為0或者1時:
EN = RTS
IO0 = DTR
注意這種邏輯下 EN和IO0是不可能同時為0的,然而進入下載模式則需要如下的序列
1. IO = 0; EN = 0
2. IO = 0; EN 0 -> 1
再來繼續分析一下esptool.py里下載相關的代碼
# issue reset-to-bootloader:
# RTS = either CH_PD/EN or nRESET (both active low = chip in reset
# DTR = GPIO0 (active low = boot to flasher)
#
# DTR & RTS are active low signals,
# ie True = pin @ 0V, False = pin @ VCC.
if mode != 'no_reset':
self._setDTR(False) # IO0=HIGH
1) self._setRTS(True) # EN=LOW, chip in reset
time.sleep(0.1)
2) self._setDTR(True) # IO0=LOW
3) self._setRTS(False) # EN=HIGH, chip out of reset
time.sleep(0.05)
4) self._setDTR(False) # IO0=HIGH, done
注意True是低電平,False為高電平,另外代碼中的setDTR()和setRTS()兩條陳述句之間雖然看上去緊挨著沒有延時,然而由于這里是高級語言python,兩條陳述句之間的延時并不能忽略,因此分析的時候必須依次的進行狀態分析,以下分為四個階段依次分析
-
- 設定DTR = 1; RTS = 0, 此時Q1導通,Q2截止, EN = 0; IO0 = 1
-
- 設定DTR = 0; RTS = 0, 此時Q1截止,Q2截止, EN = 1; IO0 = 1
-
- 設定DTR = 0; RTS = 1, 此時Q1截止,Q2導通, EN = 1; IO0 = 0
-
- 設定DTR = 1; RTS = 1, 此時Q1截止,Q2截止, EN = 1; IO0 = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/385696.html
標籤:其他
