ESP-IDF:Linux 和 macOS工具鏈標準設置

ESP-IDF (Espressif IoT Development Framework) 是樂鑫的ESP32芯片的開發框架,在VSCode中使用。雖然很多基於ESP32的開發板已經在PlatformIO中支持,但是目前ESP-IDF好像還不是PlatformIO原生的。值得注意的是,ESP使用xtensa的架構(也是gcc),而不是avr/arm的架構,在移植的時候跟avr/arm多少還是有一點點區別。

詳細安裝步驟

請根據下方詳細步驟,完成安裝過程。

第一步:安裝準備

爲了在 ESP32 中使用 ESP-IDF,需要根據操作系統安裝一些軟件包。以下安裝指南可協助您安裝 Linux 和 macOS 的系統上所有需要的軟件包。

Linux 用戶

編譯 ESP-IDF 需要以下軟件包。請根據使用的 Linux 發行版本,選擇合適的安裝命令。

  • Ubuntu 和 Debian:

    sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0

CentOS 7 & 8:

sudo yum -y update && sudo yum install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache dfu-util libusbx

目前仍然支持 CentOS 7,但爲了更好的用戶體驗,建議使用 CentOS 8。

  • Arch:

    sudo pacman -S --needed gcc git make flex bison gperf python-pip cmake ninja ccache dfu-util libusb

註解

  • 使用 ESP-IDF 需要 CMake 3.5 或以上版本。較早的 Linux 發行版可能需要升級自身的軟件源倉庫,或開啓 backports 套件庫,或安裝 “cmake3” 軟件包(不是安裝 “cmake”)。

  • 如果上述列表中沒有您使用的系統,請參考您所用系統的相關文檔,查看安裝軟件包所用的命令。

macOS 用戶

ESP-IDF 將使用 macOS 上默認安裝的 Python 版本。

  • 安裝 pip:

    sudo easy_install pip

安裝 CMake 和 Ninja 編譯工具:

  • 若有 HomeBrew,您可以運行:

    brew install cmake ninja dfu-util

若有 MacPorts,您可以運行:

sudo port install cmake ninja dfu-util
    • 若以上均不適用,請訪問 CMakeNinja 主頁,查詢有關 macOS 平臺的下載安裝問題。

  • 強烈建議同時安裝 ccache 以獲得更快的編譯速度。如有 HomeBrew,可通過 MacPorts 上的 brew install ccachesudo port install ccache 完成安裝。

註解

如您在上述任何步驟中遇到以下錯誤:

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

則必須安裝 XCode 命令行工具,可運行 xcode-select --install 命令進行安裝。

安裝 Python 3

Catalina 10.15 發佈說明 中表示不推薦使用 Python 2.7 版本,在未來的 macOS 版本中也不會默認包含 Python 2.7。執行以下命令來檢查您當前使用的 Python 版本:

python --version

如果輸出結果是 Python 2.7.17,則代表您的默認解析器是 Python 2.7。這時需要您運行以下命令檢查電腦上是否已經安裝過 Python 3:

python3 --version

如果運行上述命令出現錯誤,則代表電腦上沒有安裝 Python 3。

請根據以下步驟安裝 Python 3:

  • 使用 HomeBrew 進行安裝的方法如下:

    brew install python3

使用 MacPorts 進行安裝的方法如下:

sudo port install python38

第二步:獲取 ESP-IDF

在圍繞 ESP32 構建應用程序之前,請先獲取樂鑫提供的軟件庫文件 ESP-IDF 倉庫

獲取 ESP-IDF 的本地副本:打開終端,切換到您要保存 ESP-IDF 的工作目錄,使用 git clone 命令克隆遠程倉庫。針對不同操作系統的詳細步驟,請見下文。

打開終端,運行以下命令:

mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git

ESP-IDF 將下載至 ~/esp/esp-idf

請前往 ESP-IDF 版本簡介,查看 ESP-IDF 不同版本的具體適用場景。

