ESP-IDF + Vscode ESP32 开发环境搭建以及开发入门_esp32 idf vscode-程序员宅基地

技术标签: ESP32  git  vscode  物联网 ESP32  IDF  ESP-IDF  

ESP-IDF + Vscode ESP32 开发环境搭建以及开发入门

创作不易,转载请注明出处!

Tips: 虽然笔者采用的是Linux开发环境,但是Windows开发环境的亦可阅读,所述内容与系统关联性不大,尤其是后文介绍的如何将自己的文件加入到工程,解决头文件找不到等问题,无论哪种系统均会存在。

Tips: 最近更新了一篇windows下搭建的,大家可以两篇结合起来参考学习 (点击跳转)ESP-IDF + (PowerShell / Vscode) ESP32开发环境搭建(windows)(点击跳转)

1. 前言

关于ESP32的开关环境搭建,其实有很多种,其中如果使用 Vscode 的话,通常大家会直接使用vscode里面的Espressif IDF插件,然后通过插件安装对应的配置工具搭建开发环境,使用此方法确实比较方便,操作也比较简单,但是此方法存在一定的缺陷,使用此方法搭建的环境不方便维护,ESP-IDF的版本升级切换不方便

使用 Espressif IDF 安装环境,在 ESP-IDF 目录下除了存放了 ESP-IDF 工具以外,编译工具链也丢在了这个里面(在IDF目录下使用git查看执行 git status 即可发现),两种文件混合在了一起,会导致无法单独维护,当想要升级ESP-IDF版本的时候,就必须要把环境全部重新安装一遍,而安装的时候下载又特别慢,所以这个过程会变为一个非常麻烦的事情

本文采用的方法称之为:ESP-IDF + Vscode开发方法,此方法成功的将 ESP-IDF 工具与编译工具分离,因此可以单独维护,关于ESP-IDF的版本切换可直接使用git切换即可,十分的方便,同时编辑器还是采用Vscode,编写代码还是很方便

此外,本文除了阐述如何搭建开发环境之外,还记载了博主关于ESP32开发过程中的相关笔记,主要介绍了如何采用ESP32的开发风格开始搭建我们自己的工程进行开发。

tips: 推荐使用最新发布版本的 ESP-IDF,最新的修复了许多有关问题!!! 踩过的坑就不要踩了 T…T

2. 下载开发工具

  1. 下载 IDF 工具
    mkdir -p ~/esp
    cd ~/esp
    git clone --recursive https://github.com/espressif/esp-idf.git
    
  2. 下载 Vscode 软件
  3. 安装Vscode插件 Espressif IDF,注意这里下载好就行了,不要去配置
    在这里插入图片描述

3. 配置工具

  1. 配置 IDF 工具,为所有ESP32设备环境
    cd ~/esp/esp-idf
    ./install.sh
    
  2. 设置环境变量
    cd ~/esp/esp-idf
    ./export.sh
    
  3. 但是每个terminator窗口都得像第2步一样运行下export.sh指令,对应的命令窗口才有相应的idf环境变量,非常麻烦,因此需要让其智能一点,在 ~/.bashrc 里面加一个宏命令
    • 运行vi ~/.bashrc,打开 ~/.bashrc ,在最后添加一行命令 alias get_idf='. $HOME/esp/esp-idf/export.sh'
    • 之后每次打开一个新terminator窗口,只需要输入 get_idf 命令,即可给对应的 terminator 添加 IDF 的环境变量在这里插入图片描述

4. 创建工程

  1. 使用 idf 工具创建工程
    在这里插入图片描述

  2. 进入工程目录,设置目标设备,如开发esp32,则输入idf.py set-target esp32
    在这里插入图片描述

  3. 使用vscode打开编辑
    在这里插入图片描述

5. 解决vscode找不到头文件,波浪线警告

问题描述:

默认使用IDF创建工程之后,可使用 idf.py build编译工程,但是使用vscode打开工程,添加头文件之后,vscode会提示找不到头文件,以及相应宏、函数无法跳转,这是由于vscode没有配置导致
在这里插入图片描述

