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):构建自己的工程

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容