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

news2024/11/23 16:54:07

忘记过去,超越自己

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

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

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

文章目录

    • 1. 前言
    • 2. 手动安装工具链,命令行方式(windows)
      • 2.1 下载离线安装器
      • 2.2 使用安装器进行安装
      • 2.3 认识一下目录文件
      • 2.4 helloworld工程示例
        • 2.4.1 进入到工程目录
        • 2.4.2 配置目标芯片
        • 2.4.3 编译工程
        • 2.4.4 烧录固件
        • 2.4.5 查看串口信息
    • 3. 使用VSCode插件,IDE方式
      • 3.1 安装IDF扩展
      • 3.2 打开ESP-IDF扩展设置
      • 3.3 开始安装工具链
      • 3.4 helloworld工程示例
        • 3.4.1 找到工程,用vscode打开
        • 3.4.2 编译工程
        • 3.4.3 烧录固件
        • 3.4.4 查看串口信息
        • 3.4.5 解决头文件include无法识别问题
      • 3.5 新建项目

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 <stdio.h>
#include <inttypes.h>
#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();
}

通过对比日志,说明正常运行起来!完美!
如果想停止串口监控,直接键盘 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
}

这下子就真的完美了!

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 <stdio.h>
#include <inttypes.h>
#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();
}

  • 按照3.4进行编译烧录查看串口信息!
    在这里插入图片描述
    完美!这个也生效了!
    到此,整个搭建过程就结束了!希望大家都能10分钟搭建完毕!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1045709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三相无感正弦波 BLDC 驱动MS39539/MS39535

产品简述 MS39539 和 MS39535 是无感三相直流电机驱动芯片&#xff0c;采用 正弦波驱动方式&#xff0c;具有低噪声及低震动的特点。 MS39539 和 MS39535 特别针对电机启动进行了优化&#xff0c;相比 MS39549 和 MS39545 适用于反向电动势更小的电机。 有一个速…

《数据结构、算法与应用C++语言描述》-栈的应用-列车车厢重排问题

列车车厢重排问题 一列货运列车有 n 节车厢&#xff0c;每节车厢要停靠在不同的车站。假设 n个车站从 1 到n 编号&#xff0c;而且货运列车按照从n到1的顺序经过车站。车厢的编号与它们要停靠的车站编号相同。为了便于从列车上卸掉相应的车厢&#xff0c;必须按照从前至后、从…

c语言练习68:文件的随机读写

文件的随机读写 fseek fseek 根据⽂件指针的位置和偏移量来定位⽂件指针。 1 int fseek ( FILE * stream, long int offset, int origin ); 例子&#xff1a; /* fseek example */ #include <stdio.h> int main () {FILE * pFile;pFile fopen ( "example.txt&…

接口测试的总结文档

接口测试的总结文档 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1a;主要介绍为什…

Java流的体系结构(一)

文章目录 一、文件读写操作FileReader和FileWriter1.main()2.FileReader1.说明&#xff1a;2.代码案例 3.对read()操作升级&#xff1a;使用read的重载方法4.FileWriter的使用1.说明2.代码 4.FileReader和FileWriter综合使用 二、使用步骤1.引入库 二、测试FileInputStream和Fi…

新型信息基础设施IP追溯:保护隐私与网络安全的平衡

随着信息技术的飞速发展&#xff0c;新型信息基础设施在全球范围内日益普及&#xff0c;互联网已经成为我们社会和经济生活中不可或缺的一部分。然而&#xff0c;随着网络使用的增加&#xff0c;隐私和网络安全问题也引发了广泛关注。在这个背景下&#xff0c;IP&#xff08;In…

XML文件反序列化读取

原始XML文件 <?xml version"1.0" encoding"utf-8" ?> <School headmaster"王校长"><Grade grade"12" teacher"张老师"><Student name"小米" age"18"/><Student name&quo…

26048-2010 易切削铜合金线材 学习记录

声明 本文是学习GB-T 26048-2010 易切削铜合金线材. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了易切削铜合金线材的产品分类、技术要求、试验方法、检验规则及标志、包装、运输、贮 存和合同(或订货单)内容等。 本标准适用…

国庆中秋特辑(四)MySQL如何性能调优?上篇

MySQL 性能优化是一项关键的任务&#xff0c;可以提高数据库的运行速度和效率。以下是一些优化方法&#xff0c;包括具体代码和详细优化方案。 接下来详细介绍&#xff0c;共有10点&#xff0c;先介绍5点&#xff0c;下次再介绍其他5点 1. 优化 SQL 语句 1.1 创建索引 创建…