第三步:設置工具

除了 ESP-IDF 本身,您還需要爲支持 ESP32 的項目安裝 ESP-IDF 使用的各種工具,比如編譯器、調試器、Python 包等。

cd ~/esp/esp-idf
./install.sh esp32

或使用 Fish shell:

cd ~/esp/esp-idf
./install.fish esp32

上述命令僅僅爲 ESP32 安裝所需工具。如果需要爲多個目標芯片開發項目,則可以一次性指定多個目標,如下所示:

.. code-block:: bash

cd ~/esp/esp-idf ./install.sh esp32,esp32s2

或使用 Fish shell:

cd ~/esp/esp-idf
./install.fish esp32,esp32s2

如果需要一次性爲所有支持的目標芯片安裝工具,可以運行如下命令:

cd ~/esp/esp-idf
./install.sh all

或使用 Fish shell:

cd ~/esp/esp-idf
./install.fish all

下載工具備選方案

ESP-IDF 工具安裝器會下載 Github 發佈版本中附帶的一些工具,如果訪問 Github 較爲緩慢,可以設置一個環境變量,從而優先選擇 Espressif 的下載服務器進行 Github 資源下載。

註解

該設置隻影響從 Github 發佈版本中下載的單個工具,它並不會改變訪問任何 Git 倉庫的 URL。

要在安裝工具時優先選擇 Espressif 下載服務器,請在運行 install.sh 時使用以下命令:

cd ~/esp/esp-idf
export IDF_GITHUB_ASSETS="dl.espressif.com/github_assets"
./install.sh

自定義工具安裝路徑

本步驟中介紹的腳本將 ESP-IDF 所需的編譯工具默認安裝在用戶的根目錄中,即 Linux 系統中的 $HOME/.espressif 目錄。您可以選擇將工具安裝到其他目錄中,但請在運行安裝腳本前,重新設置環境變量 IDF_TOOLS_PATH。注意,請確保您的用戶賬號已經具備了讀寫該路徑的權限。

如果修改了 IDF_TOOLS_PATH 變量,請確保該變量在每次執行安裝腳本 (install.batinstall.ps1install.sh) 和導出腳本 (export.batexport.ps1export.sh) 均保持一致。

第四步:設置環境變量

此時,您剛剛安裝的工具尚未添加至 PATH 環境變量,無法通過“命令窗口”使用這些工具。因此,必須設置一些環境變量。這可以通過 ESP-IDF 提供的另一個腳本進行設置。

請在需要運行 ESP-IDF 的終端窗口運行以下命令:

. $HOME/esp/esp-idf/export.sh

對於 fish shell(僅支持 fish 3.0.0 及以上版本),請運行以下命令:

. $HOME/esp/esp-idf/export.fish

注意,命令開始的 “.” 與路徑之間應有一個空格!

如果您需要經常運行 ESP-IDF,您可以爲執行 export.sh 創建一個別名,具體步驟如下:

  1. 複製並粘貼以下命令到 shell 配置文件中(.profile.bashrc.zprofile 等)

    alias get_idf='. $HOME/esp/esp-idf/export.sh'
  1. 通過重啓終端窗口或運行 source [path to profile],如 source ~/.bashrc 來刷新配置文件。

現在您可以在任何終端窗口中運行 get_idf 來設置或刷新 esp-idf 環境。

不建議直接將 export.sh 添加到 shell 的配置文件。這樣做會導致在每個終端會話中都激活 IDF 虛擬環境(包括無需使用 IDF 的會話)。這違背了使用虛擬環境的目的,還可能影響其他軟件的使用。

第五步:開始使用 ESP-IDF 吧

現在您已經具備了使用 ESP-IDF 的所有條件,接下來將介紹如何開始您的第一個工程。

本指南將幫助您完成使用 ESP-IDF 的第一步。按照本指南,您將能使用 ESP32 開始創建第一個工程,並構建、燒錄和監控設備輸出。

