# Linux 和 macOS 平台工具链的标准设置

[English]

## 详细安装步骤

请根据下方详细步骤，完成安装过程。

### 设置开发环境

以下是为 ESP32-H2 设置 ESP-IDF 的具体步骤。

- 第一步：安装准备

- 第二步：获取 ESP-IDF

- 第三步：设置工具

- 第四步：设置环境变量

- 第五步：开始使用 ESP-IDF 吧

## 第一步：安装准备

为了在 ESP32-H2 中使用 ESP-IDF，需要根据操作系统安装一些软件包。可以参考以下安装指南，安装 Linux 和 macOS 的系统上所有需要的软件包。

### Linux 用户

编译 ESP-IDF 需要以下软件包。请根据使用的 Linux 发行版本，选择合适的安装命令。

- Ubuntu 和 Debian:

      sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv 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-setuptools cmake ninja-build ccache dfu-util libusbx

目前仍然支持 CentOS 7，但为了更好的用户体验，建议使用 CentOS 8。

- Arch:

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

备注

- 使用 ESP-IDF 需要 CMake 3.16 或以上版本。较早的 Linux 发行版可能需要升级自身的软件源仓库，或开启 backports 套件库，或安装 "cmake3" 软件包（不是安装 "cmake"）。

- 如果上述列表中没有当前所用系统，请参考所用系统的相关文档，查看安装软件包所用的命令。

### macOS 用户

ESP-IDF 将使用 macOS 上默认安装的 Python 版本。

- 安装 CMake 和 Ninja 编译工具：

  > - 若有 HomeBrew，可以运行:

  >       brew install cmake ninja dfu-util

  > - 若有 MacPorts，可以运行:

  >       sudo port install cmake ninja dfu-util

  > - 若以上均不适用，请访问 CMake 和 Ninja 主页，查询有关 macOS 平台的下载安装问题。

- 强烈建议同时安装 ccache 以获得更快的编译速度。如有 HomeBrew，可通过 MacPorts 上的 `brew install ccache` 或 `sudo 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` 命令进行安装。

### Apple M1 用户

如果使用的是 Apple M1 系列且看到如下错误提示:

    WARNING: directory for tool xtensa-esp32-elf version esp-2021r2-patch3-8.4.0 is present, but tool was not found
    ERROR: tool xtensa-esp32-elf has no installed versions. Please run 'install.sh' to install it.

或者:

    zsh: bad CPU type in executable: ~/.espressif/tools/xtensa-esp32-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc

运行如下命令，安装 Apple Rosetta 2：

    /usr/sbin/softwareupdate --install-rosetta --agree-to-license

#### 安装 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-H2 构建应用程序之前，请先获取乐鑫提供的软件库文件 ESP-IDF 仓库。

获取 ESP-IDF 的本地副本：打开终端，切换到要保存 ESP-IDF 的工作目录，使用 `git clone` 命令克隆远程仓库。针对不同操作系统的详细步骤，请见下文。

打开终端，运行以下命令：

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

ESP-IDF 将下载至 `~/esp/esp-idf`。

请前往 ESP-IDF 版本简介，查看 ESP-IDF 不同版本的具体适用场景。

## 第三步：设置工具

除了 ESP-IDF 本身，还需要为支持 ESP32-H2 的项目安装 ESP-IDF 使用的各种工具，比如编译器、调试器、Python 包等。

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

或使用 Fish shell：

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

上述命令仅仅为 ESP32-H2 安装所需工具。如果需要为多个目标芯片开发项目，则可以一次性指定多个目标，如下所示：

    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

备注

对于 macOS 用户，如在上述任何步骤中遇到以下错误:

    <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:xxx)

可运行电脑 Python 文件夹中的 `Install Certificates.command` 安装证书。了解更多信息，请参考 安装 ESP-IDF 工具时出现的下载错误。

### 下载工具备选方案

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

备注

推荐国内用户使用国内的下载服务器，以加快下载速度。

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

### 自定义工具安装路径

本步骤中介绍的脚本将 ESP-IDF 所需的编译工具默认安装在用户的根目录中，即 Linux 系统中的 `$HOME/.espressif` 目录。可以选择将工具安装到其他目录中，但请在运行安装脚本前，导出环境变量 IDF_TOOLS_PATH。注意，请确保用户账号已经具备了读写该路径的权限。

    export IDF_TOOLS_PATH="$HOME/required_idf_tools_path"
    ./install.sh

    . ./export.sh

如果修改了 `IDF_TOOLS_PATH` 变量，请在运行任意 ESP-IDF 工具或脚本前，将该变量导出到环境变量中。

备注