解决方案:

  1. 安装 Espressif IDF 插件
    在这里插入图片描述
  2. 进入IDF目录,重新运行 install.sh 脚本,此脚本会配置 Espressif IDF 插件(建议这么操作,因为我运行 ./install.sh 的时候插件是以及装好了的)
    cd ~/esp/esp-idf
    ./install.sh
    
  3. 使用vscode打开相应工程, 注意vscode打开的是对应的工程路径,而不是包含多个工程的路径
  4. 按快捷键 Ctrl + Shift + P 打开命令行, 找到 ESP-IDF:Add vscode configuration folder,点击一下即可自动生成对应的vscode配置文件
    在这里插入图片描述
  5. 点击之后可以看到工程目录下多了一个 .vscode 目录,并产生了相应的文件,其中c_cpp_properties.json 内描述的就是对应的头文件路径
    在这里插入图片描述
  6. 之后可以看到波浪线警告消失了,对应的文件也可以通过 ctrl+鼠标左键 打开在这里插入图片描述

6. 添加自己的组件

说明:本博客ESP-IDF版本 V5.0

6.1 组件说明

当我们开始真正使用ESP32进行开发的时候,我们肯定期望将我们的程序按照各自的功能,分解成各自的 .c 文件,这样方便编辑、管理和移植,如GPIO的驱动在单独编写的 drv_gpio.c 内实现,那么针对ESP32如何实现类似的功能呢?

之前编写 stm32 的时候有IDE的支持,IDE自动帮我们完成,但是这里Vscode仅仅只是一个代码编辑器,关于代码的编译,esp32采用的是Cmake工具来完成, 因此我们需要补充相关的cmake文件来实现。

ESP32的组件分为几大类,均记录在cmake的变量COMPONENT_DIRS内:

  • ESP-IDF内部组件 IDF_PATH/components
  • 扩展组件 EXTRA_COMPONENT_DIRS
  • 项目组件 PROJECT_DIR/components

ESP-IDF内部组件:也就是官方提供的组件,在ESP-IDF目录内
扩展组件:工程目录一般长这样

- myProject/
             - CMakeLists.txt
             - sdkconfig
             - components/ - component1/ - CMakeLists.txt
                                         - Kconfig
                                         - src1.c
                           - component2/ - CMakeLists.txt
                                         - Kconfig
                                         - src1.c
                                         - include/ - component2.h
             - main/       - CMakeLists.txt
                           - src1.c
                           - src2.c

             - build/

官方文档是这么解释的:可选的 “components” 目录中包含了项目的部分自定义组件,并不是每个项目都需要这种自定义组件,但它有助于构建可复用的代码或者导入第三方(不属于 ESP-IDF)的组件。或者,您也可以在顶层 CMakeLists.txt 中设置 EXTRA_COMPONENT_DIRS 变量以查找其他指定位置处的组件。

因此扩展组件是我们自行添加的目录,之后通过在顶层CMakeLists.txt中设置 EXTRA_COMPONENT_DIRS变量指定对应的位置;
项目组件是工程目录下components目录下的组件,默认没有这个目录,可自行创建

需要注意的是,各组件不同同名,否则会发生覆盖,组件的编译顺序为 ESP-IDF内部组件 -> 扩展组件 -> 项目组件,后编译的组件会覆盖之前编译的同名组件,(此特点也有优点:允许将组件复制到项目目录中再修改以覆盖ESP-IDF组件,如果使用这种方式,ESP-IDF 目录本身可以保持不变)

6.2 添加项目组件

  1. 创建 components 目录
  2. 创建组件
    • 方法一:使用idf命令创建组件:idf.py -C <组件集目录地址> create-component <component name>
      • 在这里插入图片描述
    • 方法二:创建对应的目录并创建对应的源文件,复制其他组件的CMakeLists.txt文件
  3. 在组件内编写对应的程序即可
    在这里插入图片描述
  4. 清除工程,之后重新编译 idf.py clean -> idf.py build
    在这里插入图片描述

6.3 添加扩展组件