註解

如果您還沒有安裝 ESP-IDF,請前往 安裝 並按照說明操作,以獲得使用本指南所需的所有軟件。

開始創建工程

現在,您可以開始準備開發 ESP32 應用程序了。您可以從 ESP-IDF 中 examples 目錄下的 get-started/hello_world 工程開始。

重要

ESP-IDF 編譯系統不支持 ESP-IDF 路徑或其工程路徑中帶有空格。

get-started/hello_world 工程複製至您本地的 ~/esp 目錄下:

Windows 操作系統

cd %userprofile%\esp
xcopy /e /i %IDF_PATH%\examples\get-started\hello_world hello_world

Linux 和 macOS 操作系統

cd ~/esp
cp -r $IDF_PATH/examples/get-started/hello_world .

註解

ESP-IDF 的 examples 目錄下有一系列示例工程,您可以按照上述方法複製並運行其中的任何示例,也可以直接編譯示例,無需進行復制。

連接設備

現在,請將您的 ESP32 開發板連接到 PC,並查看開發板使用的串口。

通常,串口在不同操作系統下顯示的名稱有所不同:

  • Windows 操作系統: COM1

  • Linux 操作系統:/dev/tty 開始

  • macOS 操作系統:/dev/cu. 開始

有關如何查看串口名稱的詳細信息,請見 與 ESP32 創建串口連接

註解

請記住串口名,您會在後續步驟中使用。

配置工程

請進入 hello_world 目錄,設置 ESP32 爲目標芯片,然後運行工程配置工具 menuconfig

Windows 操作系統

cd %userprofile%\esp\hello_world
idf.py set-target esp32
idf.py menuconfig

Linux 和 macOS 操作系統

cd ~/esp/hello_world
idf.py set-target esp32
idf.py menuconfig

打開一個新工程後,應首先使用 idf.py set-target esp32 設置“目標”芯片。注意,此操作將清除並初始化項目之前的編譯和配置(如有)。 您也可以直接將“目標”配置爲環境變量(此時可跳過該步驟)。更多信息,請見 選擇目標芯片

如果之前的步驟都正確,則會顯示下面的菜單:

工程配置 — 主窗口

工程配置 — 主窗口

您可以通過此菜單設置項目的具體變量,包括 Wi-Fi 網絡名稱、密碼和處理器速度等。hello_world 示例項目會以默認配置運行,因此可以跳過使用 menuconfig 進行項目配置這一步驟。

注意

如果您使用的是 ESP32-DevKitC(板載 ESP32-SOLO-1 模組)或 ESP32-DevKitM-1(板載 ESP32-MINI-1(1U) 模組),請在燒寫示例程序前,前往 menuconfig 中使能單核模式(CONFIG_FREERTOS_UNICORE)。

註解

您終端窗口中顯示出的菜單顏色可能會與上圖不同。您可以通過選項 --style 來改變外觀。請運行 idf.py menuconfig --help 命令,獲取更多信息。

編譯工程

請使用以下命令,編譯燒錄工程:

idf.py build

運行以上命令可以編譯應用程序和所有 ESP-IDF 組件,接着生成引導加載程序、分區表和應用程序二進制文件。

$ idf.py build
Running cmake in directory /path/to/hello_world/build
Executing "cmake -G Ninja --warn-uninitialized /path/to/hello_world"...
Warn about uninitialized values.
-- Found Git: /usr/bin/git (found version "2.17.0")
-- Building empty aws_iot component due to configuration
-- Component names: ...
-- Component paths: ...

... (more lines of build system output)

[527/527] Generating hello_world.bin
esptool.py v2.3.1

Project build complete. To flash, run this command:
../../../components/esptool_py/esptool/esptool.py -p (PORT) -b 921600 write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x10000 build/hello_world.bin  build 0x1000 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin
or run 'idf.py -p PORT flash'

如果一切正常,編譯完成後將生成 .bin 文件。

燒錄到設備

