ESP32学习记录:
- esp32系列(1):Hello world, 初识esp32 搭建VScode下的esp32开发环境,hello esp32。
- esp32系列(2):工程结构学习,从新建工程到烧写程序 熟悉工程的文件结构,各文件的含义,编译流程。以及VScode的具体操作。
- esp32系列(3):GPIO学习(以简单GPIO输入输出、ADC、DAC为例) 学习ESP32 GPIO与外设的几种输入输出方式,通过两个简单的例子学习简单GPIO与RTC GPIO输入输出的代码实现。
- 1 基本概念
- 1.1 ESP-IDF 项目相关基本概念
- 1.2 其他相关概念
- 2 怎么构建一个项目?
- 2.1 idf.py 命令行工具
- 2.2 新建工程
- 2.2.1 新建工程的文件结构
- 2.2.2 各文件含义
- 2.2.3 添加代码
- 2.3 构建项目
- 2.3.1 构建过程
- 3 烧写过程
一个 ESP-IDF 项目可以看作是多个不同组件的集合。
项目
:特指一个目录,其中包含了构建可执行应用程序所需的全部文件和配置,以及其他支持型文件,例如分区表、数据/文件系统分区和引导程序。项目配置
:保存在项目根目录下名为 sdkconfig 的文件中,可以通过 idf.py menuconfig 进行修改,且一个项目只能包含一个项目配置。应用程序
:是由 ESP-IDF 构建得到的可执行文件。一个项目通常会构建两个应用程序:项目应用程序(可执行的主文件,即用户自定义的固件)和引导程序(启动并初始化项目应用程序)。组件
:是模块化且独立的代码,会被编译成静态库(.a 文件)并链接到应用程序。部分组件由 ESP-IDF 官方提供,其他组件则来源于其它开源项目。目标
:特指运行构建后应用程序的硬件设备。ESP-IDF 当前仅支持 esp32 和 esp32s2 以及 esp32c3 这三个硬件目标。 注意:- ESP-IDF 并不是项目的一部分,它独立于项目,通过 IDF_PATH 环境变量(保存 esp-idf 目录的路径)链接到项目,从而将 IDF 框架与项目分离。
- 交叉编译工具链并不是项目的组成部分,它应该被安装在系统 PATH 环境变量中。
- Ninja: 构建工具 Ninja 是一个专注于速度的小型构建系统。它将文件的相互依赖关系(通常是源代码和输出可执行文件)作为输入,并快速编排构建它们。一般在Unix/Linux上的程序通过make/makefile来构建编译,而Ninja通过将编译任务并行组织,大大提高了构建速度。
提供了一个前端,可以帮助管理项目的构建过程,它管理了以下工具:
- CMake,配置待构建的项目
- Ninja 或 GNU Make,命令行构建工具
- esptool.py,烧录目标硬件设备
在之前的hello world学习中,已经使用idf.py
完成了hello world的编译与测试。
可以使用idf.py --help
查看帮助文档。这里要注意使用安装ESP-IDF之后的工具ESP-IDF 4.4 CMD
或ESP-IDF 4.4 Powershell
打开的控制台才有用,因为这两个工具打开的时候会设置好CMD的环境变量。
如果要在当前CMD中配置环境变量,需要执行[Espressif安装路径]\frameworks\esp-idf-v4.4\export.bat
命令。
idf.py 工具的常用命令:
- idf.py set-target :设置构建项目的目标(芯片)。
- idf.py menuconfig:运行 menuconfig 工具来配置项目。
- idf.py build:构建在当前目录下找到的项目。构建过程是增量式的,如果自上次构建以来源文件或项目配置没有发生改变,则不会执行任何操作。主要步骤
- 1 根据需要创建 build 构建目录,它用于保存构建过程的输出文件,可以使用 -B 选项修改默认的构建目录。
- 2 根据需要运行 CMake 来配置项目,为主构建工具生成构建文件。
- 3 运行主构建工具(Ninja 或 GNU Make)。默认情况下,构建工具会被自动检测,可以使用 -G 选项显式地指定构建工具。
- idf.py clean:把构建输出的文件从构建目录中删除,从而清理整个项目。下次构建时会强制“重新完整构建”这个项目。清理时,不会删除 CMake 配置输出及其他文件。
- idf.py fullclean:会将整个 build 目录下的内容全部删除,包括所有 CMake 的配置输出文件。下次构建项目时,CMake 会从头开始配置项目。请注意,该命令会递归删除构建目录下的 所有文件,请谨慎使用。项目配置文件不会被删除。
- idf.py flash:会在必要时自动构建项目,并将生成的二进制程序烧录进目标 ESP32 设备中。-p 和 -b 选项可分别设置串口的设备名和烧录时的波特率。
- idf.py monitor:用于显示目标 ESP32 设备的串口输出。-p 选项可用于设置主机端串口的设备名,按下 Ctrl-] 可退出监视器。
多个 idf.py 命令可合并成一个,例如,idf.py -p COM4 clean flash monitor 会依次清理源码树,构建项目,烧录进目标 ESP32 设备,最后运行串口监视器。
环境变量 ESPPORT 和 ESPBAUD 可分别用来设置 -p 和 -b 选项的默认值。在命令行中,重新为这两个选项赋值,会覆盖其默认值。
2.2 新建工程官方文档是叫项目,我习惯叫工程,说明一下,以下的工程=项目,project。
命令:idf.py create-project
例子:idf.py create-project template_prj
在当前路径创建名为template_prj的工程,–path选项可以指定路径。
创建的工程就是[IDF_PATH]\examples\get-started\sample_project中的模板工程。 文件结构:
[工程路径]\template_prj
├── CMakeLists.txt
└── main
├── CMakeLists.txt
└── template_prj.c
这个是最简单的工程,完整的工程的目录树结构可能为:
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/
2.2.2 各文件含义
- CMakeLists.txt 每个项目都有一个顶层 CMakeLists.txt 文件,包含整个项目的构建设置。 为了让cmake正常工作,项目的cmakelist中必须有以下三行代码:
cmake_minimum_required(VERSION 3.5) # 必须放在 CMakeLists.txt 文件的第一行,它会告诉 CMake 构建该项目所需要的最小版本号。ESP-IDF 支持 CMake 3.5 或更高的版本。 include($ENV{IDF_PATH}/tools/cmake/project.cmake) # 导入 CMake 的其余功能来完成配置项目、检索组件等任务。 project(template_prj) # 创建项目本身,并指定项目名称。该名称会作为最终输出的二进制文件的名字,即 template_prj.elf 和 template_prj.bin。每个 CMakeLists 文件只能定义一个项目。
- sdkconfig 项目配置文件,执行 idf.py menuconfig 时会创建或更新此文件,文件中保存了项目中所有组件(包括 ESP-IDF 本身)的配置信息。 sdkconfig 文件可能会也可能不会被添加到项目的源码管理系统中。
- components(option) 可选的 “components” 目录中包含了项目的部分自定义组件,并不是每个项目都需要这种自定义组件,但它有助于构建可复用的代码或者导入第三方(不属于 ESP-IDF)的组件。或者,您也可以在顶层 CMakeLists.txt 中设置 EXTRA_COMPONENT_DIRS 变量以查找其他指定位置处的组件。如果项目中源文件较多,建议将其归于组件中,而不是全部放在 “main” 中。
- main目录 目录是一个特殊的组件,它包含项目本身的源代码。”main” 是默认名称,CMake 变量 COMPONENT_DIRS 默认包含此组件,但您可以修改此变量。
- build目录 存放构建输出的地方,如果没有此目录,idf.py 会自动创建。CMake 会配置项目,并在此目录下生成临时的构建文件。随后,在主构建进程的运行期间,该目录还会保存临时目标文件、库文件以及最终输出的二进制文件。此目录通常不会添加到项目的源码管理系统中,也不会随项目源码一同发布。
每个组件目录都包含一个 CMakeLists.txt 文件,里面会定义一些变量以控制该组件的构建过程,以及其与整个项目的集成。
每个组件还可以包含一个 Kconfig 文件,它用于定义 menuconfig 时展示的 组件配置 选项。某些组件可能还会包含 Kconfig.projbuild 和 project_include.cmake 特殊文件,它们用于 覆盖项目的部分设置。
2.2.3 添加代码打开工程下main/template_prj.c,可以看到程序入口函数app_main,添加代码如下:
#include
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
void app_main(void)
{
while (1)
{
printf("Hello world!\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
功能为:每隔1s在监视器中输出”Hello world!“ 可以看到,此时因为没有为VScode指定头文件路径,所以显示找不到源文件。
解决:VScode 快捷键:ctrl+shift+P,运行C/C++:Edit Configurations (JSON)
添加ESP-IDF路径。这样就可以很方便的查看源文件。
经过之前的学习可以知道,执行idf.py build
命令或者点击VScode图形界面,可以完成项目的构建。
执行idf.py build
命令等效于执行了如下命令:
mkdir -p build
cd build
cmake .. -G Ninja # 或者 'Unix Makefiles'
ninja
cmake 命令对项目进行配置,并生成用于最终构建工具的构建文件。在这个例子中,最终构建工具是 Ninja: 运行 ninja 来构建项目。所以也可以直接通过CMake来构建工程。
3 烧写过程烧写之前,可以通过Vscode图形化界面或者idf.py命令工具来完成串口号的设置。
-
Vscode图形化界面
-
idf.py命令工具
idf.py -p COM3 -b 460800 flash
同样的,烧写的过程也可以使用 Ninja 或者 Make 来完成。 命令:ninja flash
或make app-flash
以这种方式烧录时,可以通过设置 ESPPORT 和 ESPBAUD 环境变量来指定串口设备和波特率。
演示: