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

news2024/11/26 6:12:37

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


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

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


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

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

相关文章

Python进阶篇(一)-- Django快速上手

1 Django概述 Web框架&#xff0c;就是用于开发Web服务器端应用的基础设施&#xff0c;说得通俗一点就是一系列封装好的模块和工具。事实上&#xff0c;即便没有Web框架&#xff0c;我们仍然可以通过socket或CGI来开发Web服务器端应用&#xff0c;但是这样做的成本和代价在商业…

Stable Diffusion 1 - 初始跑通 文字生成图片

文章目录关于 Stable DiffusionLexica代码实现安装依赖库登陆 huggingface查看 huggingface token下载模型计算生成设置宽高测试迭代次数生成多列图片关于 Stable Diffusion A latent text-to-image diffusion model Stable Diffusion 是一个文本到图像的潜在扩散模型&#xff…

撕开市场缺口,认养一头牛“犟心”能给谁?

随着疫情防控政策优化&#xff0c;2023年以来中国消费力和投资活动均迎来复苏。其中&#xff0c;乳制品赛道受益于国内消费者健康消费理念的加强&#xff0c;呈现出稳步增长的势头。一方面&#xff0c;乳制品消费需求旺盛&#xff0c;市场未来可期。据中商研究院预计&#xff0…

【Hello Linux】Linux环境下写的第一个程序 -- 进度条

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;写出Linux中的第一个小程序 进度条 进度条小程序行缓冲区概念\r 和 \n进度条代码和演示行缓冲区概念 我们首先用两段代码来感受下行缓…

结合ENVI和PIE Hyp讲述高光谱遥感信息处理技术,包括光谱恢复、光谱库建立、光谱特征提取、混合像元分解、图像分类及精度检验

大气温室气体浓度不断增加&#xff0c;导致气候变暖加剧&#xff0c;随之会引发一系列气象、生态和环境灾害。如何降低温室气体浓度和应对气候变化已成为全球关注的焦点。海洋是地球上最大的“碳库”,“蓝碳”即海洋活动以及海洋生物&#xff08;特别是红树林、盐沼和海草&…

05 OpenCV色彩空间处理

色彩空间&#xff08;Color Space&#xff09;是一种用于描述颜色的数学模型&#xff0c;它将颜色表示为多维向量或坐标&#xff0c;通常由三个或四个独立的分量来表示。不同的色彩空间在颜色的表示方式、可表达颜色的范围、计算速度和应用场景等方面存在差异&#xff0c;不同的…

ChatGPT写代码水平惊艳到我,很性感但有点危险

这几天属实是被ChatGPT刷屏了&#xff0c;十年寒窗无人问&#xff0c;一举成名天下知。不少人和ChatGPT对话后&#xff0c;都觉得自己像个傻逼。这位“最强懂哥”可以轻松应答各种问题&#xff0c;给出的答案不仅条理清晰&#xff0c;还会引用例子支撑观点。让它帮忙写程序&…

九、初识卷积

文章目录1、通过边缘检测认识卷积2、Padding3、Strid Convelution4、RGB图像的卷积THE END1、通过边缘检测认识卷积 \qquad在使用神经网络进行图像识别时&#xff0c;神经网络的前几层需要完成对图像的边缘检测任务&#xff0c;所谓的边缘检测就是让计算机识别出一张图片的垂直…

【智能计算数学】微积分

高数问题解决流程引例&#xff1a;回归回归引例&#xff1a;分类分类线性可分FLD线性不可分智能计算讨论范围下降法为什么要用下降法&#xff1f;- 解析解很难写出公式或很复杂难计算有哪些常用的下降法&#xff1f;- 梯度下降&高斯-牛顿法梯度下降&#xff08;Gradient De…

初步认识操作系统(Operator System)

操作系统一&#xff0c;冯诺依曼体系结构内存的重要作用二&#xff0c;操作系统的概念三&#xff0c;设计操作系统的目的三&#xff0c;操作系统在计算机体系中的定位四&#xff0c;操作系统是如何进行管理的一&#xff0c;冯诺依曼体系结构 在众多计算机相关的书籍中&#xff…

linux安装docker和Docker Compose

1、安装环境 此处在Centos7进行安装&#xff0c;可以使用以下命令查看CentOS版本 lsb_release -a 在 CentOS 7安装docker要求系统为64位、系统内核版本为 3.10 以上&#xff0c;可以使用以下命令查看 uname -r 2、用yum源安装 2.1 查看是否已安装docker列表 yum list inst…

Doom流量回放工具导致的测试环境服务接口无响应的排查过程

Doom流量回放工具导致的测试环境服务接口无响应的排查过程 现象描述&#xff1a; a)部分接口&#xff08;A组接口&#xff09;无响应 b)部分接口&#xff08;B组接口&#xff09;正常响应 c)还有一部分接口&#xff08;C组接口&#xff09;,场景1无响应&#xff0c;场景2正常响…

ChatGPT 桌面应用程序 for macOS, Linux, Windows v0.10

请访问原文链接&#xff1a;https://sysin.org/blog/chatgpt/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org ChatGPT 是什么 ChatGPT 是 OpenAI 公司开发的一种基于对话优化的语言模型。用俗话说就是“人工智障”聊天机器…

三次握手-升级详解-注意问题

TCP建立连接的过程就是三次握手&#xff08;Three-way Handshake&#xff09;&#xff0c;在建立连接的过程实际上就是客户端和服务端之间总共发送三个数据包。进行三次握手主要是就是为了确认双方都能接收到数据包和发送数据包&#xff0c;而客户端和服务端都会指定自己的初始…

Tomcat构建

软件架构C/S:Client/Server.需要安装才能使用。B/S:Brower/Server。有浏览器就可以。资源分类动态资源&#xff1a;每个用户访问相同的资源后&#xff0c;得到的结果可能不一样&#xff0c;称为动态资源。动态资源被访问后&#xff0c;先转换为静态资源&#xff0c;再被浏览器解…

ESP-IDF: 基于计数型信号量的生产者和消费者模型代码

ESP-IDF: 基于计数型信号量的生产者和消费者模型代码 SemaphoreHandle_t freeBowl NULL;//初始状态有5个空碗 SemaphoreHandle_t Mantou NULL;//初始状态没有馒头&#xff0c;从零开始计数 int queue[5]; //用数组模拟空碗&#xff0c;对数组取余操作&#xff0c;模拟循环链…

如何利用 ESLint 规范 TypeScript 代码

ESLint 是一种 JavaScript linter&#xff0c;可以用来规范 JavaScript 或 TypeScript 代码&#xff0c;本文教你怎么在项目中快速把 ESLint 安排上。 前导 怎么写出优雅的代码是一个老生常谈的话题&#xff0c;这其中包含了太多内容可聊&#xff0c;但搞一套标准规范绝对是万…

opencv锁定鼠标定位

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

【MySQL进阶】 存储引擎 索引

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享Java相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…

如何编译和运行C++程序?

C 和C语言类似&#xff0c;也要经过编译和链接后才能运行。在《C语言编译器》专题中我们讲到了 VS、Dev C、VC 6.0、Code::Blocks、C-Free、GCC、Xcode 等常见 IDE 或编译器&#xff0c;它们除了可以运行C语言程序&#xff0c;还可以运行 C 程序&#xff0c;步骤是一样的&#…