当前位置: 首页 > news >正文

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

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

文章目录

  • ESP-IDF + Vscode ESP32 开发环境搭建以及开发入门
    • 1. 前言
    • 2. 下载开发工具
    • 3. 配置工具
    • 4. 创建工程
    • 5. 解决vscode找不到头文件,波浪线警告
    • 6. 添加自己的组件
      • 6.1 组件说明
      • 6.2 添加项目组件
      • 6.3 添加扩展组件
    • 7. 解决组件内引用 ESP-IDF 内函数、头文件报错

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

Tips: 虽然笔者采用的是Linux开发环境,但是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


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

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


相关文章:

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

ESP-IDF Vscode ESP32 开发环境搭建以及开发入门 文章目录ESP-IDF Vscode ESP32 开发环境搭建以及开发入门1. 前言2. 下载开发工具3. 配置工具4. 创建工程5. 解决vscode找不到头文件&#xff0c;波浪线警告6. 添加自己的组件6.1 组件说明6.2 添加项目组件6.3 添加扩展组件7. …...

SpringMvc的请求和响应

SpringMvc的数据响应 1.springmvc的数据相应方式 &#xff08;1&#xff09;页面跳转 直接返回字符串 通过ModelAndView对象返回 &#xff08;2&#xff09;回写数据 直接返回字符串 返回对象或集合 页面跳转 jsp页面 <% page contentType"text/html;charsetUTF-8&q…...

【Vue3】首页主体-面板组件封装

首页主体-面板组件封装 新鲜好物、人气推荐俩个模块的布局结构上非常类似&#xff0c;我们可以抽离出一个通用的面板组件来进行复用 目标&#xff1a;封装一个通用的面板组件 思路分析 图中标出的四个部分都是可能会发生变化的&#xff0c;需要我们定义为可配置主标题和副标题…...

部署 K8s 集群

1 .部署k8s的两种方式目前生产部署Kubernetes集群主要有两种方式&#xff1a;kubeadmKubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。二进制包从github下载发行版的二进制包&#xff0c;手动部署每个组件&#x…...

关于北京君正:带ANC的2K网络摄像头用户案例

如果远程办公是您的未来&#xff0c;或者您经常通过视频通话与远方的朋友和亲戚交谈&#xff0c;那么您可以考虑购买网络摄像头以显著改善您的沟通。Anker PowerConf C200是个不错的选择。 Anker PowerConf C200专为个人工作空间而设计&#xff0c;能够以每秒30帧的速度拍摄2K…...

ccc-Backpropagation-李宏毅(7)

文章目录NotationBackpropagationForward passBackward passSummaryNotation 神经网络求解最优化Loss function时参数非常多&#xff0c;反向传播使用链式求导的方式提升计算梯度向量时的效率&#xff0c;链式法则如下&#xff1a; Backpropagation 损失函数计算为所有样本…...

找出字符串中第一个匹配项的下标-力扣28-java

一、题目描述给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。示例 1&#xff1a;输入&#xff1a;hayst…...

SpringBoot 监听Redis key过期回调

SpringBoot 监听Redis key过期回调 场景 Spring boot实现监听Redis key失效事件可应对某些场景例如&#xff1a;处理订单过期自动取消、用户会员到期… 开启Redis键过期回调通知 Redis默认是没有开启键过期监听功能的&#xff0c;需要手动在配置文件中修改。Linux操作系统 修…...

蓝桥杯C/C++VIP试题每日一练之回形取数

💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…...

四控、三管、一协调

四控指的是进度控制&#xff0c;质量控制&#xff0c;成本控制&#xff0c;变更控制。三管指的是合同管理&#xff0c;安全管理&#xff0c;资料管理。一协调指的是协调甲方&#xff0c;总包及设备材料供应方的关系。信息系统工程监理是指依法设立且具备相应资质的信息系统工程…...

jdk19下载与安装教程(win10)超详细

一、下载安装步骤 1、官网下载还需要注册&#xff0c;可以点【我的网盘】目录下载&#xff0c;目录也有其它低版本的&#xff0c;如果有需要大家根据需要自行选择。 2、下载后直接点击安装程序&#xff0c;点击【运行】。这里我使用的是64位的。 3、点击【下一步】。 4、默认安…...

来来来,手摸手写一个hook

hello&#xff0c;这里是潇晨&#xff0c;今天就带着大家一起来手写一个迷你版的hooks&#xff0c;方便大家理解hook在源码中的运行机制&#xff0c;配有图解&#xff0c;保姆级的教程&#xff0c;只求同学一个小小的&#x1f44d;&#xff0c;&#x1f436;。 第一步&#xf…...

