1224 字
6 分钟
vscode esp-idf开发环境安装及arduino移植

NOTE

之所以写这篇博客, 是因为乐鑫做的实在是太垃圾了.

手动安装VScode插件识别不到, 默认安装版本太高arduino不适配, Vscode启动安装管理器安装居然要在vscode上按一下回车确认我的github用户名???

我瞪了半天安装管理器, 没发现vsc命令窗口上有个超小的输入框确认, 没确认就不开始下载, 等了半天自己居然崩溃了?!

我tm整整装了四遍, 等进度条的时候写下了这篇博客

esp-idf环境安装#

NOTE

手动安装或使用source export.sh会导致idf插件无法识别虚拟环境

两种方案原生无法共存, 所以哪个都行, 后文有解决方案.

方案A: 通过VSCode插件安装(通过官方管理器)#

参考安装 ESP-IDF 和相关工具

如果你不使用VSCode插件, 参考在 Linux 上安装 ESP-IDF 及工具链直接下载管理器安装

vscode安装扩展ESP-IDF, 然后跟随欢迎页面提示安装,.

或者在vsc命令面板输入ESP-IDF: Open ESP-IDF Install Manager安装.

欢迎页面

IMPORTANT

正如我开头提到的, 确认完下载后, 答应我一定要看VScode顶上的命令框好吗, 没确认就不开始下载, 我哭死

方案B: 手动安装#

参考Linux 和 macOS 平台工具链的标准设置(已过时)

以下是基于Ubuntu 和 Debian的安装方案

1.安装依赖(已安装的会自动跳过)#

Terminal window
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

2. 从Github克隆esp-idf#

espressif
/
esp-idf
Waiting for api.github.com...
00K
0K
0K
Waiting...
Terminal window
mkdir -p ~/esp
cd ~/esp
git clone -b v5.1.4 --single-branch --recursive https://github.com/espressif/esp-idf.git
IMPORTANT

--recursive必须要加, 因为这会下载所有的子仓库

-b v5.1.4必须要加, 截止2026.3 esp-idf已经更新到v6.1, 但arduino组件仅支持v5.x版本的esp-idf

3. 安装所需芯片的工具包#

Terminal window
cd ~/esp/esp-idf
./install.sh all # 安装所有芯片
./install.sh esp32,esp32s2 # 安装指定的几个芯片
NOTE

工具包默认安装到~/.espressif定制安装目录参见前文

Linux 和 macOS 平台工具链的标准设置(已过时)

4. 环境配置#

Terminal window
vim ~/.bashrc

.bashrc中加入以下内容, 保存后别忘了source ~./bashrc使配置生效

Terminal window
export IDF_PATH="$HOME/esp/esp-idf/:$PATH"
# 设置一个别名,
alias get_idf='. $IDF_PATH/export.sh'

请在需要运行 ESP-IDF 的终端窗口运行以下命令:

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

或者直接运行

Terminal window
get_idf

看到下图即说明安装成功 get_idf结果

vscode ESP-IDF插件编译 和 idf.py手动编译兼容#

以v5.5.3版本为例

  • 首先, 你一定执行过./install.sh$HOME/esp/esp-idf/export.sh,出现了上图的界面, 证明idf.py已经可以使用.
  • 但是ESP-IDF插件的编译虚拟环境没有使用export.sh, 而是使用了source $HOME/.espressif/tools/activate_idf_v5.5.3.sh, 其内部设置的虚拟环境和export.sh的虚拟环境冲突, 如果设置了export.sh, 则vsc插件的环境就会消失
  • 所以我们要做的是将activate_idf_v5.5.3.sh内的虚拟环境改为export.sh中的虚拟环境
  • export.sh中的虚拟环境位置在$HOME/.espressif/python_env/idf5.5_py3.12_env
