1. 程式人生 > >ESP8266 通過 UART 燒錄韌體的協議以及例程

ESP8266 通過 UART 燒錄韌體的協議以及例程

ESP8266韌體升級有兩種辦法:
  1. 通過UART介面燒錄
  2. ESP8266通過 WIFI 獲取韌體自己給自己升級
本文講的是第一種方法。
硬體平臺:STM32F103VCT6(主機) + ESP-12S(安信可的一款ESP8266模組)
Stm32從SD卡中讀取韌體給ESP8266升級。

大體流程如下

一、 進入下載模式
  首先 ESP8266 通過 UART 燒錄程式跟 STM32 通過 UART 燒錄程式的流程大致是一樣的,首先就是進入下載模式
 
 
先介紹一下圖中管腳的作用:
    CH_PD(EN) : 使能管腳,高電平使能,低電平失能
    RST: 復位管腳,高電平正常工作,低電平復位


     ESP-12S 模組已經將 EN、RST、GPIO0接了上拉電阻,如上圖所示 ESP8266 的GPIO0作用就相當於 STM32的 BOOT0,將GPIO0引腳電平拉低,然後復位一下,就進入了 UART 下載模式。


二、 燒錄韌體
 ESP8266 UART下載協議:https://github.com/espressif/esptool/wiki/Serial-Protocol
傳送的資料包是按照  SLIP packet framing 的格式來發送的。
這裡的SLIP協議很簡單,就是傳送的資料幀,資料的第一個和最後一個字元必須是0xC0, 如果傳送的資料中含有 0xC0,則將0xC0替換為 0xDB 0xDC兩個字元傳送,如果傳送的資料中含有 0xDB, 則將 0xDB 替換為 0xDB 0xDD兩個字元傳送。

 1.先要傳送同步訊號幀,下載協議中 SYNC 的命令程式碼是 0x08
  


由圖 “傳送資料的格式”可知,傳送資料的第 0 位元組總是 0x00,第1 位元組是命令程式碼,  第 2-3 位元組是資料長度,第 4-7 位元組是校驗和(只有在傳送資料的命令中有效,傳送命令時可以全寫 0x00),第 8- n 就是要傳送的資料。
同步訊號幀的命令程式碼為 0x08,資料長度為 36 bytes所以同步訊號幀的資料流應該是
0x00,  0x08,  0x24,0x00, 0x00,0x00,0x00,0x00, 0x07,0x07,0x12,0x20,0x55,0x55…(總共32個0x55)
當然,實際傳送的資料還需要在 資料頭和尾加上斷幀符0xC0,所以完整的資料流是
0xC0,   0x00, 0x08,  0x24,0x00, 0x00,0x00,0x00,0x00, 0x07,0x07,0x12,0x20,0x55,0x55…,   0xC0
好了,到這一步我們就已經得到完整的一幀同步訊號幀了,把這些資料直接通過 UART傳送出去就好了,傳送出去後如果得到了正確的應答才可以進行下一步。

 
        由圖  “應答資料的格式” 可知,應答資料的第0 位元組總是 0x01,第 1 位元組是響應的命令程式碼,第2-3位元組是 資料長度,當命令為讀暫存器命令 READ_REG時,第4-7位元組是 暫存器的值,其他命令是 第4-7位元組總是 0x00, 第8-9位元組是應答的狀態,  都為0x00時,表示命令執行成功。
所以同步訊號幀的應答資料流應該是
0xC0,   0x01, 0x08,  0x24,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,   0xC0
當收到此應答的時候證明 ESP8266同步成功,可以進行下一步操作了。
之後的所有資料流都是按照這個步驟得出的。


2.  往 MEM 中寫入”stub loader” ,  stub_loader是什麼? 我在網上並沒有找到相應的解釋
  以下為我個人理解, 如果不妥之處,歡迎指正。
    樂鑫官方會對esp系列晶片的bootloader進行更新,新增一些命令,然而老款的esp晶片無法識別新增的命令,所以 stub_loader 就應運而生。 stub_loader就相當於一個 二級 bootloader  每當esp有新增的命令時,stub_loader就會進行相應的更新。   使用最古老的命令,將  最新的stub_loader寫入到esp晶片中,然後執行此loader。stub_loader就能夠識別最新的命令, 以此來保證esp晶片能夠執行最新的命令
 
接下來就是往MEM裡面寫stub loader了,0x05是開始寫MEM命令, 0x07 是要寫入MEM的資料, 0x06 是寫入結束命令,具體的資料流參考文件,根據 第1步即可推出。  PS: 在網上也並沒有找到 stub loader 的韌體…   所以0x07 所寫入的資料,是我通過樂鑫官方的燒錄韌體上位機發送的資料裡面複製出來的。

3.  直到這一步才進入正題,接下來我們就要燒錄韌體啦
 
跟第 2 步的燒錄stub loader 的步驟差不多,只不過命令程式碼變了而已,0x02是開始寫Flash命令, 0x04 是要寫入Flash的資料(也就是韌體), 0x03 是寫入結束命令

寫入完成後還要進行一下 MD5 校驗
 
校驗應答正常後,說明寫入成功啦! 

結束語: 

        1. 百度網盤:https://pan.baidu.com/s/14TKiDHFpSYMn5tVZIP7JTQ   提取碼:53k4 , 這是主機為 STM32F103VCT6 的示例工程,通過 USART2 給 ESP8266 燒錄,參考著整個工程也許會比較好理解一點

 最後:

        吐下槽,樂鑫的資料有點亂,我從官網下載的 uart燒錄協議.pdf 極其的不完整,我用串列埠助手 抓取上位機給 ESP8266 燒錄時傳送的資料以及應答資料,有好多命令程式碼在.pdf中都找不到,通過郵箱聯絡樂鑫的技術支援,丟給了我一個連結,https://github.com/espressif/esptool/wiki/Serial-Protocol  咯,就是這個,在這上面才算是隱隱約約知道咋回事兒。 我覺得這上面的內容也不完善,  因為我看過之後還是一臉懵幣,最後是把抓取的資料和這個連結對照著看半天,才算是知道大概的流程T_T