ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程

前言

  上篇介绍了如何用 ESP-IDF插件,去从SDK中创建例程。那么对于我们自己的项目需求,如何修改工程名称,并添加自定义.c.h模块组件,编译为自己的工程呢?

一 创建新工程,查看CMakeList.txt

  1. 将上节已经编译过的blink工程删除。
  2. 用ESP-IDF插件重新建立一个空的blink工程,空工程中只有这几个文件:
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第1张图片
      其中有些文件是不必要的:
  3. 删除 example_test.pysdkconfig.defaults
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第2张图片
      最后只剩下这些:
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第3张图片

  因为当前ESP-IDF使用的编译工具为CMakeCMake允许用户编写CMakeLists.txt来定制整个编译流程,然后再根据用户平台生成Makefile工程文件。意思就是说编译过程完全依赖于CMakeLists.txt
  所以我们先看看例程的CMakeList.txt是怎么写的。
  main/CMakeLists.txt做了哪些事情?:
ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第4张图片
  只有简单的一句话,意思是注册并编译源文件blink.c和当前目录的所有.h头文件。
  再看根目录的CMakeLists.txt做了哪些?:
ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第5张图片

  • 指定运行此配置文件所需的 CMake 最低版本为3.5。
  • 指定ESP-IDF应用的CMake配置文件。
  • 指定当前工程的名称为blink。

  下面添加自定义.c.h驱动模块组件,并对CMakeLists.txt进行修改,来定制自己的工程。

二 修改工程名称,修改CMakeLists.txt

  由以上大概了解了例程的CMakeLists.txt做了什么,下面开始根据例程,来修改为自己的工程。

  1. 关闭文件夹,修改工程文件夹名称为ledBlink后再打开。

  2. blink.c文件重命名为ledBlink.c
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第6张图片

  3. 修改main/CMakeLists.txt文件来包含ledBlink.c。但打开后发现已经被脚本自动修改了,不用再人为改动。
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第7张图片

  4. 修改CMakeLists.txt文件,工程名称改为ledBlink
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第8张图片

  5. 查看Makefile文件有无异常,将项目名称同样改为ledBlink
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第9张图片

  6. 为了区别于原来的例程,改动main\ledBlink.c,将闪烁频率变快。
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第10张图片

  7. 将以上更改全部保存,编译一遍,看能否成功。
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第11张图片
    编译成功,烧录下载,发现LED闪烁频率较之前变快,现象正确。
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第12张图片

  8. 如果编译后出现如下错误,提示 CONFIG_BLINK_GPIO 未定义。(7现象正确可直接跳过8)
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第13张图片
    先确保 main/Kconfig.projbuild 文件确实存在,之后将build文件夹整个删除,重新编译。
    (因为只有Kconfig.projbuild存在,build编译后才会在生成的 build/config/sdkconfig.h 里定义CONFIG_BLINK_GPIO值为5。否则无此定义。)
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第14张图片
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第15张图片
    如不慎将 main/Kconfig.projbuild 文件删除,建议将 main\ledBlink.c 中的CONFIG_BLINK_GPIO 直接改为5,删除build文件夹后,重新编译。

三 添加.c.h驱动模块组件

  添加.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初始化、亮、灭这些外设的操作,封装为函数,包含在驱动文件中。

  工程结构样式可以参考SDK中的lcd例程

  1. 创建led驱动组件文件夹
    创建components/led/src、components/led/include 这两个文件夹。复制CMakeLists.txt、component.mk到components/led下。工程目录结构如下:
    ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第16张图片
  2. 创建文件components/led/src/led.c、components/led/include/led.h。编写led驱动代码。

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(BLINK_GPIO);
    /* Set the GPIO as a push/pull output */
    gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
}

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

void led_off(void)
{
     
    gpio_set_level(BLINK_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 BLINK_GPIO CONFIG_BLINK_GPIO

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

#endif

  1. 修改components/CMakeLists.txt(脚本不会自动更改,需要人为改动)
set(led_srcs "src/led.c")

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


  1. 修改main\ledBlink.c

#include 
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "led.h"

void app_main(void)
{
     
    led_init();
    while(1) {
     
        /* Blink off (output low) */
	printf("Turning off the LED\n");
        led_off();
        vTaskDelay(200 / portTICK_PERIOD_MS);
        /* Blink on (output high) */
	printf("Turning on the LED\n");
        led_on();
        vTaskDelay(200 / portTICK_PERIOD_MS);
    }
}

  1. 删除build文件夹后,编译,下载
    现象与上述一致。添加.c.h驱动模块组件,修改CMakeLists,实现自定义工程成功。

ESP32开发 2.添加.c.h并修改CMakeLists,来定制自己的工程_第17张图片

注意事项

  • main/Kconfig.projbuild 千万不要删除。会导致生成的 build/config/sdkconfig.h 缺失CONFIG_BLINK_GPIO 定义。
  • 如clean后build依旧有错误,建议删除build文件夹后重新编译。
  • 工程结构样式可以参考SDK中的lcd例程

你可能感兴趣的:(ESP32,esp32,嵌入式,物联网,单片机,iot)