如未导出环境变量，大多数 shell 将不支持在变量赋值中使用 `IDF_TOOLS_PATH`，例如 `IDF_TOOLS_PATH="$HOME/required_idf_tools_path" ./install.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'

2. 通过重启终端窗口或运行 `source [path to profile]`，如 `source ~/.bashrc` 来刷新配置文件。

现在可以在任何终端窗口中运行 `get_idf` 来设置或刷新 ESP-IDF 环境。

不建议直接将 `export.sh` 添加到 shell 的配置文件。这样做会导致在每个终端会话中都激活 IDF 虚拟环境（包括无需使用 ESP-IDF 的会话）。这违背了使用虚拟环境的目的，还可能影响其他软件的使用。

## 第五步：开始使用 ESP-IDF 吧

现在你已经具备了使用 ESP-IDF 的所有条件，接下来将介绍如何开始第一个工程。

本指南将介绍如何初步上手 ESP-IDF，包括如何使用 ESP32-H2 创建第一个工程，并构建、烧录和监控设备输出。

备注

如果还未安装 ESP-IDF，请参照 安装 中的步骤，获取使用本指南所需的所有软件。

## 开始创建工程

现在，可以准备开发 ESP32-H2 应用程序了。可以从 ESP-IDF 中 examples 目录下的 get-started/hello_world 工程开始。

重要

ESP-IDF 编译系统不支持 ESP-IDF 路径或其工程路径中带有空格。

将 get-started/hello_world 工程复制至本地的 `~/esp` 目录下：

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

备注

ESP-IDF 的 examples 目录下有一系列示例工程，可以按照上述方法复制并运行其中的任何示例，也可以直接编译示例，无需进行复制。

## 连接设备

现在，请将 ESP32-H2 开发板连接到 PC，并查看开发板使用的串口。

通常，串口在不同操作系统下显示的名称有所不同：

- Linux 操作系统： 以 `/dev/tty` 开头

- macOS 操作系统： 以 `/dev/cu.` 开头

有关如何查看串口名称的详细信息，请见 与 ESP32-H2 创建串口连接。

备注

请记住串口名，以便后续使用。

## 配置工程

请进入 `hello_world` 目录，设置 ESP32-H2 为目标芯片，然后运行工程配置工具 `menuconfig`。

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

打开一个新工程后，应首先使用 `idf.py set-target esp32h2` 设置“目标”芯片。注意，此操作将清除并初始化项目之前的编译和配置（如有）。也可以直接将“目标”配置为环境变量（此时可跳过该步骤）。更多信息，请见 选择目标芯片：set-target。

正确操作上述步骤后，系统将显示以下菜单：

工程配置 — 主窗口

可以通过此菜单设置项目的具体变量，包括 Wi-Fi 网络名称、密码和处理器速度等。`hello_world` 示例项目会以默认配置运行，因此在这一项目中，可以跳过使用 `menuconfig` 进行项目配置这一步骤。

备注

终端窗口中显示出的菜单颜色可能会与上图不同。可以通过选项 `--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 文件。

## 烧录到设备

请运行以下命令，将刚刚生成的二进制文件烧录至 ESP32-H2 开发板：

    idf.py -p PORT flash

请将 PORT 替换为 ESP32-H2 开发板的串口名称。如果 `PORT` 未经定义，idf.py 将尝试使用可用的串口自动连接。

更多有关 idf.py 参数的详情，请见 idf.py。

备注

勾选 `flash` 选项将自动编译并烧录工程，因此无需再运行 `idf.py build`。

若在烧录过程中遇到问题，请参考下文中的“其他提示”。也可以前往 烧录故障排除 或 与 ESP32-H2 创建串口连接 获取更多详细信息。

### 常规操作

在烧录过程中，会看到类似如下的输出日志：

    ...
    esptool esp32h2 -p /dev/ttyUSB0 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 48m --flash_size 2MB 0x0 bootloader/bootloader.bin 0x10000 hello_world.bin 0x8000 partition_table/partition-table.bin
    esptool.py v4.6
    Serial port /dev/ttyUSB0
    Connecting....
    Chip is ESP32-H2 (revision v0.1)
    Features: BLE
    Crystal is 32MHz
    MAC: 60:55:f9:f7:3e:93:ff:fe
    Uploading stub...
    Running stub...
    Stub running...
    Changing baud rate to 460800
    Changed.
    Configuring flash size...
    Flash will be erased from 0x00000000 to 0x00005fff...
    Flash will be erased from 0x00010000 to 0x00034fff...
    Flash will be erased from 0x00008000 to 0x00008fff...
    Compressed 20880 bytes to 12788...
    Writing at 0x00000000... (100 %)
    Wrote 20880 bytes (12788 compressed) at 0x00000000 in 0.6 seconds (effective 297.5 kbit/s)...
    Hash of data verified.
    Compressed 149424 bytes to 79574...
    Writing at 0x00010000... (20 %)
    Writing at 0x00019959... (40 %)
    Writing at 0x00020bb5... (60 %)
    Writing at 0x00026d8f... (80 %)
    Writing at 0x0002e60a... (100 %)
    Wrote 149424 bytes (79574 compressed) at 0x00010000 in 2.1 seconds (effective 571.7 kbit/s)...
    Hash of data verified.
    Compressed 3072 bytes to 103...
    Writing at 0x00008000... (100 %)
    Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.0 seconds (effective 539.7 kbit/s)...
    Hash of data verified.

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

