物联网

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

2021-06-07  本文已影响0人  Leung_ManWah

一、安装Espressif IDF插件


二、创建新工程

三、工程分析

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文件。该文件包含变量定义,用于控制组件的构建过程及其与整个项目的集成。有关更多详细信息,请参阅组件 CMakeLists 文件

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

3.2 项目CMakeLists文件

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

cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(myProject)

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)

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

上一篇下一篇

猜你喜欢

热点阅读