請使用以下命令,將剛剛生成的二進制文件 (bootloader.bin、partition-table.bin 和 hello_world.bin) 燒錄至您的 ESP32 開發板:

idf.py -p PORT [-b BAUD] flash

請將 PORT 替換爲 ESP32 開發板的串口名稱。

您還可以將 BAUD 替換爲您希望的燒錄波特率。默認波特率爲 460800

更多有關 idf.py 參數的詳情,請見 idf.py

註解

勾選 flash 選項將自動編譯並燒錄工程,因此無需再運行 idf.py build

燒錄過程中可能遇到的問題

如果在運行給定命令時出現如“連接失敗”這樣的錯誤,造成該錯誤的原因之一可能是運行 esptool.py 時出現錯誤。esptool.py 是構建系統調用的程序,用於重置芯片、與 ROM 引導加載器交互以及燒錄固件的工具。可以按照以下步驟進行手動復位,輕鬆解決該問題。如果問題仍未解決,請參考 Troubleshooting. 獲取更多信息。

esptool.py 通過使 USB 轉串口轉接器芯片(如 FTDI 或 CP210x)的 DTR 和 RTS 控制線生效來自動復位 ESP32(請參考 與 ESP32 創建串口連接 獲取更多詳細信息)。DTR 和 RTS 控制線又連接到 ESP32 的 GPIO0CHIP_PU (EN) 管腳上,因此 DTR 和 RTS 的電壓電平變化會使 ESP32 進入固件下載模式。相關示例可查看 ESP32 DevKitC 開發板的 原理圖

一般來說,使用官方的 ESP-IDF 開發板不會出現問題。但是,esptool.py 在以下情況下不能自動重置硬件。

  • 您的硬件沒有連接到 GPIO0CIHP_PU 的 DTR 和 RTS 控制線。

  • DTR 和 RTS 控制線的配置方式不同

  • 根本沒有這樣的串行控制線路

根據您硬件的種類,也可以將您 ESP32 開發板手動設置成固件下載模式(復位)。

  • 對於 Espressif 的開發板,您可以參考對應開發板的入門指南或用戶指南。例如,可以通過按住 Boot 按鈕 (GPIO0) 再按住 EN 按鈕(CHIP_PU) 來手動復位 ESP-IDF 開發板。

  • 對於其他類型的硬件,可以嘗試將 GPIO0 拉低。

常規操作

在燒錄過程中,您會看到類似如下的輸出日誌:

...
esptool.py --chip esp32 -p /dev/ttyUSB0 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size 2MB 0x8000 partition_table/partition-table.bin 0x1000 bootloader/bootloader.bin 0x10000 hello_world.bin
esptool.py v3.0-dev
Serial port /dev/ttyUSB0
Connecting........_
Chip is ESP32D0WDQ6 (revision 0)
Features: WiFi, BT, Dual Core, Coding Scheme None
Crystal is 40MHz
MAC: 24:0a:c4:05:b9:14
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Compressed 3072 bytes to 103...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.0 seconds (effective 5962.8 kbit/s)...
Hash of data verified.
Compressed 26096 bytes to 15408...
Writing at 0x00001000... (100 %)
Wrote 26096 bytes (15408 compressed) at 0x00001000 in 0.4 seconds (effective 546.7 kbit/s)...
Hash of data verified.
Compressed 147104 bytes to 77364...
Writing at 0x00010000... (20 %)
Writing at 0x00014000... (40 %)
Writing at 0x00018000... (60 %)
Writing at 0x0001c000... (80 %)
Writing at 0x00020000... (100 %)
Wrote 147104 bytes (77364 compressed) at 0x00010000 in 1.9 seconds (effective 615.5 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
Done

如果一切順利,燒錄完成後,開發板將會復位,應用程序 “hello_world” 開始運行。

如果您希望使用 Eclipse 或是 VS Code IDE,而非 idf.py,請參考 Eclipse 指南,以及 VS Code 指南

監視輸出

您可以使用 idf.py -p PORT monitor 命令,監視 “hello_world” 工程的運行情況。注意,不要忘記將 PORT 替換爲您的串口名稱。

運行該命令後,IDF 監視器 應用程序將啓動::

$ idf.py -p <PORT> monitor
Running idf_monitor in directory [...]/esp/hello_world/build
Executing "python [...]/esp-idf/tools/idf_monitor.py -b 115200 [...]/esp/hello_world/build/hello_world.elf"...
--- idf_monitor on <PORT> 115200 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun  8 2016 00:22:57
...

此時,您就可以在啓動日誌和診斷日誌之後,看到打印的 “Hello world!” 了。

...
    Hello world!
    Restarting in 10 seconds...
    This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, silicon revision 1, 2MB external flash
Minimum free heap size: 298968 bytes
    Restarting in 9 seconds...
    Restarting in 8 seconds...
    Restarting in 7 seconds...

您可使用快捷鍵 Ctrl+],退出 IDF 監視器。

