
NOTE之所以写这篇博客, 是因为乐鑫做的实在是太垃圾了.
手动安装VScode插件识别不到, 默认安装版本太高arduino不适配, Vscode启动安装管理器安装居然要在vscode上按一下回车确认我的github用户名???
我瞪了半天安装管理器, 没发现vsc命令窗口上有个超小的输入框确认, 没确认就不开始下载, 等了半天自己居然崩溃了?!
我tm整整装了四遍, 等进度条的时候写下了这篇博客
esp-idf环境安装
NOTE手动安装或使用
source export.sh会导致idf插件无法识别虚拟环境两种方案原生无法共存, 所以哪个都行, 后文有解决方案.
方案A: 通过VSCode插件安装(通过官方管理器)
如果你不使用VSCode插件, 参考在 Linux 上安装 ESP-IDF 及工具链直接下载管理器安装
vscode安装扩展ESP-IDF, 然后跟随欢迎页面提示安装,.
或者在vsc命令面板输入ESP-IDF: Open ESP-IDF Install Manager安装.

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

方案B: 手动安装
参考Linux 和 macOS 平台工具链的标准设置(已过时)
以下是基于Ubuntu 和 Debian的安装方案
1.安装依赖(已安装的会自动跳过)
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-02. 从Github克隆esp-idf
mkdir -p ~/espcd ~/espgit clone -b v5.1.4 --single-branch --recursive https://github.com/espressif/esp-idf.gitIMPORTANT
--recursive必须要加, 因为这会下载所有的子仓库
-b v5.1.4必须要加, 截止2026.3 esp-idf已经更新到v6.1, 但arduino组件仅支持v5.x版本的esp-idf
3. 安装所需芯片的工具包
cd ~/esp/esp-idf./install.sh all # 安装所有芯片
./install.sh esp32,esp32s2 # 安装指定的几个芯片NOTE工具包默认安装到
~/.espressif定制安装目录参见前文
4. 环境配置
vim ~/.bashrc在.bashrc中加入以下内容, 保存后别忘了source ~./bashrc使配置生效
export IDF_PATH="$HOME/esp/esp-idf/:$PATH"# 设置一个别名,alias get_idf='. $IDF_PATH/export.sh'请在需要运行 ESP-IDF 的终端窗口运行以下命令:
. $HOME/esp/esp-idf/export.sh或者直接运行
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
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/venv97c97+ 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 组件添加到项目中,请在项目目录中运行以下命令:
idf.py add-dependency "espressif/arduino-esp32^3.3.7"或者,可以使用 Arduino 组件从模板创建一个新项目:
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.
#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 那样的无限循环,请将其放在其他地方。
#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.}最终结果

