提示:本博客作为学习笔记,有错误的地方希望指正
一、ESP32新建工程参考资料:
??参考资料:ESP IDF编程手册V4.4 ??任何芯片开发的第一步都是从新建工程开始,对于ESP32而言,初学的时候新建工程还不是那么好理解,ESP32 的工程是基于CMake框架构建的工程,因此刚开始学习的时候大多数和我一样对Cmake感觉还是太陌生,特别是对于Cmake下的其他文件的包含就特别的麻烦。 ??只不过还好,ESP32有丰富的历程让我们刚开始学习的时候就避免各种各样资料头大问题,ESP32在Vscode中的IDF框架中具有丰富的历程在配合IDF编程指南,就再也不愁学习的时候没有资料。
1.1、Vscode 中IDF的环境搭建
??基于Vscode下的IDF安装的话这里就简单的介绍下,每个人的电脑配置环境不一样,安装的时候多多少少有些差异。安装要是遇到问题百度多半会解决,我自己安装也是安装了好多次的,多折腾下就可以了。 ??首先安装好Vscode软件,Vscode是非常好用的软件,比之前使用的keil开发stm32和51好用多了。我这里是已经安装好idf插件了的,所以显示有些差别。 + ??安装好idf的插件了还没有结束,才刚刚开始,这时候我们需要打开命令面板,可以使用快捷键ctrl + shift + p 就可以打开命令面板,mac的是使用command + shift + p ?? 在命面板中输入 Configure ESP-IDF extension ,点击下面的提示, ??然后就会跳转到这个welcome界面。首次安装的这里有三个选项,就直接选择ADVANCED 即可。 ??然后我们就按照默认的选择就行了,这里使用到Github拉取下载,会有些慢,慢慢等待就行了,这里我使用的默认路径和默认的Python路径 ,要选择其他路径会有奇奇怪怪的问题,所以我选用默认的路径,一般这样就不会有啥问题,即使有问题也是Python没有安装或者版本比较低,可以在Vscode终端中安装或者升级他需要的Python版本即可。 ??按照上述的描述安装,一般一直默认就不会有啥问题,我们就在Vscode中安装好IDF的插件了,然后就可以开心的学习ESP32了。
1.1、使用IDF的历程
??在按照上述安装好IDF了我们需要测试我们安装环境是否成功,这里我们就直接使用官方给的历程,首先我们可以在命令窗口输入 Show Examples Projects ,点击提示的确认就可以跳转到IDF对应的历程了。随便点击第一个blink。然后会跳转到我们选择保存工程的文件路径。 ??选择好blink工程以后我们就配置一下我们的工程,然后编译,idf首次编译有些慢,还是根据电脑和系统优化不同编译速度也是不一样的,MAC编译比windows要快些。优化好些。 编译成功了,我们来看看工程文件夹下有些什么东西,分析分析下。
main
└── blink_example_main.c
├── CMakeLists.txt
├── component.mk
└── Kconfig.projbuild
│
CMakeLists.txt
│
Makefile
│
sdkconfig
- 顶层项目 CMakeLists.txt 文件,这是 CMake 用于学习如何构建项目的主要文件,可以在这个文件中设置项目全局的 CMake 变量。顶层项目 CMakeLists.txt 文件会导入 /tools/cmake/project.cmake 文件,由它负责实现构建系统的其余部分。该文件最后会设置项目的名称,并定义该项目。
#
# This is a project Makefile. It is assumed the directory this Makefile resides in is a
# project subdirectory.
#
PROJECT_NAME := blink # 工程名字 编译时候会生成bin文件就根据这个工程名来生成后面夹.bin后缀名的bin文件
EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/common_components/led_strip
include $(IDF_PATH)/make/project.mk
-
“sdkconfig” 项目配置文件,执行 idf.py menuconfig 时会创建或更新此文件,文件中保存了项目中所有组件(包括 ESP-IDF 本身)的配置信息。 sdkconfig 文件可能会也可能不会被添加到项目的源码管理系统中。 -
可选的 “components” 目录中包含了项目的部分自定义组件,并不是每个项目都需要这种自定义组件,但它有助于构建可复用的代码或者导入第三方(不属于 ESP-IDF)的组件。或者,您也可以在顶层 CMakeLists.txt 中设置 EXTRA_COMPONENT_DIRS 变量以查找其他指定位置处的组件。有关详细信息,请参阅 重命名 main 组件。如果项目中源文件较多,建议将其归于组件中,而不是全部放在 “main” 中。 -
“main” 目录是一个特殊的组件,它包含项目本身的源代码。”main” 是默认名称,CMake 变量 COMPONENT_DIRS 默认包含此组件,但您可以修改此变量。在main下面有一个CMakeLists.txt 文件,这里是包包含main下面的.c和.h文件,其中 INCLUDE_DIRS后面可以根据字符串包含指定的文件夹下的.h文件,例如 INCLUDE_DIRS “include” 包含include文件夹下的.h文件 INCLUDE_DIRS “.” 含义代表包含main文件下所有的.h文件。
idf_component_register(SRCS "blink_example_main.c"
INCLUDE_DIRS ".")
- Kconfig.projbuild 文件可以根据语法设置工程的一些选择参数,就有点类似stm32 cubemx一样的,图形化配置一些引脚和其他可变的参数。
- “build” 目录是存放构建输出的地方,如果没有此目录,idf.py 会自动创建。CMake 会配置项目,并在此目录下生成临时的构建文件。随后,在主构建进程的运行期间,该目录还会保存临时目标文件、库文件以及最终输出的二进制文件。此目录通常不会添加到项目的源码管理系统中,也不会随项目源码一同发布。
项目 CMakeLists 文件 ??每个项目都有一个顶层 CMakeLists.txt 文件,包含整个项目的构建设置。默认情况下,项目 CMakeLists 文件会非常小。 最小 CMakeLists 文件示例
cmake_minimum_required(VERSION 3.16)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(myProject)
必要部分 ??每个项目都要按照上面显示的顺序添加上述三行代码:
-
cmake_minimum_required(VERSION 3.16) 必须放在 CMakeLists.txt 文件的第一行,它会告诉 CMake 构建该项目所需要的最小版本号。ESP-IDF 支持 CMake 3.16 或更高的版本。 -
include($ENV{IDF_PATH}/tools/cmake/project.cmake) 会导入 CMake 的其余功能来完成配置项目、检索组件等任务。 -
project(myProject) 会创建项目本身,并指定项目名称。该名称会作为最终输出的二进制文件的名字,即 myProject.elf 和 myProject.bin。每个 CMakeLists 文件只能定义一个项目。 IDF编程指南 : 具体更多的细节可以看看官网的资料
1.2、Cmake构建工程
??官方给我们好多的示例,不同的外设以及不同的协议都在里面,根据IDF版本更新调整和更新一些工程。在上述中也知道一些工程框架,我们可以根据他的框架自己新建一个工程。点击IDF插件即可有插件栏目,可以实现编译功能。注:.gitignore不用新建这个是我用来过滤git上传的文件。 ??工程文件夹中的各个文件代码 ??在esp32_new_project工程父目录中CMakeLists.txt的源码
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(esp32_new_project)
??在esp32_new_project工程父目录中Makefile的源码
PROJECT_NAME := esp32_new_project
include $(IDF_PATH)/make/project.mk
??在main父目录中CMakeLists.txt的源码
idf_component_register( SRCS "main.c"
INCLUDE_DIRS ".")
??在main父目录中main.c的源码
#include <stdio.h>
#include "TestOne.h"
#include "TestTwo.h"
void app_main(void)
{
TestOneFunction();
TestTwoFunction();
while (1){
vTaskDelay(100/portTICK_RATE_MS);
}
}
??在TestOne/include的TestOne.h源码
#ifndef _TestOne_H_
#define _TestOne_H_
#include "stdio.h"
void TestOneFunction(void);
#endif
??在TestOne的TestOne.c源码
#include "TestOne.h"
void TestOneFunction(void)
{
printf("\n\rTestOneFunction\n\r");
}
??在TestOne的CMakeLists.txt源码
idf_component_register( SRCS "TestOne.c"
INCLUDE_DIRS "include")
??在TestTwo/include的TestTwo.h源码
#ifndef _TestTwo_H_
#define _TestTwo_H_
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
void TestTwoFunction(void);
#endif
??在TestTwo的TestTwo.c源码
#include "TestTwo.h"
const static char * TAG = "TestTwo";
void TestTwoFunction(void)
{
ESP_LOGI(TAG,"TestTwoFunction");
vTaskDelay(100/portTICK_RATE_MS);
}
??在TestTwo的CMakeLists.txt源码
idf_component_register( SRCS "TestTwo.c"
INCLUDE_DIRS "include")
二、硬件
??这里我是随便使用的一块esp32s3的开发板测试的,这个新建工程和ESP32的那一块芯片关系不大。
三、输出结果
四、工程文件下载
??参考工程文件下载
|