【C++】AVL树

目录 1 简介 2 实现 2.1 框架构建 2.2 插入操作 2.2.1 平衡因子的更新 2.2.2 平衡因子异常时树的调整 3 检验 1 简介 AVL树基于二叉搜索树之上&#xff0c;又对其提出了平衡的要求&#xff0c;即&#xff1a;当向二叉搜索树插入新节点后&#xff0c;保证每个节点的左右…...

Mybatis源码(2) - SqlSessionTemplate的介绍及创建过程

0. 前言1. Spring对SqlSessionTemplate的管理1.1. SqlSessionTemplate的创建&#xff1a;1.2. MapperProxy中sqlSession的来源&#xff1a;2. SqlSessionInterceptor中的getSqlSession0. 前言 众所周知&#x1f60f;:MyBatis通过SqlSessionFactory 创建SqlSession去调用Executo…...

女生做大数据有发展前景吗?

当前大数据发展前景非常不错&#xff0c;且大数据领域对于人才类型的需求比较多元化&#xff0c;女生学习大数据也会有比较多的工作机会。大数据是一个交叉学科涉及到的知识量比较大学习有一定的难度&#xff0c;女生比较适合大数据采集和大数据分析方向的工作岗位。 大数据采…...

Git实用指令记录

config 用例&#xff1a;对git最先要做的一个操作就是配置用户名和邮箱&#xff0c;否则无法commit查看所有可以config的条目&#xff0c;非常之多$ git config --list core.symlinksfalse core.autocrlftrue core.fscachetrue color.interactivetrue color.uiauto help.forma…...

复杂美公链技术重要特色:平行公链架构

复杂美公链技术Chain33从11月开源至今&#xff0c;获得众多合作方的认可&#xff0c;其中首创的平行公链架构被百度、阿里、360等机构认可并跟进研究&#xff0c;这也说明了平行公链或许是区块链普及应用的重要解决方案之一。 平行公链&#xff08;以下简称平行链&#xff09;是…...

Java——进制转换的一些内容

Java——进制转换的一些内容1.16进制字符串String转字节数组byte[]2.16进制字符串String转10进制数字int3.字节数组byte[]转字符串String4.16进制字符串String-->byte[]-->String&#xff08;使用ByteBuffer转换&#xff09;5.字节数组byte[]转字符数组char[]6.字节byte转…...

使用 Nodejs、Express、Postgres、Docker 在 JavaScript 中构建 CRUD Rest API

让我们在 JavaScript 中创建一个 CRUD rest API&#xff0c;使用&#xff1a;节点.js表达续集Postgres码头工人码头工人组成介绍这是我们将要创建的应用程序架构的架构&#xff1a;我们将为基本的 CRUD 操作创建 5 个端点&#xff1a;创造阅读全部读一个更新删除我们将使用以下…...

电子招标采购系统源码之什么是电子招投标系统?

随着互联网时代的到来&#xff0c;各行业都受到不同的影响&#xff0c;其中招投标行业也不例外。为了顺应互联网潮流的发展&#xff0c;电子招投标逐渐取代传统的纸质的招投标方式&#xff0c;给招标方、投标方、招标代理等各方也带来了前所未有的机遇与挑战。那么什么是电子招…...

匹配文件名称模块glob和fnmatch

匹配文件名称模块glob 1.概述 glob模式规则与re模块的正则表达式规则不大相同&#xff0c;glob模块遵循标准的UNIX路径扩展规则。 fnmatch模块用于根据glob模式比较文件名 2.glob表达式匹配文件名 2.1.测试文件 介绍glob配置规则前&#xff0c;先使用下面的代码创建测试文…...

day12_oop

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、继承 三、重写 四、this和super 五、访问修饰符 零、 复习昨日 局部变量和成员变量什么区别 位置,作用域,初始值,内存位置,生命周期 构造方法…...

在 Flutter 中使用 webview_flutter 4.0 | js 交互

大家好&#xff0c;我是 17。 已经有很多关于 Flutter WebView 的文章了&#xff0c;为什么还要写一篇。两个原因&#xff1a; Flutter WebView 是 Flutter 开发的必备技能现有的文章都是关于老版本的&#xff0c;新版本 4.x 有了重要变化&#xff0c;基于 3.x 的代码很多要重…...

嵌入式ARM工业边缘计算机BL302的CAN总线接口如何设置?

CAN 接口如图所示&#xff0c;输入如下命令&#xff1a; ifconfig -a //查看所有网卡 如果 FlexCAN 驱动工作正常的话就会看到 CAN 对应的网卡接口&#xff0c;如图。从图中可 以看出&#xff0c;有一个名为“can0”的网卡&#xff0c;这个就是 BL302 板上的 CAN1 接口对应的 c…...