一定注意创建的组件名,不要和系统组件名相同,否则会覆盖造成报错,除非你主动为之,可通过搜索 COMPONENT_DIRS 中的目录列表以查找项目的组件(搜索方法:在CmakeList.txt中把这个变量打印出来)

  1. 创建自己存放组件集的组件目录,之后在组件目录下创建组件,不能直接创建组件目录,如这里创建组件集目录user,在user目录下创建gpio驱动组件目录gpio
  2. 复制其他组件的CMakeLists.txt
    在这里插入图片描述
  3. 修改组件目录内的CMakeLists.txt
    在这里插入图片描述
  4. 修改顶层CMakeLists.txt,添加EXTRA_COMPONENT_DIRS指定,注意此添加需要在project()之前,因为执行project指令的时候已经创建工程了
    在这里插入图片描述
  5. 编写对应的drv_gpio.c drv_gpio.h,并在main.c中引用,之后编译测试**(先清除工程,之后重新编译 idf.py clean -> idf.py build)**
    在这里插入图片描述
    编译测试成功在这里插入图片描述

7. 解决组件内引用 ESP-IDF 内函数、头文件报错

当我们创建好单独的组件后,将在单独的组件内编写各自的应用,如上,我们创建了 gpio 组件,那么相应将会在gpio组件中编写对应的gpio驱动,驱动中肯定会要应用ESP-IDF内的组件,但是当我们编译的时候会提示找不到相应文件。

我们的驱动程序如下:
在这里插入图片描述
编译报错:../user/gpio/drv_gpio.c:2:10: fatal error: driver/gpio.h: No such file or directory

这是由于依赖问题没有解决导致,我们编写的drv_gpio.c文件没有指定依赖,那么编译器将不知道去哪里找这个driver/gpio.h文件,因此报错,所以我们需要给它加上依赖,修改对应组件的CMakeLists.txt文件,增加 REQUIRES driver 指定依赖driver组件:
在这里插入图片描述
那么有人肯定会问,为什么在默认的main组件内这么写不会报错呢?这是由于main组件是一个特殊组件,工程的$ENV{IDF_PATH}/tools/cmake/project.cmake 默认为其添加了所有依赖

注意修改CMakeLists.txt后清除工程再重新编译 idf.py clean -> idf.py build


创作不易,转载请注明出处!

关注、点赞+收藏,可快速查收博主有关分享!


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43332314/article/details/129015602

智能推荐

js-选项卡原理_选项卡js原理-程序员宅基地

文章浏览阅读90次。【代码】js-选项卡原理。_选项卡js原理

设计模式-原型模式(Prototype)-程序员宅基地