【Axure高保真原型】3D圆柱图_中继器版

今天和大家分享3D圆柱图_中继器版的原型模板&#xff0c;图表在中继器表格里填写具体的数据&#xff0c;调整坐标系后&#xff0c;就可以根据表格数据自动生成对应高度的圆柱图&#xff0c;鼠标移入时&#xff0c;可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…

了解汽车ecu组成

常用ecu框架组成&#xff1a; BCM(body control module)-车身控制模块: 如英飞凌tc265芯片&#xff1a; 车身控制单元&#xff08;BCM&#xff09;适合应用于12V和24V两种电压工作环境&#xff0c;可用于轿车、大客车和商用车的车身控制。输入模块通过采集电路采集各路开关量和…

SAP和APS系统订单BOM核对(SAP配置BOM攻略九)

配置订单BOM因为要考虑历史ECN、特征语法、BOM语法&#xff0c;是最复杂的一个算法结果&#xff0c;为了摆脱这种被动的场景&#xff0c;博主开发了一个被动核对数据的程序来保障数据质量。 今天是APS系统上线的第三天&#xff0c;我们的核对程序在昨天上线&#xff0c;面对大量…

nvm及node安装与配置

一、nvm安装 nvm&#xff08;Node Version Manager&#xff09;是一个用来管理node版本的工具。我们之所以需要使用node&#xff0c;是因为我们需要使用node中的npm(Node Package Manager)&#xff0c;使用npm的目的是为了能够方便的管理一些前端开发的包&#xff01;nvm的安装…

【Vue】数据表格增删改查与表单验证

目录 一、CRUD实现 1.1 后台CRUD编写 1.2 配置访问路径 1.3 前端编写&#xff08;及窗口&#xff09; 1.4 增删改查实现 1.4.1 新增示例 1.4.2 修改示例 1.4.3 删除示例 二、表单验证 2.1 设置表单验证属性 2.2 自定义验证规则 2.3 使用规则 2.4 效果演示 一、CRU…

通过docker-compose部署项目时遇到的问题

问题起因 最近两天在使用docker把项目的jar包打成镜像&#xff0c;Dockerfile文件的内容如下 FROM java:8 ADD mhxysy-0.0.1-SNAPSHOT.jar mhxysy.jar EXPOSE 8080 CMD java ‐jar mhxysy.jar 但是通过docker运行镜像的时候报错了 Error: Could not find or load main clas…

Midjourney 生成油画技巧

基本 prompt oil painting, a cute corgi dog surrounded with colorful flowers技法 Pointillism 点描绘法 笔刷比较细&#xff0c;图像更精细 oil painting, a cute corgi dog surrounded with colorful flowers, pontillismImpasto 厚涂绘法 笔刷比较粗&#xff0c;图像…

全球与中国管线隔热材料市场:增长趋势、竞争格局与前景展望

管线隔热材料是一种重要的工程材料&#xff0c;主要用于减少管道在传输过程中的热量损失。这种材料在许多领域都有广泛的应用&#xff0c;包括石油、化工、电力等。在这些领域中&#xff0c;管线隔热材料能够有效地减少能源的消耗和浪费&#xff0c;提高管道的运行效率。在选择…

基于C++ Qt的积分抽奖系统源码,实现了用户注册、商品购买、积分抽奖等功能

基本介绍 完整代码下载&#xff1a;基于C Qt的积分抽奖系统 这个是我大二上学期的课程作业仓库&#xff0c; 目的是实现一个超市积分抽奖系统&#xff0c; 基本的功能是实现一个能够在超市购物的同时进行抽奖的积分系统&#xff0c; 主要用到的技术栈就是Qt和c&#xff0c; 叠…

基于AI算法+视频监控技术的智慧幼儿园解决方案

在当今社会&#xff0c;为了孩子的健康启蒙教育&#xff0c;很多家长都会选择将孩子托付给幼儿园管理&#xff0c;但是&#xff0c;幼儿有着年龄小、难控制、易发生突发情况等特点&#xff0c;那么&#xff0c;如何能最大限度的保障幼儿在学校的安全呢&#xff1f;TSINGSEE青犀…

redis实战-redis实现好友关注消息推送

关注和取消关注 在查看笔记详情时&#xff0c;会自动发送请求&#xff0c;调用接口来检查当前用户是否已经关注了笔记作者&#xff0c;我们要实现这两个接口 需求&#xff1a;基于该表数据结构&#xff0c;实现两个接口&#xff1a; 关注和取关接口 判断是否关注的接口 关注…