Inhaltsverzeichnis
Dieser Beitrag baut auf den vorherigen Artikel ESP-IDF: Erste Schritte – LED-Blink-Programm auf, in dem wir schon ein funktionierendes Projekt mit VS Code erstellt haben.
Zum Erstellen eines leeren sauberen Projektes, können wir ein Projekt wählen, welches wir bereits mit VS Code sauber erstellt haben und es fehlerfrei läuft. Der Ordner .vscode muss enthalten sein, da wir hier schon unsere Konfiguration für den ESP JTAG-Debugger, in der launch.json, eingerichtet haben.
Ein leeres Projekt hat den Vorteil, dass wir unsere eigene Minimalanforderung implementieren können, ohne jedes Mal ein Beispielprojekt von Espressif laden zu müssen.
Ich habe an dieser Stelle bewusst nicht die Option gewählt, ein Projekt über den „New Project Wizard“ in VS Code zu erstellen, das immer auf Beispielprojekten aus der ESP-IDF basiert. Das hatten wir bereits in ESP-IDF in Visual Studio Code einrichten – vollständige VS Code Anleitung behandelt.
Die sauberste Lösung ist, ein bestehendes Projekt zu nehmen, welches wir schon mit VS Code gebaut haben, in dem schon der Debugger integriert ist und alles funktioniert. Diesen Code können wir z.B. in einen Ordner C:\esp_CleanMasterTemplate packen, bereinigen und neue Projekte immer von diesem Code aus starten.
Man kann sich auch mehrere Clean Templates gestalten, die unterschiedliche Anforderungen haben und die die Codeteile enthalten, mit denen man am häufigsten arbeitet. Z.B. mit vorkonfiguriertem WLAN oder GPIOs etc.
Ich verwende meist ein einfaches Template, welches nur die wesentlichen #includes und nur die app_main() enthält.
/*
Leeres Projekt
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
void app_main(void)
{
}
Beispielcode – Leeres Code Template
Für das Template können wir uns am besten ein Beispielprojekt „Beispielcode – einfache blinkende LED“ aus ESP-IDF: Erste Schritte – LED-Blink-Programm wählen.
Wenn wir die Variante haben möchten, in der der ESP-JTAG-Debugger schon funktionsfähig im neuen Projekt eingebunden ist, können wir die Erweiterung aus ESP32 JTAG Debugging einrichten – FT2232, ESP-PROG und VS Code nehmen, in der wir den Debugger konfiguriert haben. Ich persönlich würde dieses Projekt empfehlen. Hier ist es wichtig, dass der .vscode-Ordner im Projekt Ordner enthalten ist und die konfigurierte launch.json im .vscode-Ordner. Hier müssen wir minimale Änderungen vornehmen, damit der Debugger beim Erstellen eines neuen Projektes funktioniert.
Leeres Template erstellen
Wir erstellen einen leeren Ordner unter C:\ z.B. C:\esp_CleanMasterTemplate und kopieren den gesamten Ordner eines funktionierenden Projektes rein, in unserem Fall den ErstesProjekt-Ordner aus dem Projekte Ordner, esp_projekte.
Benennt das Template Projekt nach Belieben um, z.B. in IDF_CleanTemplate und öffnet den Ordner. Jetzt seht ihr dort Ordner und Dateien, die wir nicht benötigen (Abb. 1). Wir brauchen nur die Dateien
CMakeLists.txtsdkconfig.defaults,
und die Ordner
.vscodemainmanaged_components.
Alles andere könnt ihr komplett aus dem Ordner löschen (Abb. 2).

Abb. 1 – Gebautes Projekt, mit allen Datein und Ordnern

Abb. 2 – Nach dem Löschen der unnötigen Elemente
CMake anpassen
Wir haben zwei CMake-Dateien, einen im Projekte-Ordner und einen im main-Ordner. Diese beiden sollten wir für unser Template etwas modifizieren, damit wir nicht verwirrende Projektnamen verwenden. Aber funktionieren würde das Tempalte auch jetzt schon.
Wir öffnen CMakeLists.txt und ändern dort den internen Parameter ErstesProjekt in project(ErstesProject), auf z.B. app also project(app).
# 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)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
# "Trim" the build. Include the minimal set of components, main, and anything it depends on.
idf_build_set_property(MINIMAL_BUILD ON)
project(app)
Beispielcode – CMakeLists anpassen
Dieser Parameter legt den internen Projektnamen fest. ESP-IDF erzeugt daraus:
- app.elf
- app.bin
- app.map
und alles landet im build-Ordner.
Aus diesem Grund müssen wir gleich noch diesen Teil in der launch.json im Ordner .vscode anpassen, was wir jetzt tun werden. Dafür öffnen wir die launch.json im .vscode-Ordner und passen den Teil
"program": "${workspaceFolder}/build/ErstesProjekt.elf",
an und schreiben dort den Parameter rein den wir in der CMake ausgewählt haben. In unseren Fall app.
"program": "${workspaceFolder}/build/app.elf",
Dann sollte das Ganze so aussehen:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "ESP32 OpenOCD",
"type": "cppdbg",
"request": "launch",
"cwd": "${workspaceFolder}/build",
"program": "${workspaceFolder}/build/app.elf",
"miDebuggerPath": "C:/Espressif/tools/xtensa-esp-elf-gdb/16.2_20250324/xtensa-esp-elf-gdb/bin/xtensa-esp32-elf-gdb.exe",
"setupCommands": [
{"text": "target remote 127.0.0.1:3333"},
{"text": "set remote hardware-watchpoint-limit 2"},
{"text": "monitor reset halt"},
{"text": "flushregs"}
]
}
]
}
Angepasste launch.json
Als letzten Punkt suchen wir uns noch einen sinnvollen Namen für unsere main.c Datei aus und ändern diese von – in unserem Beispiel noch blink_example_main.c in z.B. main.c. Dann ist es klar, eindeutig und sauber.
Damit das Projekt dann auch richtig gebaut wird, passen wird das noch in CMake an, also in der CMakeLists.txt im main-Ordner. Hier müssen wir für die .c-Datei den Namen eintragen den wir für unsere .c-Datei gewählt haben, also main.c.
Dann sollte das Ganze so aussehen:
idf_component_register(SRCS "main.c" INCLUDE_DIRS ".")
Damit sind wir fertig und können ein sauberes Projekt erstellen.
Hinweis: In der CMakeLists-Datei, ist aktuell idf_build_set_property(MINIMAL_BUILD ON) auf ON gesetzt. Das bedeutet, dass beim Bauen des Projektes nicht alle Komponenten eingebunden werden, sondern nur die Wichtigsten.
Nach diesem Build-Vorgang wird ein #include "driver/i2c_master.h" nicht erkannt, da der I2C-Treiber nicht eingebunden wurde. Sollen Alle Komponenten eingebunden, setzen wird Minimal Build auf OFF, idf_build_set_property(MINIMAL_BUILD OFF). Jetzt dauert das Bauen des ersten Projektes länger, aber alle Komponenten werden eingebungen. Für den Anfang werden aber nicht alle Elemente benötigt, deswegen habe ich das Minimal Build aktiviert.
Es ist wichtig das zu wissen, da man sonst unnötig lange mit dem Suchen nach Fehlern verbringt, die keine Sind.
Weitere Infos dazu gibt unter Build System.
Projekt erstellen
Für ein neues Projekt nehmen wir jetzt unseren IDF_CleanTemplate-Ordner und kopieren ihn vollständig an einen Ort, an dem wir unsere neuen Projekte erstellen möchten. In meinem Fall in C:\esp_projekte. Jetzt können wir den Ordner nach Belieben umbennen und einen passenden Projektnamen wählen.
Jetzt öffnen wir VS Code -> Open Folder, markieren unser Template, klicken auf ok, fertig. Unser leeres Projekt erscheint sauber, wie in Abb. 3.

Abb. 3 – leeres Projekt in VS Code
Am besten öffnen wir jetzt das ESP-IDF Terminal
und bauen das Projekt einmal mit idf.py build oder über das Werkzeugsymbol in der Aktivitätsleiste
. Fullclean ist nicht erforderlich, da wir keinen build-Ordner haben und somit nichts zum Bereinigen vorhanden ist.
Das Bauen eines neuen Projektes dauert wieder eine kleine Weile. Es kann schon 2 Minuten dauern. Die erforderlichen Dateien und Ordner werden jetzt erzeugt, wie z.B. der build-Ordner.

Abb. 4 – Nach dem ersten Bauen

Abb. 5 – Nach dem ersten Bauen in VS Code
Jetzt können wir wie gewohnt Programmieren und auch Debuggen.