目的
工作需要,今年开个新坑ESP32。纯小白,很多地方也是自己摸索的,可能有写地方会误人子弟,看客们见谅。
环境
ESP-IDF v5.2.1
使用ESP-IDF的sample_example模板新建工程。目录如下:
文档的结构树是:
--项目目录:
--build
--components (这个是esp-idf帮我创建项目的时候,把esp-idf根目录下的组件库复制到项目的文件夹内产生的)
--main
--main.c
--cmakelists.txt
--User_components
--system (我自己创建的组件库 可以理解为 C51里面的外设头文件和外设.c)
--user_system.c
--user_system.h
--cmakelists.txt (自己编写的 cmakelists 每一个组件都需要一个单独的cmakelist)
--CMakelists.txt (项目文件夹下的cmakelists)
--sdkconfig
大致说一下就是项目目录下有一个cmakelists,mian文件夹内也有一个cmakelists,项目目录的cmakelists是cmake这个工具帮我们构建项目的入口(?)大致是这个意思。
在项目目录下的cmakelists.txt中:
# For more information about build system see
# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html
# The following five lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.16)
set(EXTRA_COMPONENT_DIRS "./User_components/system")
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(ts1)
比较重要的是这句:set(EXTRA_COMPONENT_DIRS "./User_components/system")
意思就是 设置外部组件的目录是 (相对项目目录cmakelists.txt位置) ./User_components/system
,如果不加这一句,那么就无法找到自己编写的组件的头文件。
在main.c中写:
#include <stdio.h>
#include "user_system.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
const char *TAG = "example";
unsigned char s_led_state = 0;
void app_main(void)
{
configure_led();
while (1)
{
blink_led();
s_led_state = !s_led_state;
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
这里是可以顺利找到user_system.h这个头文件的。
user_system.h内容:
#ifndef __USER_SYSTEM_H
#define __USER_SYSTEM_H
#define BLINK_GPIO CONFIG_BLINK_GPIO
extern const char *TAG;
extern unsigned char s_led_state;
void blink_led(void);
void configure_led(void);
#endif /*__USER_SYSTEM_H*/
user_system.c内容:
#include "user_system.h"
#include "driver/gpio.h"
#include "esp_log.h"
void blink_led(void)
{
/* Set the GPIO level according to the state (LOW or HIGH)*/
gpio_set_level(33, s_led_state);
}
void configure_led(void)
{
ESP_LOGI(TAG, "Example configured to blink GPIO LED!");
gpio_reset_pin(33);
/* Set the GPIO as a push/pull output */
gpio_set_direction(33, GPIO_MODE_OUTPUT);
}
在没有编写User_components/system/CMakelists.txt
文件前,编译时是会报错的,会提示找不到driver/gpio.h
文件,查询了很多教程和博客之后,得知system组件的cmake需要这样写:
idf_component_register( SRCS "user_system.c"
INCLUDE_DIRS "."
REQUIRES driver)
其实跟main.c的cmake很相似,但是main.c目录下的cmake不需要第三句 REQUIRES drive,是因为espidf自动帮main这个组件包含了一些默认组件,但是我们自己创建的组件就没有包含,需要自己声明需要用到的组件的依赖。
在这里卡了很久,因为我一直想要按照之前的开发思路来开发ESP32,也就是每个外设单独弄一个头文件和c文件,这样方便以后读代码,也算是好习惯。但我自己创建的组件一直报错找不到 drive/gpio.h
这个头文件的位置,找的也是晕头转向,也是由于ESP-IDF的教程太少了,也是怪自己粗心,我一直把driver敲错了,敲成了dirver,两个字母顺序的差别,卡了我很久,这里输对了之后user_system.c
里面就可以正常的包含gpio.h的头文件了,可以调用API接口了。然后就是项目文件夹的那个cmakelists,我把我自己创建的User_components
敲漏了一个s,所以在编译main.c的头文件一直报错找不到user_system.h,输对之后,main.c的报错也解决了。
所有问题基本已经解决,自己添加组件,组件添加依赖的问题基本解决。下一篇再试试,自己添加两个组件,测试一下这两个组件如果放的位置不同,项目目录下的cmakelists需要怎么改。