/home/mint/.espressif/tools/activate_idf_v5.5.3.sh
l-files activate_idf_v5.5.3.sh 'activate_idf_v5.5.3 (副本).sh'
9c9
+ IDF_PYTHON_ENV_PATH:/home/mint/.espressif/python_env/idf5.5_py3.12_env
- IDF_PYTHON_ENV_PATH:/home/mint/.espressif/tools/python/v5.5.3/venv
97c97
+ export PATH="/home/mint/.espressif/tools/cmake/3.30.2/bin:/home/mint/.espressif/tools/esp-clang/esp-19.1.2_20250312/esp-clang/bin:/home/mint/.espressif/tools/esp-rom-elfs/20241011/:/home/mint/.espressif/tools/esp32ulp-elf/2.38_20240113/esp32ulp-elf/bin:/home/mint/.espressif/tools/esp32ulp-elf/2.38_20240113/esp32ulp-elf/esp32ulp-elf/bin:/home/mint/.espressif/tools/ninja/1.12.1/:/home/mint/.espressif/tools/openocd-esp32/v0.12.0-esp32-20251215/openocd-esp32/bin:/home/mint/.espressif/tools/riscv32-esp-elf-gdb/16.3_20250913/riscv32-esp-elf-gdb/bin:/home/mint/.espressif/tools/riscv32-esp-elf/esp-14.2.0_20251107/riscv32-esp-elf/bin:/home/mint/.espressif/tools/riscv32-esp-elf/esp-14.2.0_20251107/riscv32-esp-elf/riscv32-esp-elf/bin:/home/mint/.espressif/tools/xtensa-esp-elf-gdb/16.3_20250913/xtensa-esp-elf-gdb/bin:/home/mint/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin:/home/mint/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/xtensa-esp-elf/bin:/home/mint/.espressif/python_env/idf5.5_py3.12_env:/home/mint/.espressif/v5.5.3/esp-idf/components/esptool_py/esptool:$PATH"
- export PATH="/home/mint/.espressif/tools/cmake/3.30.2/bin:/home/mint/.espressif/tools/esp-clang/esp-19.1.2_20250312/esp-clang/bin:/home/mint/.espressif/tools/esp-rom-elfs/20241011/:/home/mint/.espressif/tools/esp32ulp-elf/2.38_20240113/esp32ulp-elf/bin:/home/mint/.espressif/tools/esp32ulp-elf/2.38_20240113/esp32ulp-elf/esp32ulp-elf/bin:/home/mint/.espressif/tools/ninja/1.12.1/:/home/mint/.espressif/tools/openocd-esp32/v0.12.0-esp32-20251215/openocd-esp32/bin:/home/mint/.espressif/tools/riscv32-esp-elf-gdb/16.3_20250913/riscv32-esp-elf-gdb/bin:/home/mint/.espressif/tools/riscv32-esp-elf/esp-14.2.0_20251107/riscv32-esp-elf/bin:/home/mint/.espressif/tools/riscv32-esp-elf/esp-14.2.0_20251107/riscv32-esp-elf/riscv32-esp-elf/bin:/home/mint/.espressif/tools/xtensa-esp-elf-gdb/16.3_20250913/xtensa-esp-elf-gdb/bin:/home/mint/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin:/home/mint/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/xtensa-esp-elf/bin:/home/mint/.espressif/tools/python/v5.5.3/venv/bin:$PATH"
103c103
+ venv_path="/home/mint/.espressif/python_env/idf5.5_py3.12_env"
- venv_path="$1"
138c138
+ alias idf.py="/home/mint/.espressif/v5.5.3/esp-idf/tools/idf.py"
- alias idf.py="/home/mint/.espressif/tools/python/v5.5.3/venv/bin/python /home/mint/.espressif/v5.5.3/esp-idf/tools/idf.py"
140c140
+ alias esptool.py="/home/mint/.espressif/v5.5.3/esp-idf/components/esptool_py/esptool/esptool.py"
- alias esptool.py="/home/mint/.espressif/tools/python/v5.5.3/venv/bin/python /home/mint/.espressif/v5.5.3/esp-idf/components/esptool_py/esptool/esptool.py"
142c142
+ alias espefuse.py="/home/mint/.espressif/v5.5.3/esp-idf/components/esptool_py/esptool/espefuse.py"
- alias espefuse.py="/home/mint/.espressif/tools/python/v5.5.3/venv/bin/python /home/mint/.espressif/v5.5.3/esp-idf/components/esptool_py/esptool/espefuse.py"
144c144
+ alias espsecure.py="/home/mint/.espressif/v5.5.3/esp-idf/components/esptool_py/esptool/espsecure.py"
- alias espsecure.py="/home/mint/.espressif/tools/python/v5.5.3/venv/bin/python /home/mint/.espressif/v5.5.3/esp-idf/components/esptool_py/esptool/espsecure.py"
146c146
+ alias otatool.py="/home/mint/.espressif/v5.5.3/esp-idf/components/app_update/otatool.py"
- alias otatool.py="/home/mint/.espressif/tools/python/v5.5.3/venv/bin/python /home/mint/.espressif/v5.5.3/esp-idf/components/app_update/otatool.py"
148c148
+ alias parttool.py="/home/mint/.espressif/v5.5.3/esp-idf/components/partition_table/parttool.py"
- alias parttool.py="/home/mint/.espressif/tools/python/v5.5.3/venv/bin/python /home/mint/.espressif/v5.5.3/esp-idf/components/partition_table/parttool.py"
156c156
+ venv_default="/home/mint/.espressif/python_env/idf5.5_py3.12_env"
- venv_default="/home/mint/.espressif/tools/python/v5.5.3/venv"

