軟體是我的本行,但等到要寫這篇文章的時候,發現怎麼設定竟然忘的差不多了。看程式碼容易,要把這些繁雜的流程不靠紙筆記下來,真的很難。就趁這幾篇文章,把這些都寫下來吧。
開發環境
開發環境是以 Ubuntu 14.04 32bit 來開發,toolchain 也是32bit 的版本。若要使用其它不同的 Linux Distribution, 選擇32bit的設定上會比較簡單。
Toolchain
ESP8266 使用的 Toolchain 可以從國外網友建立的 git 內下載,git 的命令如下 。Toolchain 的名稱是 xtensa-lx106-elf,將來如果 link 不見了,可以靠這個找找看。
1 2 3 |
mkdir esp8266_toolchain cd esp8266_toolchain git clone https://github.com/Yveaux/esp8266-Arduino.git |
下載完畢後,toolchain 的位置是在 esp8266-Arduino/esp8266com/esp8266/tools/linux/xtensa-lx106-elf/。將它移到 /opt 下,以符合本文裡環境變數的設定。
SDK
目前的 SDK 已經發展到 3.0 了,當時用的是 SDK 1.4.0,目前舊的 link 還有保留,新舊的版本都是放在 ESP8266 Github 上,下載下來解壓縮即可。由於檔案不大,文末也附上之前用的這個 SDK 1.4。解壓縮後,把檔案放到 ~/ESP8266_RTOS_SDK-1.4.0。
環境變數
在編譯的過程中,會用到幾個重要的環境變數,把它寫在 ~/.bashrc 裡面方便直接使用。完成後,記得要重新登入,才會套用到這個設定值。
1 2 3 |
export PATH=/opt/xtensa-lx106-elf/bin:$PATH # 指定 Toolchain export SDK_PATH=~/ESP8266_RTOS_SDK_V1.4.0/ #指定 SDK位置 export BIN_PATH=~/ESP8266_BIN #指定編譯image的輸出位置 |
編譯範例程式
為了驗証環境設定有沒有對,可以先抓幾個 ESP8266 RTOS Sample Code 來試試。並非每個項目都可以編成功,可以多試幾個看看。這就當做環境測試,也算是一些參考範例檔。我們以 WiFi SoftAP 來測試的話,是可以成功的。
1 2 3 |
git clone https://github.com/espressif/esp8266-rtos-sample-code.git cd esp8266-rtos-sample-code/03Wifi/Soft_AP_DEMO/ make |
如果有錯誤,請檢查一下環境變數的路徑是否有設置正確。執行 xtensa-lx106-elf-gcc 是否可以成功,出現 No such file or directory 就是 toolchain PATH 沒設定正確。
編譯 WiFi995 原始檔
WiFi995 原始檔 (附於文末) 解壓縮後,其樹狀結構如圖。
- lowpwr.py: 官方提供的降低電流消耗的 python 檔,在 standard/lp.sh 裡會呼叫到。似忽是透過修改 Flash 的頻率,來降低功耗。
- postpone_wifi_init.sh: 自己加的攔截系統內 WiFi library 的 function。把 libmain.a 裡對 ieee80211_phy_init() 的呼叫,改成對 zf_ieee80211_phy_init() 呼叫。而 zf_ieee80211_phy_init() 是定義在我自己的程式裡,最後才呼叫 ieee80211_phy_init()。為什麼要這樣做有點忘了,看程式是要去修改 RTC 內的 memory,來判斷是剛開機,還是從 Sleep Mode 醒來。
- gen_misc.sh / gen_misc.bat: 初始化時,需要去設定 ESP8266 板子的 flash 大小或clock 。一般用預設的就可以了。
- lp.sh: 編譯完後,如果覺得需要再降低功耗,可以執行這個檔案,這也是去呼叫 lowpwr.py而已。
- Makefile: 預設的 Makefile ,一般不需要修改
- user_main.c: 所有的程式都寫在這,沒用很複雜的程式架構。
編譯
編譯方式也是相同,進入standard 目錄層後,執行 make 就可以了。編譯完的輸出檔案,會放在環境變數 BIN_PATH 內,也就是 ~/ESP8266_BIN。最後,產生了兩個檔案, eagle.flash.bin 與 eagle.irom0text.bin。若是執行 lp.sh,則會產生一個額外的檔案 eagle.flash_low_power.bin。燒錄的時候,選擇適當的檔案來寫入 ESP8266。
燒錄韌體
編譯後燒錄韌體是透過 原廠Flash Download Tools 這套軟體來進行,當時開發是用2.4版,現在已經出到 3.6.4 了。新版本整合了對 ESP8266 與新的 ESP32 的燒錄功能,為求展示方便,我們就用舊的來燒就好了。文末也會附上該工具,或上網搜尋。
燒錄韌體前,記得要把 switch 切到更新模式 (GPIO0 接地, GPIO1 接 3.3v),從新上電後才會進入燒錄模式。切換方式請看文末的全功能板說明。
啟動 Flash Download Tool
程式啟動後,會出現兩個視窗。一個是命令列的資訊視窗,一個是圖形的操作視窗。操作視窗大部份是沒有提供錯誤訊息的,所以如果覺得行為不如預期,就看要一下資訊視窗,通常都可以看到錯誤的內容。
操作視窗有幾個比較重要的欄位,會需要修改到。
Download Path Config
這個地方主要是填寫,要將哪個檔案,寫到 flash 內的什麼位置,這邊有用到的是:
- 位置 0x7C000, ESP8266 設定參數:預設檔名是 esp_init_data_setting.bin 。這個檔案由 Tab RF InitConfig 所產生/修改。
- 位置 0x00000, ESP8266 系統程式區:Flash 內的程式區塊被分為系統/和使用者,因為系統的部份通常都不用修改。分成兩塊的話,就可以只更新使用者的部份。預設檔名是 eagle.flash.bin,這是編譯完程式後,放置在 ESP8266_BIN 的檔案。
- 位置 0x20000, ESP8266 使用者程式區:放置使用者的程式。預設檔名是 eagle.irom0text.bin,這是編譯完程式後,放置在 ESP8266_BIN 的檔案。
- 位置 0x7E000, ESP8266 保留區。預設檔名是 blank.bin,從字面上可以看出是空白內容,可能是保留給運行時,給使用者使用的。
SPI FLASH CONFIG
這部份的參數與 gen_misc.sh 時設定的參數相同,就是在設定 SPI 速度、Flash 大小,一般不用修改。
Download Panel 1
這裡就是要更新韌體的一些操作,程式支援同時更新好幾塊板子,所以這邊會叫做 panel 1,其實旁邊還有 panel 2, panel 3…。
主要的設定就是 COMPORT 和 Baudrate 的設置,再按下 START 後就可以了。Baudrate 可以調整,要設成 9600 或 115200 都可以,我想也許它有內建的一些預設的機制,才可以讓你隨便換 baudrate,而不需要改動 ESP8266 的 baudrate。
開始更新
最後按下 “START” 就會開始更新了。之前常碰到的錯誤原因有三種
- COMPORT 設錯
- COMPORT 被佔用。開發過程中會需要在正常模式/更新模式中,頻繁的切換。正常模式時會使用 Teraterm 來看其 output,更新模式時,要將 Teramterm 斷線,把 COMPORT 使用權讓給 Flash download tool。如果忘了這動作,就會出現開啟連接埠失敗。
- 檔案路徑設錯、權限不足。Download PATH 設的檔案不存在,或不能寫(tool需要寫暫存檔),也會發生錯誤。
開機測試
一切燒錄完必後,就可以將模式從更新模式切換到一般模式,角色切換到搜尋,再上電。透過 WiFi995 內建的 PL2303SA,可以用 Baudrate 115200 來操作。由於開機在 BOOT Loader 時,使用的 baudrate 是77800,所以會先看到一些亂碼,後面的輸出也會被弄亂,這也是沒辦法的事…所以稍後再透過重設終端的的方法,就可以在115200之下正常操作了。最基本的命令,就是打 help 看看支援什麼功能,這邊就先不做詳細描述。
當下完 help 有看到支援的命令列表後,也算是完成了編譯/更新的動作。進一步的話,可以做些簡單的字串修改,看看是否真的有效。
全功能板說明
最後再列一下全功能版本的實體說明。這邊圖的設定狀態就是搜尋模式下的樣子
- (1) 正常/更新模式開關:撥到左邊是正常模式,右邊是更新模式
- (2) 角色模式切換:撥到左邊是信標模式,右邊是搜尋模式
- (3) 電源開關:撥到左邊是關,右邊是開
- (4) USB外接電源/更新埠/資料埠:電源、升級時傳輸、運作時命令都是靠這個USB
- (5) 3.5mm 警示音插孔:在搜尋模式下,若發現到信標,會發出警示音,就靠這個插孔把聲音接出來。
- (5) ESP8266 模組