前言
记录一下最新版esp-idf+vscode编译环境的安装,主播用的是v5.3.1的版本,这里主要是记录一下安装过程和构建项目框架过程中可能会遇到的问题。
文中会用到cmake脚本语言,这玩意搞c的要单独去学习一下。
- 这篇文章主要是文末的项目构建过程,其他的按照网上其他地方来也能直接安装好ESP-IDF,所以如果是想知道如何构建项目文件框架的可以直接去文末。
- byd,Vscode就不用我说了吧,如果学到esp32还没有基本代码素养,建议直接使用arduino,这玩意简单。
一、使用步骤
1.扩展库里面直接下载ESP-IDF等插件
- 最主要是我中间也忘记哪些插件要加了,反正都加上吧这几个
这些插件都是要预先准备的。
2.环境配置
- ESP-IDF在运行过程中需要用户自己提供工具路径
- 这两个路径看下应该都不用自己添加,或者只用添加IDF_TOOLS_PATH路径,这个路径要添加到用户变量中,就是直接在用户变量中直接新建路径
- 这个路径反正安装扩展之后的文件应该是一样的,如果没找到这个esp32-IDF文件可能就是没安装,就先进行我的下一步。
3.ESP-IDF工具安装
- 进去之后反正就如下选择最新版,然后选中安装导向位置就行了,下面两个路径都支持自定义
4.项目构建
- OK,到这里应该理论上来说所有的配置都完成了,他这个ESP-IDF还算挺智能的,在安装扩展之后就能自动锁定很多路径gcc编译路径这些都不用我们自己管
- 接下来就是项目初始化,ESP的构建方法和之前学的STM32还是有很大的不同,主要就是esp32的内核明显要复杂很多,使用idf确实很便捷,官方直接给我们适配了freertos,而且是适配了双核的freertos,所以IDF已经很方便了
- 而esp系列的开发一般都是直接使用例程和操作文档来学习,这里我直接给一个包吧,里面有ESP32基础系列的操作手册
链接:https://pan.baidu.com/s/1ARAE8Dd7eHS7Dy_7m29eYA?pwd=adfs
提取码:adfs
- 并且这个ESP-IDF其实还没有像stm32等那些芯片的开发环境那么成熟,所以最好是根据ESP官方的IDF操作手册来学习,这个直接上网搜“ESP-IDF操作”应该就会直接找到,而这个文档页面要在左上角来选择espidf版本
1.示例项目选择
- 这个没什么好说的,就是在ESP-IDF界面中选择对应的板子芯片和文件保存位置就行
- 里面choose port就是我们将ESP的USB接口接上电脑后可以找到的串口,后面就是使用这个串口进行程序下载
- 进入左下角的示例选择界面,会出来一堆外设等等的示例,从这里基本就能找到ESP32外设的所有实例就一个个看吧,然后直接找一个示例比如hello world,这个第一个示例就是直接从串口打印一个“hello world”到主机
- 进示例之后就是直接左上角工具栏操作
- build–编译链接
- flash–下载程序
- monitor–主机监测
- 主要就是这三个按顺序点就完事了,最后面成功的结果就是直接能在下方命令栏能直接收到“hello world”数据,这里就是完成了基础环境的构建
2.组件外扩
- 接下来就是全文重点,大型项目的文件项目结构构建,这个估计很多学完stm32入门esp32最坑的一点了,
- 因为esp-idf使用的是cmake来直接构建项目文件,故而在编译的过程中都是直接通过cmakelist.txt文件来直接索引.c和.h文件来直接编译的,故而所有需要用到的文件都必须被包含在cmakelist中,所以一般就是直接在创建好的项目中的main文件夹中直接添加.c和.h文件来进行外设的解耦,这种方式理论上不会出现问题
- 但是很多学完stm32的来esp32开发就总想像江科,正点那样直接新建hardware文件夹等来将解耦的外设初始化文件单独放在这些文件夹中,这样就显得文件架构很清晰
- 但是,但是,但是ESP-IDF不允许这么做,因为它的使用的cmake捏,所以很多人估计在这里就遇到了很多问题,接下来我就讲述一下一个简单的做法。
- 因为使用cmakelists来构建项目,故而在每个组件的文件夹中都应该外附一个cmakelists.txt来指示这个文件夹中的包含关系和那些文件是必须要使用的。
- 而这里有很多新手就要问了,欸!我特么同样也是新建一个项目文件夹,添加了一个cmakelists来指示文件包含关系,为啥在将比如pwm.h这个头文件添加到main.c中时,ESP-IDF还是build报错呢?实际上,这么说吧,ESP-IDF的组件管理器只会在编译文件的时候只会扫描main文件夹和一个名叫components的文件夹。
- 这点是真的坑啊,找了好多资料都没找到,最后还是靠着b站一个up主沧御,根据他的指示我才知道这点,真的很感谢开源大佬。而且沧佬在b站上也发了几个视频来简述cmakelists这种脚本语言应该怎么写才能更方便。
- 所以说到这里,我的意思就是说只要直接在你的项目文件中直接创建一个components文件夹,然后在其中的cmakelists.txt中添加如下代码就能在每次编译文件的时候直接能够索引到这个文件夹中的所有组件。
file(GLOB_RECURSE SOURCES "*.c" )
idf_component_register(SRCS ${SOURCES}
INCLUDE_DIRS "."
REQUIRES "driver" )
- 我来解释一下这串脚本语言
- 首先是file(GLOB_RECURSE SOURCES “*.c” ),这句话的意思是直接将这个文件夹中的所有文件的地址索引作为一个GLOB_RECURSE变量SOURCES
- 然后下面就是用到了这个变量SOURCES将其作为idf的组件进行编译
- INCLUDE_DIRS ". "就是包含每个组件中的头文件,因为我们的组件中是用于初始化各种外设或者业务代码,故而就一定会用到现成的库文件,这些库文件就同样要被包含到这些.c文件中来,故而必须用到这个。
- REQUIRES "driver"这一行比较特殊,表示依赖包含,因为有些库文件无法被直接索引到,故而必须使用REQUIRES来索引这些库文件所在的文件夹(其实这里有很多问题,这也是为啥我说这里比较特殊,首先这一行代码是新版本ESP-IDF,具体从哪个版本开始的不清楚,反正v5.3.1必须要用到,这里如果components中的哪个文件用到了driver中的库文件,就必须添加这个代码在cmakelist中,这一点反正先加着,很关键,因为不加这些组件中使用的库文件就无法被索引到)
总结
以上就是v5.3.1版本ESP-IDF构建复杂项目文件所需要注意的,说实话这里要是没有开源大佬们支持,主播估计要被卡一整个星期都不一定能解决esp-idf只会扫描main和components文件夹的问题,所以最后感谢b站up沧御。