arduino组件添加#

参考Arduino as an ESP-IDF component

要使用 IDF 组件管理器将 Arduino 组件添加到项目中,请在项目目录中运行以下命令:

Terminal window
idf.py add-dependency "espressif/arduino-esp32^3.3.7"

或者,可以使用 Arduino 组件从模板创建一个新项目:

Terminal window
idf.py create-project-from-example "espressif/arduino-esp32^3.3.7:hello_world"

配置#

根据以下两个选项之一,在 idf.py menuconfig 中设置相应的设置。

前往该部分Arduino Configuration --->

功能使用说明app_main()- 关闭Autostart Arduino setup and loop on boot

使用方法setup()loop()功能 - 打开Autostart Arduino setup and loop on boot

由于 Arduino 库使用了 C++ 特性,您需要将一些文件扩展名从 .c .c++替换为 .c++ .cpp:

在主文件夹中,将文件main.c重命名为main.cpp。

在主文件夹中打开CMakeLists.txt文件,并按照以下说明将main.c更改为main.cpp 。

方案一:使用 Arduino 的 setup() 和 loop() 函数#

你的 main.cpp 文件应该像其他草图文件一样格式化。别忘了包含Arduino.h.

main.cpp
#include "Arduino.h"
void setup(){
Serial.begin(115200);
while(!Serial){
; // wait for serial port to connect
}
}
void loop(){
Serial.println("loop");
delay(1000);
}

选项 2. 使用 ESP-IDF appmain()#

你需要在 main.cpp 中实现app_main()并调用initArduino();它。

请注意,在这种情况下不会调用 setup()loop() 函数。此外,这app_main()是一个单次执行的普通函数,因此如果您需要像 Arduino 那样的无限循环,请将其放在其他地方。

main.cpp
#include "Arduino.h"
extern "C" void app_main()
{
initArduino();
// Arduino-like setup()
Serial.begin(115200);
while(!Serial){
; // wait for serial port to connect
}
// Arduino-like loop()
while(true){
Serial.println("loop");
}
// WARNING: if program reaches end of function app_main() the MCU will restart.
}

最终结果#

vscode esp-idf开发环境安装及arduino移植
https://www.mintlab.top/posts/esp-idf开发环境及arduino移植/
作者
Mint
发布于
2026-03-08
许可协议
CC BY-NC-SA 4.0