Win11系统如何安装Ubuntu20.04(WSL版本)并安装docker

终于还是下定决心去换电脑了……这次采用轻量级的WSL&#xff0c;发现虽然没有占内存的GUI界面&#xff0c;但是编码和阅读文档还是非常nice的 1、首先开启Win11的虚拟机服务 2、下载你期望的Ubuntu服务器&#xff08;这里以20.04为例&#xff09; 安装成功后&#xff0c;发现…...

Elasticsearch和Solr的区别

背景&#xff1a;它们都是基于Lucene搜索服务器基础之上开发&#xff0c;一款优秀的&#xff0c;高性能的企业级搜索服务器。&#xff08;是因为他们都是基于分词技术构建的倒排索引的方式进行查询&#xff09;开发语言&#xff1a;java语言开发诞生时间&#xff1a;Solr2004年…...

如何在北京买房

首先我陈述一点&#xff0c;如果为了买房后再卖掉赚取差价&#xff0c;我这篇文章也许不适合&#xff0c;我这篇文章为整体愿景的发展而设计&#xff0c;为可操作房产的买卖而操作。 买房的愿景&#xff1a; 首先&#xff0c;我们要以一种心态来买房。那就是以始为终的态度&am…...

使用Proxifier+burp抓包总结

一、微信小程序&网页抓包 1. Proxifier简介 Proxifier是一款功能非常强大的socks5客户端&#xff0c;可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链。 2. 使用Proxifier代理抓包 原理&#xff1a;让微信相关流量先走127.0.0.1:80到burp。具体…...

安装华为aab包的处理方式

1、转换 aab包 为 apks 说明&#xff1a; 1、bundletool-all-1.11.2.jar 转换文件的工具 2、a.aab aab源文件 3、xxx.apks 导入的文件以及路径&#xff08;例如&#xff1a;D:\Android\xxx.apks&#xff09; 4、–ksxxxx.jks 该aab打包所需的jsk文件 5、三条命令为 jsk打包所…...

Word处理控件Aspose.Words功能演示:使用 C++ 将 RTF 文档转换为 PDF

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c;API支持所有流行的Word处理文件…...

seo于刷网站点击/近两年网络营销成功案例

List是一个接口&#xff0c;不能调用对象&#xff0c;它是Colllection的子接口&#xff0c;Collection中的方法也在List中适用 我们一般创建的List对象指向ArrayList或者LinkList的子对象&#xff0c;秉承多态&#xff08;downcasting)向下转型的原则 常用方法介绍 package …...

flash制作技巧/杭州关键词优化平台

JSP out.println()换行输出out.println()方法可将各种类型的数据转换成字符串的形式输出。定义public abstract void println()分行显示各种数据类型的内容。例子Insert title hereSystem.out.println("This is printed by System.out.println.");System.out.println…...

全国招聘网站排名/seo网络推广

做realsense中手势部分的时候&#xff0c;涉及到检测手势关节旋转的部分&#xff0c;找了篇博文资料。 四元数介绍 旋转&#xff0c;应该是三种坐标变换——缩放、旋转和平移&#xff0c;中最复杂的一种了。大家应该都听过&#xff0c;有一种旋转的表示方法叫四元数。按照我们的…...

物流系统网站建设 的网站描述/惠州网站建设方案推广

边缘智能正在促成人工智能&#xff08;AI&#xff09;与物联网&#xff08;IoT&#xff09;的混合&#xff0c;AI与IoT相辅相成&#xff1a;如果没有AI&#xff0c;IoT只是收集数据的 sensor&#xff0c;如果没有IoT&#xff0c;AI也不会应用到边缘。AIoT项目确实比其他单纯的一…...

冷水江网站定制/淘宝指数网站

18.scrapy中selector的用法 Selector是一个独立的模块。 Selector主要是与scrapy结合使用的。 开启Scrapy shell: 1.打开命令行cmd 2.scrapy shell http://doc.scrapy.org/en/latest/_static/selectors-sample1.html 进入Scrapy shell 模式 posted on 2018-08-27 14:45 五杀摇滚…...

wordpress 免费企业网站 模板下载/太原百度seo

博主的系统环境如下&#xff1a; Win10 1709 教育版 Anaconda3-5.0.1-Windows-x86_64.exe Python是Anaconda中自带的3.6.3。 前言 由于原来电脑中装有Arcgis就自带装了2.7的Python&#xff0c;后来为了打包又弄了个3.5的Python,所以电脑里共存了3个版本的Python。。。最近…...