toolchain安装教程支持_树莓派安装ESP8266_SDK开发环境
陳拓 chentuo@ms.xab.ac.cn 2020/02/19-2020/03/31
1. 概述
ESP8266的開發工具是在linux系統下運行的,樹莓派的官方操作系統是Linux系統。如果你手頭剛好有一塊樹莓派,就可以用它進行ESP8266的開發。下面我們在樹莓派3B+上安裝ESP8266的開發環境。所用的樹莓派安裝官方操作系統版本是:
2019-09-26-raspbian-buster-lite.img。樹莓派的存儲用16G的TF卡。
電腦通過Putty連接樹莓派,看看樹莓派操作系統系統版本:
有關putty的使用,見參考文檔《電腦連接樹莓派3B+》,看到第3節,網線訪問樹莓派3B+就可以了,不用WiFi連接,網線連接可靠性好。
1.1 ESP8266開發工具的分類
在官方文檔《ESP8266 SDK入門指南》中有關于開ESP8266發工具的分類。
https://www.espressif.com/sites/default/files/documentation/2a-esp8266-sdk_getting_started_guide_cn.pdf
樂鑫SDK官方開發工具下載網址:
https://www.espressif.com/en/support/download/sdks-demos
我們編譯的工具鏈esp-open-sdk默認情況下安裝ESP8266_NONOS_SDK-2.1.0,安裝完成后我們將安裝最新版本的ESP8266_NONOS_SDK-3.0.x。如果你有需要也可以再安裝ESP8266_RTOS_SDK。多個SDK可以同時存在。
1.2 官方關于ESP8266_NONOS_SDK的說明
https://github.com/espressif/ESP8266_NONOS_SDK
README.md
1.3 其他說明
- 為什么不安裝ESP-IDF
樂鑫最新的開發環境是ESP-IDF (Espressif IoT Development Framework)
見樂鑫的官方文檔:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/get-started/index.html
但是在樹莓派上安裝ESP-IDF,編譯時會出現錯誤:
Error: selected processor does not support 'mls r1,r4,r8,r11' in ARM mode
所選擇的處理器在ARM模式中不支持'mls r1,r4,r8,r11'
這是樹莓派操作系統本身的問題,可以看看下面鏈接的一篇文章:
http://silicone.homelinux.org/2017/03/05/raspberry-pi-3-as-desktop-computer/
- 下載安裝問題
由于網絡問題,工具鏈和相關依賴包的下載非常困難,常規安裝很難完成。因此我們將更換apt的源,并且將github上的一些倉庫克隆到gitee上,以加快下載速度。你也可以通過代理下載。
- 電腦配置要求
我用的電腦操作系統是32位版的win7,這應該是目前電腦的最低配置了。
2. 更新apt源
- 更新apt 源:sudo apt-get update
樹莓派的官網連接問題,常用的解決方法就是換源。
- 更換apt源
需要修改的地方有兩處:
/etc/apt/sources.list
/etc/apt/sources.list.d/raspi.list
查看系統版本:lsb_release -a
- 修改 /etc/apt/sources.list
下面我們要經常使用Linux的命令行文本編輯器nano,如果不熟悉先上網學學。
sudo nano /etc/apt/sources.list
在下面的語句前面加#注釋掉這行:
#deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
據說阿里源比較快,我們就用阿里源:
deb http://mirrors.aliyun.com/raspbian/raspbian/ buster main contrib non-free rpi
- 修改/etc/apt/sources.list.d/raspi.list
sudo nano /etc/apt/sources.list.d/raspi.list
在下面的語句前面加#注釋掉這行:
#deb http://archive.raspberrypi.org/debian/ buster main
在這里可以添加阿里的源:
deb http://mirrors.aliyun.com/archive.raspberrypi.org/debian/ buster main ui
但經過測試,阿里源同步的不及時,所以我這里用科大源
deb http://mirrors.ustc.edu.cn/archive.raspberrypi.org/debian/ buster main ui
- 更新apt 源
sudo apt-get update
完成。
3. 編譯工具鏈xtensa-lx106-elf
因為ESP8266功能太弱,不足以支持開發工作,所以需要在其他平臺上進行開發。現在我們就要在樹莓派上將ESP8266的程序代碼編譯鏈接成ESP8266可執行的文件,再將編譯好的文件燒寫到ESP8266上運行,這個過程就是交叉編譯,交叉編譯所需的軟件工具叫做工具鏈toolchain。
我們需要的工具鏈是一個lx106編譯器,可以為各種以lx106為內核的器件開發程序,也包括ESP8266。
因為樹莓派資源也有限,還有前面說過的樹莓派操作系統本身的問題,我們沒有采用樂鑫最新的編程架構ESP-IDF。而使用較老的ESP8266開發工具esp-open-sdk為樹莓派編譯一個工具鏈xtensa-lx106-elf。
安裝編譯工具鏈的說明見:https://gitee.com/chentuo2000/esp-open-sdk/README.md
3.1 安裝依賴項
- 安裝gcc g++庫
sudo apt-get install make unrar-free autoconf automake libtool gcc g++ gperf
flex bison texinfo gawk ncurses-dev libexpat-dev python-dev python python-serial
sed git unzip bash help2man wget bzip2
……
- 安裝libtool-bin
sudo apt-get install libtool-bin
3.2 克隆下載esp-open-sdk源碼
- 創建并進入下載安裝工具鏈目錄
用putty登錄樹莓派
mkdir -p ~/esp/
cd ~/esp/
- 在碼云gitee上克隆esp-open-sdk
可以用git clone命令直接從github上克隆esp-open-sdk:
git clone --recursive https://github.com/pfalcon/esp-open-sdk.git
由于網絡原因,下載速度很慢。
我們先在碼云gitee上克隆一個esp-open-sdk。
再從碼云上克隆esp-open-sdk到本地,這樣會快很多。
esp-open-sdk還有幾個子模塊也需要一并克隆到碼云上。
看看子模塊在哪里:
在esp-open-sdk倉庫頁面打開文件.gitmodules
其中有4個子模塊的下載地址,用這4個下載地址在gitee上克隆它們。
修改url:
這樣在在克隆esp-open-sdk的時候帶上參數—recursive,子模塊也就一并克隆了。
因為要用git克隆下載esp-open-sdk,所以先安裝git。
- 安裝git
sudo apt-get install git
測試git --version
關于Git的使用可以看《樹莓派使用Git》https://blog.csdn.net/chentuo2000/article/details/104834522
- 從碼云克隆esp-open-sdk
git clone --recursive https://gitee.com/chentuo2000/esp-open-sdk.git
查看ls –l
3.3 編譯esp-open-sdk
- 先在gitee上克隆ESP8266_NONOS_SDK
從https://github.com/espressif/ESP8266_NONOS_SDK克隆ESP8266_NONOS_SDK到gitee
- 編輯Makefile文件
cd esp-open-sdk/
cp Makefile Makefile.bak
nano Makefile
就是兩處http://github.com/espressif修改成http://gitee.com/chentuo2000。
- 編譯選項
README.md文件中有關于make命令的說明,我們用默認編譯命令make。
- 編譯
make
錯誤信息:error: could not find bash >= 3.1
- 修改configure.ac
要求bash的版本 >= 3.1,查看當前的bash版本bash --version
5.0.3 > 3.1,滿足條件。
解決方法(https://github.com/pfalcon/esp-open-sdk/issues/365):
修改/home/pi/esp/esp-open-sdk/crosstool-NG/configure.ac
nano /home/pi/esp/esp-open-sdk/crosstool-NG/configure.ac
找到行|$EGREP '^GNU bash, version (3.[1-9]|4)')
改成:|$EGREP '^GNU bash, version ([0-9.]+)')
保存,退出。
- 繼續編譯make
出現錯誤:
查看日志cat ./crosstool-NG/build.log
看日志中的這一句:
Not at this location: https://ftp.gnu.org/gnu/gmp/gmp-6.0.0a
- 手工下載gcc的依賴庫gmp-6.0.0a
先看看GMP的官網https://gmplib.org。
查看gmp的全部版本
https://gmplib.org/download/gmp/
在列表中找到gmp-6.0.0a.tar.xz
右擊gmp-6.0.0a.tar.xz復制鏈接地址,下載:
wget https://gmplib.org/download/gmp/gmp-6.0.0a.tar.xz
下載完成:
如果下載中斷,可以多試幾次,或者找它的鏡像網站,或者通過代理。
看看錯誤信息,找出下載的資源包放在什么目錄中。
Build failed in step 'Retrieving needed toolchain components' tarballs'
查找tarballs(源壓縮文檔)目錄的位置find . -name "tarballs"
所有下載的資源包都放在這里。
將gmp-6.0.0a.tar.xz復制到./crosstool-NG/.build/tarballs目錄中:
cp gmp-6.0.0a.tar.xz ./crosstool-NG/.build/tarballs
- 繼續編譯make
你會遇到11個要下載的資源包,仿照上面的方法都下載下來放在./crosstool-NG/.build/tarballs目錄中。
列表看看ls -l ./crosstool-NG/.build/tarballs
現在一切都準備好了,正式開始編譯,大約2個小時。
繼續make
完成編譯!
編譯成功后會在esp-open-sdk文件夾出現xtensa-lx106-elf、esptool和 ESP8266_NONOS_SDK三個文件夾,分別是編譯器、燒錄工具和ESP8266的非操作系統開發工具NONOS_SDK。
SDK的目錄名字ESP8266_NONOS_SDK-2.1.0-18-g61248df太長了,用起來很麻煩,所以你看到有一個軟鏈接sdk代替了那個很長的名字。
3.4 使用工具鏈
完成工具鏈構建后,帶有Xtensa HAL庫的工具鏈,也就是交叉編譯器位于
/home/pi/esp/esp-open-sdk/xtensa-lx106-elf
子目錄中。
將xtensa-lx106-elf/bin/子目錄添加到PATH 環境變量以運行xtensa-lx106-elf-gcc和其他工具。在構建過程結束時,crosstool-NG將根據你的環境給出正確的PATH設置命令。上圖中工具鏈構建結束時提示,我的環境變量這樣設置:
export PATH=/home/pi/esp/esp-open-sdk/xtensa-lx106-elf/bin:$PATH
這個命令每次開機都要重新設置,很麻煩,下面我們將環境變量寫到.bashrc中,這樣每次開機時環境變量就自動設置了。
- 設置環境變量
回到家目錄,就是我們登錄的目錄
cd ~
查看當前環境變量echo $PATH
看看有沒有文件.bashrc
編輯這個文件nano .bashrc
將
export PATH=/home/pi/esp/esp-open-sdk/xtensa-lx106-elf/bin:$PATH
添加到最后一行。
重新啟動樹莓派sudo reboot,重新登錄樹莓派,再查看環境變量echo $PATH
工具鏈的路徑已經在里面了。
- 運行xtensa-lx106-elf-gcc -v來驗證安裝
OK!
3.5 升級SDK
上面的安裝過程中安裝的SDK版本是ESP8266_NONOS_SDK-2.1.0-18-g61248df,
現在我們安裝最新的ESP8266_NONOS_SDK。
- 克隆ESP8266_NONOS_SDK
cd ~/esp
git clone https://gitee.com/chentuo2000/ESP8266_NONOS_SDK.git
- 看安裝位置:
- 安裝tree命令,查看目錄樹(可以在任何目錄位置安裝)
4. 樹莓派串口連接ESP8266
我們用ESP8266-01模塊為例與樹莓派串口進行連接。
4.1 樹莓派串口硬件設置
樹莓派的串口需要設置才能使用。
看看默認情況下設備文件和串口的映射關系:ls -l /dev
我們需要的映射關系是這樣的:
有關串口的設置請看文章《樹莓派串口的使用》https://blog.csdn.net/chentuo2000/article/details/104711494
設置好的串口對應的引腳是Pin8(TXD, GPIO14)和Pin10(RXD, GPIO15)。
4.2 串口工具軟件Minicom的安裝和使用
樂鑫官方文檔建議使用Minicom作為串口調試工具。
- 安裝串口工具Minicom
sudo apt-get install minicom
查看版本:
- 執行以下命令在minicom中對串口進行配置
sudo minicom -s
在彈出的菜單中選擇“Serial port setup”,將默認設置
改成:
回車:
保存Save setup as df1,退出Exit from Minicom。
常用命令:
Ctrl+A W:當顯示的內容超過一行之后自動換行
Ctrl+A X:退出minicom
4.3 ESP8266-01參數
4.4 樹莓派3B+和ESP8266-01的引腳圖
4.5 ESP8266-01的引腳說明
4.6 樹莓派3B+和ESP8266-1的連接
- 正常運行程序時的連接
用杜邦線按照表中的對應關系連接樹莓派和ESP8266-01。
如果使用的是ESP8266-01S模塊CH-PD可以不接。
兩者的外觀區別是:ESP8266-01S天線區域右下角只有一個指示燈,ESP8266-01天線區域右下角有兩個指示燈。另外ESP8266-01上有個LED在工作時一直亮著,這對于要求低功耗的場合很不利。
在燒寫程序時模塊上的GPIO0需要接低電平(默認為高電平)。
4.7 ESP8266-01 AT命令測試
ESP8266-01模塊自帶AT命令支持,用minicom可以測試。
- minicom
- 插拔VCC重新啟動模塊
- 樹莓派用minicom發送AT指令說明
AT 指令是一行一行發送給設備的,每一行以 rn 結尾,而我們在電腦上敲的回車鍵通過putty傳到樹莓派上只有 n沒有 r。所以AT命令的結束不能用回車鍵,要用組合鍵Ctrl+M和Ctrl+J。
對應關系:
r - Ctrl+M
n - Ctrl+J
例如發送查看固件版本指令AT+GMR是這樣的:
AT+GMR Ctrl+M Ctrl+J
看測試是否正常,以檢測模塊的好壞,連線是否正確。
5. 編譯一個項目
樂鑫官方文檔:
- ESP8266 SDK入門指南
https://www.espressif.com/sites/default/files/documentation/2a-esp8266-sdk_getting_started_guide_cn.pdf
- ESP8266 Non-OS SDK API參考
https://www.espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_cn.pdf
5.1 官方編程規范
5.2 編譯第一個ESP8266程序
- 查看ESP8266_NONOS_SDK目錄
查看ESP8266_NONOS_SDK/examples子目錄
在examples目錄中有一個esp_mqtt_proj子目錄,我們就從這里起步。
- 復制目錄
把esp_mqtt_proj目錄復制到和examples目錄平級,并改名為i_mqtt。
cp -r ./examples/esp_mqtt_proj ./i_mqtt
- 修改代碼
進入i_mqtt目錄,nano user/user_main.c
找到void user_init(void)函數,保留:
uart_init(BIT_RATE_115200, BIT_RATE_115200);
添加:
os_printf("SDK version:%sn", system_get_sdk_version());
其他語句都注釋掉。
- 編譯
運行gen_misc.h并回答5個問題:
./gen_misc.sh
選擇5個參數
編譯過程開始:
編譯結果放在~/esp/ESP8266_NONOS_SDK/bin目錄中:
cd ../bin/
ls -l
紅框中的4個文件要燒寫到ESP8266的Flash中。
- 簡化編譯過程
每次運行gen_misc.sh都要選擇輸入比較麻煩,可以根據上面的選擇輸入寫一個文件input.esp-01,其中記錄了上面的回答。
nano esp01
存盤退出,下次編譯用下面的輸入重定向自動輸入選項就可以了。
./gen_misc.sh < esp01
6. 燒寫ESP8266 Flash
要燒寫4個文件。先熟悉一下ESP8266 Flash的布局,再確定每個文件的燒寫地址。
6.1 ESP8266 Flash布局
6.2 ESP8266 FM(固件)
ESP8266 HDK就是指ESP8266模塊,我們用ESP8266-01。
ESP8266-01的flash 存儲器為8Mbit,也就是1MB。
6.3 確定燒寫地址
- 查固件地址表blank.bin位于0xfb00和0xfe000
- 查固件地址表esp_init_data_default_v08.bin位于0xfc000
- eagle.flash.bin位于0x00000
- eagle.irom0text.bin位于0x10000
注意,其中除了flash.bin和irom0text.bin每次都需要下載,blank.bin和esp_init_data_default_v08.bin只需要保證flash里面下載過就行了,對應版本的SDK只需要下載一次,并且要對照著上述地址下載。
6.4 燒寫flash
- 接線
用1條杜邦線連接ESP8266-01的GPIO0和樹莓派引腳Pin6(GND)。
- 燒寫flash的工具在這里
/home/pi/esp/esp-open-sdk/esptool/esptool.py,在前面我們已經設置了工具鏈的環境變量,可以直接使用。
- 查看串口設備
確認前面設置的串口設備ls -l /dev
serial0 -> ttyAMA0
- 構造燒寫命令
1) 第一次燒寫命令
esptool.py --port /dev/ttyAMA0 write_flash 0x00000 eagle.flash.bin 0x10000 eagle.irom0text.bin 0xfb000 blank.bin 0xfc000 esp_init_data_default_v08.bin 0xfe000 blank.bin
2) 之后的燒寫命令
esptool.py --port /dev/ttyAMA0 write_flash 0x00000 eagle.flash.bin 0x10000 eagle.irom0text.bin
- ESP8266 flash燒寫操作流程
1) VCC斷電
2) 連接GPIO0和GND
3) VCC上電
4) 執行上面準備好的燒寫命令
5) VCC斷電
6) 斷開GPIO0和GND
7) 運行minicom
注意:開多個putty窗口工作時,一定要燒寫完成后再運行minicom,否則串口被占著,燒寫會失敗!!!
8) 上電運行程序
OK!
- 制作ESP8266-01燒寫轉接板
燒寫過程挺麻煩的,如果經常燒寫可以做一個電路板簡化燒寫過程。其實在燒寫過程中GPIO0和GND的連線不用一直連著,在上電進入燒寫模式之后就可以拿掉了,燒寫完成后將RST拉低一下模塊就進入程序運行模式。這里有一張網上找的電路圖可以參考。
在參考文檔《ESP8266-01 Programming Breakout Board》中有詳細的制作說明。
- 擦除芯片命令
如果模塊燒寫后運行異常,可以擦除芯片重新燒寫。通常直接燒寫就可以,不用擦除。
esptool.py --port /dev/ttyAMA0 erase_flash
6.5 程序調試方法
官方給出的程序調試方法:
7. 更多的例子
在ESP8266-01S上面有一個藍色的LED接GPIO2引腳,我們下面用程序控制這個LED閃爍。
注意:如果使用ESP8266-01需要自己在GPIO2引腳上外接一個LED。
- 修改代碼nano user_main.c
1) 添加2個變量
static const int pin = 2;
static volatile os_timer_t some_timer;
2) 添加一個定時函數
void some_timerfunc(void *arg)
{
//Do blinky stuff
if (GPIO_REG_READ(GPIO_OUT_ADDRESS) & (1 << pin))
{
// set gpio low
gpio_output_set(0, (1 << pin), 0, 0);
}
else
{
// set gpio high
gpio_output_set((1 << pin), 0, 0, 0);
}
}
3) 在函數void user_init(void)中添加
// init gpio subsytem
gpio_init();
// configure UART TXD to be GPIO1, set as output
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
gpio_output_set(0, 0, (1 << pin), 0);
// setup timer (500ms, repeating)
os_timer_setfn(&some_timer, (os_timer_func_t *)some_timerfunc, NULL);
os_timer_arm(&some_timer, 500, 1);
- 編譯./gen_misc.sh < esp01
- 燒寫
esptool.py --port /dev/ttyAMA0 write_flash 0x00000 eagle.flash.bin 0x10000 eagle.irom0text.bin
- 運行燒寫完成后程序自動運行,可以看到led閃爍。
參考文檔:
總結
以上是生活随笔為你收集整理的toolchain安装教程支持_树莓派安装ESP8266_SDK开发环境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 提示用户输入一个高考_2020年湖南省高
- 下一篇: 水凝胶 静电纺丝_北理工赵扬ACS Na