Hier dargestellt ist die Pinbelegung des ESP32_Devkit_V mit 38 PINs. Der Übersichtlichkeit halber handelt es sich hier um eine vereinfachte Darstellung. In der Regel sind viele PINs mehrfach belegt. Darauf gehe ich im Einzelnen noch ein.
Die wichtigsten Funktionen der einzelnen PINs sind oben dargestellt.
Hier eine Kurzbeschreibung der weiteren Funktionen der PINs:
- Input-Pins: EN, GPIO 34, 35, 36, 39
- Touch: GPIO 32, 33, 27, 14, 12, 13, 15, 2, 0, 4
- PWM: alle Output-PINs, außer GPIO 34 bis 39
- HIGH beim BOOT: PINs 1, 3, 5, 14, 15 (Wenn hier LED oder z.B. Relais angeschlossen sind, führt das zu ungewollten Zuständen!)
- DAC: GPIO 25, 26 (Digital nach Analog Converter)
- ADC: GPIO 0, 2, 4, 12-15, 25-27, 32-39 (Analog nach Digital Converter)
- Nicht nutzen: GPIO 6 – 11. Diese Pins sind intern mit dem Flash verbunden
CPU und interner Speicher
- Der ESP32-DOWD hat einen Dual-Core Xtensa 32-bit LX6 MCU
- Interner Speicher mit 448 KB ROM für Boot und Kernfunktionen
- 520 KB SPAM für Daten und Anweisungen
- Der ESP32 verfügt über 8 Kilobyte (KB) SRAM-Speicher,
der im RTC-Bereich angesiedelt ist. Dieser Speicherbereich wird als RTC FAST Memory bezeichnet.
Dieser spezielle Speicherbereich kann zur Speicherung von Daten verwendet werden, die während des Deep-Sleep-Modus des ESP32 erhalten bleiben sollen. Deep-Sleep ist ein Energiesparmodus, bei dem der Großteil des Chips ausgeschaltet ist, aber der RTC und der RTC FAST Memory aktiv bleiben können.
Hier ist ein einfacher Beispielcode, der zeigt, wie du den RTC FAST Memory im ESP32 nutzen kannst:
#include <esp_sleep.h> // Variable im RTC FAST Memory RTC_DATA_ATTR int bootCount = 0; void setup() { Serial.begin(115200); // Erhöhen des Boot-Zählers bootCount++; Serial.print("Boot count: "); Serial.println(bootCount); // Simuliere eine Aufgabe, dann gehe in den Deep-Sleep-Modus delay(1000); // Warte eine Sekunde // Gehe für 10 Sekunden in den Deep-Sleep-Modus esp_sleep_enable_timer_wakeup(10 * 1000000); // 10 Sekunden in Mikrosekunden esp_deep_sleep_start(); } void loop() { // Dieser Code wird nicht ausgeführt, da der ESP32 im Deep-Sleep-Modus ist }
In oben angeführtem Beispiel wird eine Variable bootCount im RTC FAST Memory gespeichert und jedes Mal, wenn der ESP32 aufwacht, wird der Zähler erhöht. Der ESP32 geht dann wieder in den Deep-Sleep-Modus, und beim nächsten Aufwachen ist der Wert von bootCount
weiterhin verfügbar.
- 8 KB SRAM im RTC (Real-Time Clock):
Der ESP32 verfügt über 8 Kilobyte (KB) SRAM-Speicher, der im RTC-Bereich angesiedelt ist. Dieser Speicherbereich wird als RTC SLOW Memory bezeichnet.
Im Gegensatz zum RTC FAST Memory, der nach dem Aufwachen vom Hauptprozessor genutzt wird, kann der RTC SLOW Memory vom Co-Prozessor während des Deep-Sleep-Modus aktiv verwendet werden. Das ermöglicht es, bestimmte Aufgaben im Energiesparmodus auszuführen, ohne den Hauptprozessor zu wecken.
Hier ist ein einfacher Beispielcode, der zeigt, wie du den RTC SLOW Memory im ESP32 nutzen kannst:
// Einfache Funktion zur Demonstration des Co-Prozessors (ULP) und RTC SLOW Memory #include "esp_sleep.h" #include "driver/rtc_io.h" RTC_DATA_ATTR int counter = 0; // Variable im RTC SLOW Memory void setup() { Serial.begin(115200); delay(1000); // Kurze Verzögerung, um die serielle Verbindung zu stabilisieren if (esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_ULP) { // Der Co-Prozessor hat das Aufwachen ausgelöst Serial.println("Woken up by the ULP co-processor"); counter++; } else { // Normaler Start oder Aufwachen aus einem anderen Grund Serial.println("Normal boot or other wakeup source"); } Serial.print("Counter value: "); Serial.println(counter); // Hier könntest du den ULP programmieren, um z.B. einen Sensor zu überwachen // Beispiel: ULP konfigurieren und in den Deep-Sleep-Modus gehen esp_sleep_enable_ulp_wakeup(); esp_deep_sleep_start(); } void loop() { // Dieser Code wird nicht ausgeführt, da der ESP32 im Deep-Sleep-Modus ist }
In diesem Beispiel wird eine Variable counter
im RTC SLOW Memory gespeichert und der Co-Prozessor kann den ESP32 aus dem Deep-Sleep-Modus wecken, wodurch der Zähler erhöht wird. Der Hauptprozessor kann dann den neuen Wert von counter lesen, wenn er aufwacht.
eFuse-Speicher
Der ESP32 verfügt über 1 Kbit (Kilobit) eFuse-Speicher. Dieser Speicher wird verwendet, um dauerhafte und unveränderbare Daten zu speichern, die wichtig für die Konfiguration und Sicherheit des Chips sind.
256 Bits für das System: Von den insgesamt 1024 Bits sind 256 Bits für das System reserviert. Diese Bits werden für wichtige Informationen verwendet wie:
MAC-Adresse: Die eindeutige MAC-Adresse des Chips, die für Netzwerkkommunikation und Geräteidentifikation verwendet wird.
Chip-Konfiguration: Konfigurationsdaten, die für den Betrieb des Chips notwendig sind.
768 Bits für Kundenanwendungen: Die verbleibenden 768 Bits sind für die Nutzung durch den Anwender reserviert. Diese Bits können für verschiedene Anwendungen verwendet werden, darunter:
Flash-Verschlüsselung: Speichern von Schlüsseln und Konfigurationsdaten, die für die Verschlüsselung des Flash-Speichers notwendig sind. Dies erhöht die Sicherheit, indem es den Zugriff auf den Flash-Speicher ohne entsprechende Berechtigungen verhindert.
Chip-ID: Speichern einer eindeutigen Identifikationsnummer des Chips, die für verschiedene Anwendungen genutzt werden kann, z.B. zur Authentifizierung oder Identifikation des Geräts.
Beschreibung des externen SPI-Flash-Speichers
Beide Module, ESP32-WROOM-32D und ESP32-WROOM-32U, integrieren einen 4 MB (Megabyte) großen externen SPI-Flash-Speicher. Dieser Speicher wird verwendet, um Firmware, Anwendungen und Daten zu speichern, die vom ESP32 benötigt werden.
Wichtige Punkte
- Integrierter SPI-Flash-Speicher:
- 4 MB Speicherplatz: Beide Module verfügen über einen 4 MB großen SPI-Flash-Speicher, der ausreichend Platz für Anwendungen und Daten bietet.
- Externer Speicher: Der Speicher ist extern zum ESP32-Chip, aber auf demselben Modul integriert.
- Verbindung zu GPIO-Pins:
- Der SPI-Flash-Speicher ist mit bestimmten GPIO-Pins (General Purpose Input/Output) des ESP32 verbunden. Dies sind die Pins GPIO6, GPIO7, GPIO8, GPIO9, GPIO10 und GPIO11.
- GPIO-Pins als Kommunikationsschnittstelle: Diese Pins werden verwendet, um die Kommunikation zwischen dem ESP32-Chip und dem SPI-Flash-Speicher zu ermöglichen. SPI (Serial Peripheral Interface) ist ein Kommunikationsprotokoll, das häufig für die Verbindung von Mikrocontrollern mit externen Peripheriegeräten wie Flash-Speichern verwendet wird.
- Einschränkungen der GPIO-Pins:
- Nicht als reguläre GPIOs nutzbar: Die sechs genannten Pins (GPIO6 bis GPIO11) können nicht als normale GPIOs verwendet werden. Das bedeutet, dass sie nicht für andere Zwecke wie das Lesen von Sensoren oder das Steuern von LEDs verwendet werden können.
- Reserviert für SPI-Flash: Diese Pins sind ausschließlich für die Kommunikation mit dem SPI-Flash-Speicher reserviert und sollten nicht für andere Aufgaben konfiguriert werden.
Warum ist das wichtig?
- Verständnis der Pinbelegung: Wenn du ein Projekt mit dem ESP32-WROOM-32D oder ESP32-WROOM-32U entwickelst, ist es wichtig zu wissen, welche Pins verfügbar sind und welche reserviert sind. Dadurch vermeidest du Konfigurationskonflikte und stellst sicher, dass dein Projekt reibungslos funktioniert.
- Speichermanagement: Der externe SPI-Flash-Speicher bietet zusätzlichen Speicherplatz für größere Firmware und Daten, die über den internen Speicher des ESP32 hinausgehen. Dies ist besonders nützlich für komplexere Anwendungen, die mehr Speicher benötigen.
Taktfrequenz: 40 MHz
Die oben gemachten Angaben sind nicht vollständig, sollten aber für einen großen Teil deiner Projekte ausreichend sein und darüber hinaus zu weiterer Beschäftigung mit dem ESP32 anregen.
Hast du Fragen oder Anregungen, nutze bitte die Kommentarfunktion und gib mir Feedback.