ESP32学习笔记(21)——构建自己的工程和组件库

Posted Leung_ManWah

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP32学习笔记(21)——构建自己的工程和组件库相关的知识,希望对你有一定的参考价值。

一、安装Espressif IDF插件

  • 点击 扩展(Ctrl+Shift+X),输入 esp,找到 Espressif IDF 进行安装

  • 点击 查看 - 命令面板(Ctrl+Shift+P)。输入 configure esp-idf extension,点击。

  • 使用 ADVANCED 安装

  • 选择本地 ESP-IDF 安装方式,选择 ESP-IDF 的路径

  • ESP-IDF Tools 也同样选择本地

  • 自动安装扩展插件中,等待

  • 报错:pip版本不够,打开cmd,输入 python -m pip install --upgrade pip


  • 安装完成

二、创建新工程

  • VS Code 中点击查看 - 命令面板(或者 Ctrl+Shift+P
  • 输入 show examples projects,点击。
  • 输入 Use current ESP-ID,使用本地 SDK。
  • 最终显示这样的界面。左侧是 SDK 中的 Demo 列表,右侧是 Demo 的功能描述。
  • 点击例程 blink,点击 Create project using example blink
  • 选择一个存放的文件夹。不要有中文路径和空格
  • 之后插件就会以 SDK 中的 blink 为模板,自动创建一个新工程。
  • 修改 blink 工程文件夹名称为 自定义名字(如ledBlink)
  • blink.c 文件重命名为 ledBlink.c
  • 修改 main/CMakeLists.txt 文件来包含 ledBlink.c
  • 修改 CMakeLists.txt 文件,工程名称改为 ledBlink
  • Makefile可不修改,为旧版GNU Make编译,Cmake由CMakeLists.txt控制
  • idf.py flash 编译前先 idf.py fullclean 清空一下
  • 删除 example_test.pysdkconfig.defaults 等不必要的文件

三、工程分析

3.1 项目目录树

示例项目目录树可能如下所示:

- 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/
  • 项目 CMakeLists.txt
    这是 CMake 用来学习如何构建项目的主要文件;并且可以设置项目范围的 CMake 变量。它包括文件/tools/cmake/project.cmake,它实现了构建系统的其余部分。最后,它设置项目名称并定义项目。
  • sdkconfig 项目配置文件
    该文件在运行时创建/更新,并保存项目中所有组件(包括 ESP-IDF 本身)的配置。“sdkconfig”文件可能会也可能不会被添加到项目的源代码控制系统中。idf.py menuconfig
  • 可选的 components 项目组件
    项目不必包含此类自定义组件,但它可用于构建可重用代码或包含不属于 ESP-IDF 的第三方组件。或者,EXTRA_COMPONENT_DIRS 可以在顶层 CMakeLists.txt 中设置以查找其他地方的组件。

每个组件目录都包含一个组件CMakeLists.txt文件。该文件包含变量定义,用于控制组件的构建过程及其与整个项目的集成。有关更多详细信息,请参阅组件 CMakeLists 文件

每个组件还可能包含一个Kconfig定义组件配置选项的文件,可以通过menuconfig. 某些组件还可能包含Kconfig.projbuildproject_include.cmake文件,它们是用于覆盖项目部分的特殊文件。

  • main
    是一个特殊的组件,包含项目本身的源代码。“main”是默认名称,CMake 变量 COMPONENT_DIRS 包含此组件,但您可以修改此变量。
  • build
    创建构建输出的地方。idf.py 如果该目录尚不存在,则创建该目录。CMake 配置项目并在此目录中生成临时构建文件。然后,在主构建过程运行后,该目录还将包含临时目标文件和库以及最终的二进制输出文件。此目录通常不会添加到源代码管理或随项目源代码一起分发。

3.2 项目CMakeLists文件

每个项目都有一个项目 CMakeLists.txt 文件,其中包含整个项目的构建设置。默认情况下,项目 CMakeLists 可以非常小。

cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(myProject)
  • cmake_minimum_required(VERSION 3.5)
    告诉 CMake 构建项目所需的最低版本。ESP-IDF 旨在与 CMake 3.5 或更高版本配合使用。此行必须是 CMakeLists.txt 文件中的第一行。
  • include($ENV{IDF_PATH}/tools/cmake/project.cmake)
    引入其余的 CMake 功能来配置项目、发现所有组件等。
  • project(myProject)
    创建项目本身,并指定项目名称。项目名称用于应用程序的最终的二进制输出文件-即 myProject.elfmyProject.bin。每个 CMakeLists 文件只能定义一个项目。

3.3 组件CMakeLists文件

每个项目都包含一个或多个组件。组件可以是 ESP-IDF 的一部分、项目自己的组件目录的一部分,或者从自定义组件目录中添加。

组件是 COMPONENT_DIRS 列表中包含 CMakeLists.txt 文件的任何目录。

最小组件 CMakeLists.txt 文件只是使用idf_component_register 以下命令将组件注册到构建系统:

idf_component_register(SRCS "foo.c" "bar.c"
                       INCLUDE_DIRS "include"
                       REQUIRES mbedtls)
  • SRCS
    是源文件列表 ( *.c, *.cpp, *.cc, *.S)。这些源文件将被编译到组件库中。
  • INCLUDE_DIRS
    是要添加到需要此组件的任何组件的全局包含搜索路径以及主要源文件的目录列表。
  • REQUIRES
    实际上并不是必需的,但通常需要声明该组件将使用的其他组件。请参阅组件要求

3.4 组件配置Kconfig

每个组件还可以有一个Kconfig文件,与CMakeLists.txt. 这包含要添加到此组件的配置菜单的配置设置。

当 menuconfig 运行时,这些设置可以在“组件设置”菜单下找到。

要创建组件 Kconfig 文件,最容易从随 ESP-IDF 分发的 Kconfig 文件之一开始。

有关示例,请参阅添加条件配置

四、创建新组件

添加 .c.h 组件最简单的方法,是直接将 .c.h 添加到 main 文件夹,之后修改main\\CMakeLists.txt。但此方法并没有将 .c.h 单独划分为模块,删减功能时会很麻烦,不利于大型工程的管理。

第二种,将相似和相关联的方法/函数封装为 .c.h 模块组件,并以文件夹的方式加以区分管理。这样有利于系统对功能部件的删减,利于工程管理。

于是将原先 blink.c 中的 led 控制代码抽离剥出,单独编写外设驱动文件 components/led/src/led.ccomponents/led/include/led.h,并将 led-IO 初始化、亮、灭这些外设的操作,封装为函数,包含在驱动文件中。

4.1 创建LED驱动组件文件夹

创建 components/led/srccomponents/led/include 这两个文件夹。复制 CMakeLists.txtcomponent.mkcomponents/led 下。工程目录结构如下:

4.2 编写LED驱动代码

创建文件 components/led/src/led.ccomponents/led/include/led.h
led.c

#include "led.h"

void led_init(void)
{
    /* Configure the IOMUX register for pad BLINK_GPIO (some pads are
       muxed to GPIO on reset already, but some default to other
       functions and need to be switched to GPIO. Consult the
       Technical Reference for a list of pads and their default
       functions.)
    */
    gpio_pad_select_gpio(LED_GPIO);
    /* Set the GPIO as a push/pull output */
    gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);
}

