01
背景 前一段時間需要自己制作一片ESP32單板,成本和封裝考慮,計劃選擇CH340E作為USB轉(zhuǎn)串口芯片,ESP8266/ESP32的單板一般都有自動下載電路,用戶無需按鈕即可令單板自動進入下載模式實現(xiàn)固件燒錄。 然而自動下載電路需要串口芯片支持DTR和RTS,CH340E卻只有RTS信號,沒有DTR信號,于是研究學習了一下自動下載電路的原理,準備用一些奇淫技巧解決CH340E的自動下載問題。 遺憾的是, 目前的中文互聯(lián)網(wǎng)上,關(guān)于ESP8266/ESP32自動下載原理,所有能搜索到的解釋大部分都是錯誤的,差之毫厘,謬以千里。 如果隨意的假設(shè),自以為是,最終得出的只能是一廂情愿的結(jié)論。
02
下載模式
ESP8266/ESP32進入下載模式[1]的條件很簡單: EN(也稱為RST)上升沿時候GPIO0保持為低電平,如下圖所示:
03
分析1 下載電路如下所示,其結(jié)構(gòu)與RS觸發(fā)器比較類似,注意EN和IO0信號均連接在三極管集電極,通過控制三極管只能拉低此信號。 若三極管截止,則此信號的狀態(tài)由其他電路決定(一般來說,此類信號會默認接電阻上拉到VCC) 邏輯關(guān)系如下:
DTR=0;RTS=0,此時Q1截止,Q2截止,EN=1;IO0=1 DTR=0;RTS=1,此時Q1截止,Q2導(dǎo)通,EN=1;IO0=0 DTR=1;RTS=0,此時Q1導(dǎo)通,Q2截止,EN=0;IO0=1 DTR=1;RTS=1,此時Q1截止,Q2截止,EN=1;IO0=1 真值表: DTR RST EN IO0
0 | 0 | 1 | 1 |
0 | 1 | 1 | 0 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 |
簡單總結(jié):當DTR和RTS同時為0或者同時為1時,三極管Q1和Q2均為截止狀態(tài),此時EN和IO0的狀態(tài)由其他電路決定(內(nèi)部/外部上拉電阻)。 當不同時為0或者1時:
EN=RTS IO0=DTR 注意這種邏輯下 EN和IO0是不可能同時為0的,然而進入下載模式則需要如下的序列:
1.IO=0;EN=0 2.IO=0;EN0->1 從邏輯表上看是根本無法正常進入下載模式的,此為疑惑1
04
分析2 再來繼續(xù)分析一下esptool.py[2]里下載相關(guān)的代碼
#issuereset-to-bootloader: #RTS=eitherCH_PD/ENornRESET(bothactivelow=chipinreset #DTR=GPIO0(activelow=boottoflasher) # #DTR&RTSareactivelowsignals, #ieTrue=pin@0V,False=pin@VCC. ifmode!='no_reset': self._setDTR(False)#IO0=HIGH 1)self._setRTS(True)#EN=LOW,chipinreset time.sleep(0.1) 2)self._setDTR(True)#IO0=LOW 3)self._setRTS(False)#EN=HIGH,chipoutofreset time.sleep(0.05) 4)self._setDTR(False)#IO0=HIGH,done 注意True是低電平,F(xiàn)alse為高電平,另外代碼中的setDTR()和setRTS()兩條語句之間雖然看上去緊挨著沒有延時,然而由于這里是高級語言python,兩條語句之間的延時并不能忽略。 因此分析的時候必須依次的進行狀態(tài)分析,以下分為四個階段依次分析:
設(shè)置DTR = 1; RTS = 0, 此時Q1導(dǎo)通,Q2截止, EN = 0; IO0 = 1
設(shè)置DTR = 0; RTS = 0, 此時Q1截止,Q2截止, EN = 1; IO0 = 1
設(shè)置DTR = 0; RTS = 1, 此時Q1截止,Q2導(dǎo)通, EN = 1; IO0 = 0
設(shè)置DTR = 1; RTS = 1, 此時Q1截止,Q2截止, EN = 1; IO0 = 1
如果按照上面的代碼分析來做結(jié)論,不論如何系統(tǒng)也是不可能進入下載模式的: EN和IO0首先不可能同時為0,EN由0->1的上升沿IO0也并不為0,再次確認之前的疑惑,那么系統(tǒng)究竟是如何進入下載模式的呢?
05
答案 問題的答案實際在另外一部分電路,原理其實非常簡單:EN信號連接在一個電容充放電電路上 CHIP_PU即EN,代碼中2-3階段之后會延時一段時間,而EN由于電容充電,電平并不會立馬變?yōu)楦唠娖?,而是緩慢上升,以如上參?shù)為例計算,同時參考芯片電氣參數(shù)特性 高電平為0.75VDD,則達到高電平按照如下公式計算: 解得t = 14ms,即EN經(jīng)過14ms上升到電平1,在實際代碼中延時了50ms的等待時間,以確保延時后EN處于電平1的狀態(tài)。 另外需要提的是,階段1需要等待一段時間,讓電容放電,保證EN電平下降到電平0,才能保證系統(tǒng)正常復(fù)位,在代碼中預(yù)留了100ms的等待時間,同樣可以通過電容放電公式計算出放電到電平0需要的時間,感興趣的朋友可以自行根據(jù)公式計算確認。
-
三極管
+關(guān)注
文章
3611瀏覽量
121865 -
串口芯片
+關(guān)注
關(guān)注
0文章
36瀏覽量
10515 -
ESP32
+關(guān)注
關(guān)注
18文章
971瀏覽量
17201
原文標題:經(jīng)典深度分析!ESP8266/ESP32自動下載電路究竟是如何巧妙實現(xiàn)的
文章出處:【微信號:All_best_xiaolong,微信公眾號:大魚機器人】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論