• 【ESP-IDF篇】搭建ESP-IDF软件开发环境,包括手动命令行和VSCode两种方式


    忘记过去,超越自己

    • ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️
    • ❤️ 本篇创建记录 2023-09-27 ❤️
    • ❤️ 本篇更新记录 2023-09-27 ❤️
    • 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝
    • 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!
    • 🔥 Arduino ESP8266教程累计帮助过超过1W+同学入门学习硬件网络编程,入选过选修课程,刊登过无线电杂志 🔥零基础从入门到熟悉Arduino平台下开发ESP8266,同时会涉及网络编程知识。专栏文章累计超过60篇,分为基础篇、网络篇、应用篇、高级篇,涵盖ESP8266大部分开发技巧。

    快速导航
    单片机菜鸟的博客快速索引(快速找到你要的)

    如果觉得有用,麻烦点赞收藏,您的支持是博主创作的动力。

    1. 前言

    ESP-IDF 是乐鑫主推的ESP32的开发框架,旨在协助用户快速开发物联网 (IoT) 应用,可满足用户对 Wi-Fi、蓝牙、低功耗等方面的要求。

    Espressif IoT Development Framework
    https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/get-started/index.html

    如需在 ESP32 上使用 ESP-IDF,请安装以下软件:

    • 设置 工具链,用于编译 ESP32 代码;
    • 编译构建工具 —— CMake 和 Ninja 编译构建工具,用于编译 ESP32 应用程序;
    • 获取 ESP-IDF 软件开发框架。该框架已经基本包含 ESP32 使用的 API(软件库和源代码)和运行 工具链 的脚本;
      在这里插入图片描述
      软件开发的搭建有三种选择:
    • 手动安装工具链,命令行方式(尝试,本篇介绍)
    • 使用Eclipse插件,IDE方式(自行尝试)
    • 使用VSCode插件,IDE方式(推荐,本篇介绍)

    2. 手动安装工具链,命令行方式(windows)

    2.1 下载离线安装器

    进入乐鑫 ESP-IDF Windows Installer Download 下载页面,选择离线版本工具(网络原因,安装过程中使用github下载会出问题)。
    在这里插入图片描述
    默默等待下载一下。
    在这里插入图片描述

    2.2 使用安装器进行安装

    下载完成之后双击,选择简体中文,准备开始安装。

    • 同意协议,下一步
      在这里插入图片描述
    • 等待安装前系统检查
      在这里插入图片描述
    • 选择目标位置,这里我直接默认了,也可以修改为其他路径
      在这里插入图片描述
    • 选择组件,默认或者全选即可
      在这里插入图片描述
    • 准备安装前的确认
      在这里插入图片描述
      这里版本是 5.1.1 idf版本。
    • 接下来,静静等待一小会
      在这里插入图片描述
    • 安装完成
      在这里插入图片描述
      点击完成就会有两个弹窗。
      在这里插入图片描述
      在这里插入图片描述
      同时,电脑桌面会多两个快捷方式。
      在这里插入图片描述

    2.3 认识一下目录文件

    在这里插入图片描述
    frameworks包含了esp-idf版本,tools下面包含了各种编译工具,还有一个py环境工具。

    在这里插入图片描述
    这里我们会比较关注examples和components目录,也是重点学习的地方。

    • components,看起来就是库
      在这里插入图片描述
    • example,案例参考代码
      在这里插入图片描述

    2.4 helloworld工程示例

    既然我们这里用到命令行工具来编译,我们先了解一下。
    在这里插入图片描述
    比较重要就是设置了Bin目录,也就是我们常说的工具。

    2.4.1 进入到工程目录

    在安装目录C:\Espressif\中打开以下文件夹C:\Espressif\frameworks\esp-idf-v5.1.1\examples\get-started

    在这里插入图片描述

    2.4.2 配置目标芯片

    因为我这里是烧录到NodeMcu ESP32,输入命令:

    idf.py set-target esp32
    在这里插入图片描述

    2.4.3 编译工程

    输入命令:

    idf.py build
    运行命令可以编译应用程序和所有 ESP-IDF 组件,接着生成 bootloader、分区表和应用程序二进制文件:
    等待一小会,先喝个水!!!
    在这里插入图片描述
    编译完成后会在项目文件夹下生成一个build文件夹,所有的bin文件和BootLoader也会在该目录下
    在这里插入图片描述

    2.4.4 烧录固件

    插上硬件,看看是哪个COM口。
    使用命令,将刚刚生成的二进制文件 (bootloader.bin, partition-table.bin 和 hello-world.bin) 烧录到开发板:

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

    • PORT是端口号,可以在【设备管理器】中看到,这里是COM3;
    • BAUD是波特率,默认波特率为 460800;

    烧录命令为:

    idf.py -p COM3 flash
    在这里插入图片描述

    2.4.5 查看串口信息

    idf.py -p PORT monitor

    • PORT是端口号,可以在【设备管理器】中看到,这里是COM3;

    所以,输入命令:

    idf.py -p COM3 monitor
    在这里插入图片描述
    顺便也看看hello_world的代码是啥?

    /*
     * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
     *
     * SPDX-License-Identifier: CC0-1.0
     */
    
    #include 
    #include 
    #include "sdkconfig.h"
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"
    #include "esp_chip_info.h"
    #include "esp_flash.h"
    
    void app_main(void)
    {
        printf("Hello world!\n");
    
        /* Print chip information */
        esp_chip_info_t chip_info;
        uint32_t flash_size;
        esp_chip_info(&chip_info);
        printf("This is %s chip with %d CPU core(s), %s%s%s%s, ",
               CONFIG_IDF_TARGET,
               chip_info.cores,
               (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "",
               (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "",
               (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "",
               (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : "");
    
        unsigned major_rev = chip_info.revision / 100;
        unsigned minor_rev = chip_info.revision % 100;
        printf("silicon revision v%d.%d, ", major_rev, minor_rev);
        if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) {
            printf("Get flash size failed");
            return;
        }
    
        printf("%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024),
               (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
    
        printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size());
    
        for (int i = 10; i >= 0; i--) {
            printf("Restarting in %d seconds...\n", i);
            vTaskDelay(1000 / portTICK_PERIOD_MS);
        }
        printf("Restarting now.\n");
        fflush(stdout);
        esp_restart();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    通过对比日志,说明正常运行起来!完美!
    如果想停止串口监控,直接键盘 ctrl + ] 即可。

    3. 使用VSCode插件,IDE方式

    上面方式是通过命令行配置,但是大多数人更喜欢vscode这种图形化IDE开发。那么,也来配置一下。

    3.1 安装IDF扩展

    在这里插入图片描述

    3.2 打开ESP-IDF扩展设置

    按下CTRL+shift+P打开设置搜索,输入esp-idf configure esp-idf extension

    在这里插入图片描述

    3.3 开始安装工具链

    为了和命令行区分,这里单独用了独立目录。
    在这里插入图片描述
    默默等待安装!!!先安装idf框架再安装idf工具。。。。
    在这里插入图片描述
    直到成功!
    在这里插入图片描述
    顺便也看看安装目录!
    在这里插入图片描述
    在这里插入图片描述
    整体上和刚刚通过手动安装方式大同小异。

    3.4 helloworld工程示例

    3.4.1 找到工程,用vscode打开

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3.4.2 编译工程

    每个项目第一次编译时间会比较长,因为会把所有的源文件进行编译,后面在编译的话就算是差量化编译了,相比之下编译速度非常快。
    在这里插入图片描述
    ps:记得选择一下目标板子。

    3.4.3 烧录固件

    在这里插入图片描述

    3.4.4 查看串口信息

    在这里插入图片描述
    完美!

    3.4.5 解决头文件include无法识别问题

    在这里插入图片描述
    虽然编译烧录下载都没有问题,但是作为一个强迫症,这个问题要解决。

    解决方法:

    • 按下CTRL+shift+P打开设置搜索,输入>esp-idf add vsc打开ESP-IDF扩展设置。点击之后就会发现在项目根目录下创建一个.vscode文件夹,该命令会将所有的头文件路径都包含在该c_cpp_properties.json配置文件中
      在这里插入图片描述
    {
        "configurations": [
            {
                "name": "ESP-IDF",
                "compilerPath": "e:\\esp-idf-tools\\tools\\xtensa-esp32-elf\\esp-12.2.0_20230208\\xtensa-esp32-elf\\bin\\xtensa-esp32-elf-gcc.exe",
                "includePath": [
                    "${config:idf.espIdfPath}/components/**",
                    "${config:idf.espIdfPathWin}/components/**",
                    "${config:idf.espAdfPath}/components/**",
                    "${config:idf.espAdfPathWin}/components/**",
                    "${workspaceFolder}/**"
                ],
                "browse": {
                    "path": [
                        "${config:idf.espIdfPath}/components",
                        "${config:idf.espIdfPathWin}/components",
                        "${config:idf.espAdfPath}/components/**",
                        "${config:idf.espAdfPathWin}/components/**",
                        "${workspaceFolder}"
                    ],
                    "limitSymbolsToIncludedHeaders": false
                }
            }
        ],
        "version": 4
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    这下子就真的完美了!

    3.5 新建项目

    接下来试试我们自己创建一个新项目是否可行?

    • 按下CTRL+shift+P打开设置搜索,输入>esp-idf new project打开ESP-IDF扩展设置
      在这里插入图片描述
    • 给项目命名,选择目录及开发板类型、端口
      在这里插入图片描述
    • 选择一个模板创建项目
      在这里插入图片描述
    • 打开创建好的项目
      在这里插入图片描述
    • 我们稍微修改一下打印内容
    /*
     * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
     *
     * SPDX-License-Identifier: CC0-1.0
     */
    
    #include 
    #include 
    #include "sdkconfig.h"
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"
    #include "esp_chip_info.h"
    #include "esp_flash.h"
    
    void app_main(void)
    {
        printf("Hello world!\n");
    
        /* Print chip information */
        esp_chip_info_t chip_info;
        uint32_t flash_size;
        esp_chip_info(&chip_info);
        printf("Hello world! This is My First idf code! This is %s chip with %d CPU core(s), %s%s%s%s, ",
               CONFIG_IDF_TARGET,
               chip_info.cores,
               (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "",
               (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "",
               (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "",
               (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : "");
    
        unsigned major_rev = chip_info.revision / 100;
        unsigned minor_rev = chip_info.revision % 100;
        printf("silicon revision v%d.%d, ", major_rev, minor_rev);
        if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) {
            printf("Get flash size failed");
            return;
        }
    
        printf("%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024),
               (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
    
        printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size());
    
        for (int i = 10; i >= 0; i--) {
            printf("Restarting in %d seconds...\n", i);
            vTaskDelay(1000 / portTICK_PERIOD_MS);
        }
        printf("Restarting now.\n");
        fflush(stdout);
        esp_restart();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 按照3.4进行编译烧录查看串口信息!
      在这里插入图片描述
      完美!这个也生效了!
      到此,整个搭建过程就结束了!希望大家都能10分钟搭建完毕!
  • 相关阅读:
    Bioinformatics202207 | CD-MVGNN+:基于交叉依赖图神经网络的分子性质预测
    140.【鸿蒙OS开发-01】
    [C++]C风格、C++风格和C++11特性的线程池
    HBase的简单学习二
    华为、思科选哪个更有前途?
    Java 实现RSA 加解密算法 公钥加密传参
    在更一般意义上验算移位距离和假设
    项目运行状况不断,怎么办?看看企业级监控项目Skywalking吧
    缓存的力量:提升API性能和可扩展性
    迈巴赫S480升级电动后门 手势控制开关
  • 原文地址:https://blog.csdn.net/dpjcn1990/article/details/133349474