void led_on(void)
{
    gpio_set_level(LED_GPIO, 1);
}

void led_off(void)
{
    gpio_set_level(LED_GPIO, 0);
}

led.h

#ifndef _LED_H_
#define _LED_H_

#include "sdkconfig.h"
#include "driver/gpio.h"

/* Can use project configuration menu (idf.py menuconfig) to choose the GPIO to blink,
   or you can edit the following line and set a number here.
*/
#define LED_GPIO CONFIG_LED_GPIO

void led_init(void);
void led_on(void);
void led_off(void);

#endif

4.3 修改LED驱动CMakeLists.txt

修改 components/led/CMakeLists.txt

set(led_srcs "src/led.c")

idf_component_register(SRCS "${led_srcs}"
                       INCLUDE_DIRS "include")

4.4 修改main\\Kconfig.projbuild

实现在 menuconfig 中对 LED的GPIO 进行配置

menu "Example Configuration"

    config BLINK_GPIO
        int "Blink GPIO number"
        range 0 34
        default 5
        help
            GPIO number (IOxx) to blink on and off.

            Some GPios are used for other purposes (flash connections, etc.) and cannot be used to blink.

            GPIOs 35-39 are input-only so cannot be used as outputs.

endmenu

4.5 修改main\\ledBlink.c

添加头文件、初始化函数,然后调用函数。


• 由 Leung 写于 2021 年 6 月 3 日

• 参考:乐鑫ESP32开发 1.Vscode创建新工程,编译,下载烧录,监视端口,点亮一个LED
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程
    ESP32开发(4):构建自己的工程

以上是关于ESP32学习笔记(21)——构建自己的工程和组件库的主要内容,如果未能解决你的问题,请参考以下文章

ESP32学习笔记(49)——ESP-WIFI-MESH接口使用

ESP32学习笔记(49)——ESP-WIFI-MESH接口使用

ESP32学习笔记之ESP32-idf环境搭载心得

ESP32学习笔记(24)——OTA(空中升级)接口使用(原生API)

ESP32学习笔记 -- 使用蓝牙BluFi进行设备配网

ESP32学习笔记 -- 使用蓝牙BluFi进行设备配网