如果 IDF 監視器在燒錄後很快發生錯誤,或打印信息全是亂碼(如下),很有可能是因爲您的開發板採用了 26 MHz 晶振,而 ESP-IDF 默認支持大多數開發板使用的 40 MHz 晶振。

亂碼輸出

此時,您可以:

  1. 退出監視器。

  2. 返回 menuconfig。

  3. 進入 Component config –> ESP32-specific –> Main XTAL frequency 進行配置,將 CONFIG_ESP32_XTAL_FREQ_SEL 設置爲 26 MHz。

  4. 重新 編譯和燒錄 應用程序。

註解

您也可以運行以下命令,一次性執行構建、燒錄和監視過程:

idf.py -p PORT flash monitor

此外,

  • 請前往 IDF 監視器,瞭解更多使用 IDF 監視器的快捷鍵和其他詳情。

  • 請前往 idf.py,查看更多 idf.py 命令和選項。

恭喜,您已完成 ESP32 的入門學習!

現在,您可以嘗試一些其他 examples,或者直接開發自己的應用程序。

重要

一些示例程序不支持 ESP32,因爲 ESP32 中不包含所需的硬件。

在編譯示例程序前請查看 README 文件中 Supported Targets 表格。如果表格中包含 ESP32, 或者不存在這個表格,那麼即表示 ESP32 支持這個示例程序。

其他提示

權限問題 /dev/ttyUSB0

使用某些 Linux 版本向 ESP32 燒錄固件時,可能會出現 Failed to open port /dev/ttyUSB0 錯誤消息。此時可以將用戶添加至 Linux Dialout 組

兼容的 Python 版本

ESP-IDF 支持 Python 3.7 及以上版本,建議升級操作系統到最新版本從而更新 Python。也可選擇從 sources 安裝最新版 Python,或使用 Python 管理系統如 pyenv 對版本進行升級管理。

建議:更新 ESP-IDF

樂鑫會不時推出新版本的 ESP-IDF,修復 bug 或提供新的功能。請注意,EESP-IDF 的每個主要版本和次要版本都有相應的支持期限。支持期限滿後,版本停止更新維護,用戶可將項目升級到最新的 ESP-IDF 版本。更多關於支持期限的信息,請參考 ESP-IDF 版本

因此,您在使用時,也應注意更新您本地的版本。最簡單的方法是:直接刪除您本地的 esp-idf 文件夾,然後按照 第二步:獲取 ESP-IDF 中的指示,重新完成克隆。

另一種方法是僅更新變更的部分。具體方式,請前往 更新 ESP-IDF 章節查看。具體更新步驟會根據您使用的 ESP-IDF 版本有所不同。

注意,更新完成後,請再次運行安裝腳本,以防新版 ESP-IDF 所需的工具也有所更新。具體請參考 第三步:設置工具

一旦重新安裝好工具,請使用導出腳本更新環境,具體請參考 第四步:設置環境變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章