esp-idf 的 vscode 编译环境搭建

手动搭建 esp32 的 vscode 开发环境,虽然 vscode 有 esp-idf 的插件,但是有些卡顿,用起来没有终端灵活

v4.4 官方文档:https://docs.espressif.com/projects/esp-idf/zh_CN/v4.4

🌐 安装 vscode、python3、git

🔽 获取 esp-idf

  • v4.4
git clone -b v4.4 --recursive https://github.com/espressif/esp-idf.git
  • 如果需要切换版本,可以使用以下命令,避免重新下载, -b vx.x.x 代表版本号的选择
git fetch
git checkout vx.x.x
git submodule update --init --recursive

🔑 安装 esp-idf

如果不想安装到C盘,可以安装前设置 IDF 工具路径环境变量IDF_TOOLS_PATH(每次都重新设置), powershell 可以通过profile.ps1文件来实现自动加载

  • powershell
$env:IDF_TOOLS_PATH="F:\MyEnv\esp_env\idf_env"
  • cmd
set IDF_TOOLS_PATH=F:\MyEnv\esp_env\idf_env

powershell如果不能运行 .ps1 脚本:管理员运行命令 set-ExecutionPolicy RemoteSigned 即可。

  • 运行 install.ps1install.bat 安装即可

    • powershell
    ./install.ps1
    • cmd
    ./install.bat

-

🔨 调用 esp-idf ( 绝对路径 )

  • powershell
F:\MyEnv\esp_env\esp-idf-v4.4\export.ps1
  • cmd
F:\MyEnv\esp_env\esp-idf-v4.4\export.bat
  • 写一个自定义的启动脚本 espidf.ps1
$env:IDF_TOOLS_PATH="F:\MyEnv\esp_env\idf_env"

F:\MyEnv\esp_env\esp-idf-v4.4\export.ps1
  • 调用结果

-

  • 编译一个工程来测试
cd $env:IDF_PATH/examples/get-started/hello_world
idf.py build

-

💎 vscode 调用 ( 编写工作区文件 )

🔱 默认终端

  • 在工作区文件 Proj.code-workspace 添加一个自定义终端
{
  "terminal.integrated.profiles.windows": {
      "ESP-IDF": {
          "source": "PowerShell",
          "icon": "terminal",
          "args": [
              "-noe",
              "-nologo",
              "espidf.ps1"
          ]
      }
  }
}
  • 设置为默认终端
{
  "terminal.integrated.defaultProfile.windows": "ESP-IDF",
}

💥 自动补全

由于 esp-idf 使用的编译器属于 gcc 类编译器,在 vscode 中只需配置编译器路径、工作区目录、和 cmake 导出的 compile_commands.json 即可

根据 esp-idf 编译器路径可知编译器位于 $env:IDF_TOOLS_PATH\编译器名字\版本\编译器名字\编译器名字-gcc.exe

  • gcc 路径 ( 切换编译器时只需切换 C_Cpp.default.compilerPath 配置项即可 )

    {
      "idf.path"  : "F:/MyEnv/esp_env/esp-idf-v4.4",
      "idf.tools" : "F:/MyEnv/esp_env/idf_env/tools",
    
      "idf.gcc.varsion"   : "esp-2021r1-8.4.0",
      "idf.patch.version" : "esp-2021r2-patch2-8.4.0",
    
      "idf.tools.esp32"   : "${config:idf.tools}/xtensa-esp32-elf",
      "idf.tools.esp32rv" : "${config:idf.tools}/riscv32-esp-elf",
      "idf.tools.esp32s2" : "${config:idf.tools}/xtensa-esp32s2-elf",
      "idf.tools.esp32s3" : "${config:idf.tools}/xtensa-esp32s3-elf",
    
      "idf.gcc.esp32"   : "${config:idf.tools.esp32}/${config:idf.patch.version}/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc.exe",
      "idf.gcc.esp32rv" : "${config:idf.tools.esp32rv}/${config:idf.patch.version}/riscv32-esp-elf/bin/riscv32-esp-elf-gcc.exe",
      "idf.gcc.esp32s2" : "${config:idf.tools.esp32s2}/${config:idf.patch.version}/xtensa-esp32s2-elf/bin/xtensa-esp32s2-elf-gcc.exe",
      "idf.gcc.esp32s3" : "${config:idf.tools.esp32s3}/${config:idf.patch.version}/xtensa-esp32s3-elf/bin/xtensa-esp32s3-elf-gcc.exe",
    
      "C_Cpp.default.compilerPath": "${config:idf.gcc.esp32}",
    }
  • cmake 导出文件

    {
      "C_Cpp.default.compileCommands": "${workspaceFolder}/build/compile_commands.json",
    }
  • 工作区目录

    {
      "C_Cpp.default.includePath": [
          "${workspaceFolder}/**"
      ],
    }
  • Proj.code-workspace 总配置