文章浏览阅读67次。原型模式是一种对象创建型模式,它采用复制原型对象的方法来创建对象的实例。它创建的实例,具有与原型一样的数据结构和值分为深度克隆和浅度克隆。浅度克隆:克隆对象的值类型(基本数据类型),克隆引用类型的地址;深度克隆:克隆对象的值类型,引用类型的对象也复制一份副本。UML图:具体代码:浅度复制:import java.util.List;/*..._prototype 设计模式

个性化政府云的探索-程序员宅基地

文章浏览阅读59次。入选国内首批云计算服务创新发展试点城市的北京、上海、深圳、杭州和无锡起到了很好的示范作用,不仅促进了当地产业的升级换代,而且为国内其他城市发展云计算产业提供了很好的借鉴。据了解,目前国内至少有20个城市确定将云计算作为重点发展的产业。这势必会形成新一轮的云计算基础设施建设的**。由于云计算基础设施建设具有投资规模大,运维成本高,投资回收周期长,地域辐射性强等诸多特点,各地在建...

STM32问题集之BOOT0和BOOT1的作用_stm32boot0和boot1作用-程序员宅基地

文章浏览阅读9.4k次,点赞2次,收藏20次。一、功能及目的 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序。BOOT1=x BOOT0=0 // 从用户闪存启动,这是正常的工作模式。BOOT1=0 BOOT0=1 // 从系统存储器启动,这种模式启动的程序_stm32boot0和boot1作用

C语言函数递归调用-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏22次。C语言函数递归调用_c语言函数递归调用

明日方舟抽卡模拟器wiki_明日方舟bilibili服-明日方舟bilibili服下载-程序员宅基地

文章浏览阅读410次。明日方舟bilibili服是一款天灾驾到战斗热血的创新二次元废土风塔防手游,精妙的二次元纸片人设计,为宅友们源源不断更新超多的纸片人老婆老公们,玩家将扮演废土正义一方“罗德岛”中的指挥官,与你身边的感染者们并肩作战。与同类塔防手游与众不同的几点,首先你可以在这抽卡轻松获得稀有,同时也可以在战斗体系和敌军走位机制看到不同。明日方舟bilibili服设定:1、起因不明并四处肆虐的天灾,席卷过的土地上出..._明日方舟抽卡模拟器

随便推点

Maven上传Jar到私服报错:ReasonPhrase: Repository version policy: SNAPSHOT does not allow version: xxx_repository version policy snapshot does not all-程序员宅基地

文章浏览阅读437次。Maven上传Jar到私服报错:ReasonPhrase: Repository version policy: SNAPSHOT does not allow version: xxx_repository version policy snapshot does not all

斐波那契数列、素数、质数和猴子吃桃问题_斐波那契日-程序员宅基地

文章浏览阅读1.2k次。斐波那契数列(Fibonacci Sequence)是由如下形式的一系列数字组成的:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …上述数字序列中反映出来的规律,就是下一个数字是该数字前面两个紧邻数字的和,具体如下所示:示例:比如上述斐波那契数列中的最后两个数,可以推导出34后面的数为21+34=55下面是一个更长一些的斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,_斐波那契日

PHP必会面试题_//该层循环用来控制每轮 冒出一个数 需要比较的次数-程序员宅基地

文章浏览阅读363次。PHP必会面试题1. 基础篇1. 用 PHP 打印出前一天的时间格式是 2017-12-28 22:21:21? //&gt;&gt;1.当前时间减去一天的时间,然后再格式化echo date('Y-m-d H:i:s',time()-3600*24);//&gt;&gt;2.使用strtotime,可以将任何字符串时间转换成时间戳,仅针对英文echo date('Y-m-d H:i:s',str..._//该层循环用来控制每轮 冒出一个数 需要比较的次数

windows用mingw(g++)编译opencv,opencv_contrib,并install安装_opencv mingw contrib-程序员宅基地

文章浏览阅读1.3k次,点赞26次,收藏26次。windows下用mingw编译opencv貌似不支持cuda,选cuda会报错,我无法解决,所以没选cuda,下面两种编译方式支持。打开cmake gui程序,在下面两个框中分别输入opencv的源文件和编译目录,build-mingw为你创建的目录,可自定义命名。1、如果已经安装Qt,则Qt自带mingw编译器,从Qt安装目录找到编译器所在目录即可。1、如果已经安装Qt,则Qt自带cmake,从Qt安装目录找到cmake所在目录即可。2、若未安装Qt,则安装Mingw即可,参考我的另外一篇文章。_opencv mingw contrib

5个高质量简历模板网站,免费、免费、免费_hoso模板官网-程序员宅基地

文章浏览阅读10w+次,点赞42次,收藏309次。今天给大家推荐5个好用且免费的简历模板网站,简洁美观,非常值得收藏!1、菜鸟图库https://www.sucai999.com/search/word/0_242_0.html?v=NTYxMjky网站主要以设计类素材为主,办公类素材也很多,简历模板大部个偏简约风,各种版式都有,而且经常会更新。最重要的是全部都能免费下载。2、个人简历网https://www.gerenjianli.com/moban/这是一个专门提供简历模板的网站,里面有超多模板个类,找起来非常方便,风格也很多样,无须注册就能免费下载,_hoso模板官网

通过 TikTok 联盟提高销售额的 6 个步骤_tiktok联盟-程序员宅基地

文章浏览阅读142次。你听说过吗?该计划可让您以推广您的产品并在成功销售时支付佣金。它提供了新的营销渠道,使您的产品呈现在更广泛的受众面前并提高品牌知名度。此外,TikTok Shop联盟可以是一种经济高效的产品或服务营销方式。您只需在有人购买时付费,因此不存在在无效广告上浪费金钱的风险。这些诱人的好处是否足以让您想要开始您的TikTok Shop联盟活动?如果是这样,本指南适合您。_tiktok联盟