如果一切顺利，烧录完成后，开发板将会复位，应用程序 "hello_world" 开始运行。

如果希望使用 Eclipse 或是 VS Code IDE，而非 `idf.py`，请参考 Eclipse Plugin，以及 VSCode Extension。

## 监视输出

可以使用 `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 esp32h2 chip with 1 CPU core(s), BLE, 802.15.4 (Zigbee/Thread), silicon revision v0.1, 2 MB external flash
    Minimum free heap size: 268256 bytes
        Restarting in 9 seconds...
        Restarting in 8 seconds...
        Restarting in 7 seconds...

使用快捷键 `Ctrl+]`，可退出 ESP-IDF 监视器。

备注

也可以运行以下命令，一次性执行构建、烧录和监视过程：

`idf.py -p PORT flash monitor`

此外，

- 请前往 IDF 监视器，了解更多使用 ESP-IDF 监视器的快捷键和其他详情。

- 请前往 idf.py，查看更多 `idf.py` 命令和选项。

恭喜完成 ESP32-H2 的入门学习！

现在，可以尝试一些其他 examples，或者直接开发自己的应用程序。

重要

一些示例程序不支持 ESP32-H2，因为 ESP32-H2 中不包含所需的硬件。

在编译示例程序前请查看 README 文件中 `Supported Targets` 表格。如果表格中包含 ESP32-H2， 或者不存在这个表格，那么即表示 ESP32-H2 支持这个示例程序。

## 其他提示

### 权限问题

使用某些 Linux 版本向 ESP32-H2 烧录固件时，可能会出现类似 `Could not open port <PORT>: Permission denied: '<PORT>'` 错误消息。此时可以在 Linux 将用户添加至 dialout 组或 uucp 组 来解决此类问题。

### 兼容的 Python 版本

ESP-IDF 支持 Python 3.9 及以上版本，建议升级操作系统到最新版本从而更新 Python。也可选择从 sources 安装最新版 Python，或使用 Python 管理系统如 pyenv 对版本进行升级管理。

### 擦除 flash

ESP-IDF 支持擦除 flash。请运行以下命令，擦除整个 flash：

    idf.py -p PORT erase-flash

若存在需要擦除的 OTA 数据，请运行以下命令：

    idf.py -p PORT erase-otadata

擦除 flash 需要一段时间，在擦除过程中，请勿断开设备连接。

## 建议：更新 ESP-IDF

乐鑫会不时推出新版本的 ESP-IDF，修复 bug 或提供新的功能。请注意，ESP-IDF 的每个主要版本和次要版本都有相应的支持期限。支持期限满后，版本停止更新维护，用户可将项目升级到最新的 ESP-IDF 版本。更多关于支持期限的信息，请参考 ESP-IDF 版本。

因此，在使用时，也应注意更新本地版本。最简单的方法是：直接删除本地的 `esp-idf` 文件夹，然后按照 第二步：获取 ESP-IDF 中的指示，重新完成克隆。

另一种方法是仅更新变更的部分，具体方式请前往 更新 ESP-IDF 章节查看。具体更新步骤会根据使用的 ESP-IDF 版本有所不同。

注意，更新完成后，请再次运行安装脚本，以防新版 ESP-IDF 所需的工具也有所更新。具体请参考 第三步：设置工具。

一旦重新安装好工具，请使用导出脚本更新环境，具体请参考 第四步：设置环境变量。

## 相关文档

- 与 ESP32-H2 创建串口连接

- Eclipse Plugin

- VSCode Extension

- IDF 监视器

此文档对您有帮助吗？

- 反馈已收到，谢谢！
- 如果您有其他意见，欢迎填写乐鑫文档反馈表。

- 我们重视您的反馈。
- 您可以填写乐鑫文档反馈表告诉我们如何改进该文档。