前言
??上篇介紹了如何用 ESP-IDF插件,去從SDK中創建例程,那么對于我們自己的專案需求,如何修改工程名稱,并添加自定義.c.h模塊組件,編譯為自己的工程呢?
一 創建新工程,查看CMakeList.txt
- 將上節已經編譯過的blink工程洗掉,
- 用ESP-IDF插件重新建立一個空的blink工程,空工程中只有這幾個檔案:

??其中有些檔案是不必要的: - 洗掉
example_test.py、sdkconfig.defaults,

??最后只剩下這些:

??因為當前ESP-IDF使用的編譯工具為CMake,CMake允許用戶撰寫CMakeLists.txt來定制整個編譯流程,然后再根據用戶平臺生成Makefile和工程檔案,意思就是說編譯程序完全依賴于CMakeLists.txt,
??所以我們先看看例程的CMakeList.txt是怎么寫的,
??main/CMakeLists.txt做了哪些事情?:

??只有簡單的一句話,意思是注冊并編譯源檔案blink.c和當前目錄的所有.h頭檔案,
??再看根目錄的CMakeLists.txt做了哪些?:

- 指定運行此組態檔所需的 CMake 最低版本為3.5,
- 指定ESP-IDF應用的CMake組態檔,
- 指定當前工程的名稱為blink,
??下面添加自定義.c.h驅動模塊組件,并對CMakeLists.txt進行修改,來定制自己的工程,
二 修改工程名稱,修改CMakeLists.txt
??由以上大概了解了例程的CMakeLists.txt做了什么,下面開始根據例程,來修改為自己的工程,
-
關閉檔案夾,修改工程檔案夾名稱為
ledBlink后再打開, -
將
blink.c檔案重命名為ledBlink.c,

-
修改
main/CMakeLists.txt檔案來包含ledBlink.c,但打開后發現已經被腳本自動修改了,不用再人為改動,

-
修改
CMakeLists.txt檔案,工程名稱改為ledBlink,

-
查看
Makefile檔案有無例外,將專案名稱同樣改為ledBlink,

-
為了區別于原來的例程,改動
main\ledBlink.c,將閃爍頻率變快,

-
將以上更改全部保存,編譯一遍,看能否成功,

編譯成功,燒錄下載,發現LED閃爍頻率較之前變快,現象正確,

-
如果編譯后出現如下錯誤,提示
CONFIG_BLINK_GPIO未定義,(7現象正確可直接跳過8)

先確保main/Kconfig.projbuild檔案確實存在,之后將build檔案夾整個洗掉,重新編譯,
(因為只有Kconfig.projbuild存在,build編譯后才會在生成的build/config/sdkconfig.h里定義CONFIG_BLINK_GPIO值為5,否則無此定義,)


如不慎將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.c、components/led/include/led.h,并將led-IO初始化、亮、滅這些外設的操作,封裝為函式,包含在驅動檔案中,
??工程結構樣式可以參考SDK中的lcd例程,
- 創建led驅動組件檔案夾
創建components/led/src、components/led/include 這兩個檔案夾,復制CMakeLists.txt、component.mk到components/led下,工程目錄結構如下:

- 創建檔案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
- 修改
components/CMakeLists.txt(腳本不會自動更改,需要人為改動)
set(led_srcs "src/led.c")
idf_component_register(SRCS "${led_srcs}"
INCLUDE_DIRS "include")
- 修改
main\ledBlink.c
#include <stdio.h>
#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);
}
}
- 洗掉build檔案夾后,編譯,下載
現象與上述一致,添加.c.h驅動模塊組件,修改CMakeLists,實作自定義工程成功,

注意事項
- main/Kconfig.projbuild 千萬不要洗掉,會導致生成的 build/config/sdkconfig.h 缺失CONFIG_BLINK_GPIO 定義,
- 如clean后build依舊有錯誤,建議洗掉build檔案夾后重新編譯,
- 工程結構樣式可以參考SDK中的lcd例程,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262458.html
標籤:其他
下一篇:專案設計完結總結