{
    "folders": [
        {
            "path": "."
        }
    ],
    "settings": {
        /* 文件排除 */
        "files.exclude": {
            // 文件夹
            "**/.settings": true,
            "**/Debug": true,
            "**/Objects": true,
            "**/objects": true,
            "**/Listings": true,
            "**/listings": true,
            "**/Output": true,
            "**/output": true,
            // 文件
            "**/*.map":true,
            "**/.config*":true,
            "**/.project*":true,
            "**/.cproject*":true,
        },
        /* 编码 */
        "files.encoding": "utf8",
        /* 字体 */
        "editor.fontFamily": "Consolas, OPPOSans",
        /* 自定义 Shell */
        "terminal.integrated.profiles.windows": {
            "ESP-IDF": {
                "source": "PowerShell",
                "icon": "terminal",
                "args": [
                    "-noe",
                    "-nologo",
                    "espidf.ps1"
                ]
            }
        },
        "C_Cpp.errorSquiggles": "Disabled",
        /* 默认 Shell */
        "terminal.integrated.defaultProfile.windows": "ESP-IDF",
        /* 代码风格 */
        "C_Cpp.clang_format_style": "{ BasedOnStyle: Google, IndentWidth: 4 }",
        /* 补全模式 */
        "C_Cpp.default.intelliSenseMode": "gcc-x86",
        /* c/cpp 标准 */
        "C_Cpp.default.cppStandard": "c++14",
        "C_Cpp.default.cStandard": "c99",
        /* c/cpp 宏 */
        "C_Cpp.default.defines": [],
        /*//!自定义编译器路径 ( 实现补全时 gcc 类编译器只需指定编译器路径与工程目录的包含 ) */

        "idf.path"  : "F:/MyEnv/esp_env/esp-idf-v4.4",
        "idf.tools" : "F:/MyEnv/esp_env/idf_env/tools",

        "idf.gcc.varsion"   : "esp-2021r1-8.4.0",
        "idf.patch.version" : "esp-2021r2-patch2-8.4.0",

        "idf.tools.esp32"   : "${config:idf.tools}/xtensa-esp32-elf",
        "idf.tools.esp32rv" : "${config:idf.tools}/riscv32-esp-elf",
        "idf.tools.esp32s2" : "${config:idf.tools}/xtensa-esp32s2-elf",
        "idf.tools.esp32s3" : "${config:idf.tools}/xtensa-esp32s3-elf",

        "idf.gcc.esp32"   : "${config:idf.tools.esp32}/${config:idf.patch.version}/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc.exe",
        "idf.gcc.esp32rv" : "${config:idf.tools.esp32rv}/${config:idf.patch.version}/riscv32-esp-elf/bin/riscv32-esp-elf-gcc.exe",
        "idf.gcc.esp32s2" : "${config:idf.tools.esp32s2}/${config:idf.patch.version}/xtensa-esp32s2-elf/bin/xtensa-esp32s2-elf-gcc.exe",
        "idf.gcc.esp32s3" : "${config:idf.tools.esp32s3}/${config:idf.patch.version}/xtensa-esp32s3-elf/bin/xtensa-esp32s3-elf-gcc.exe",

        "C_Cpp.default.compilerPath": "${config:idf.gcc.esp32}",
        /* c/cpp 包含 */
        "C_Cpp.default.includePath": [
            "${workspaceFolder}/**"
        ],
        "C_Cpp.default.forcedInclude": [

        ],
        "C_Cpp.default.compileCommands": "${workspaceFolder}/build/compile_commands.json",
    },
}
  • 配置完成的样子

-

编写一键编译脚本

  • build.ps1

    echo ""
    echo "idf.py.exe build"
    echo ""
    
    idf.py.exe build
    
    echo ""
    echo "idf.py.exe --port com24 --baud 921600 flash"
    echo ""
    
    idf.py.exe --port com24 --baud 921600 flash
    
    echo ""
    echo "idf.py.exe --port com24 --monitor-baud 921600 monitor"
    echo ""
    
    idf.py.exe --port com24 --baud 921600 monitor
  • 调用即可

-