Öffnen, F9 drücken, mit F8 Zeile für Zeile durchgehen – in Assembler und in aBelle.
Die Beispiele in Assembler liegen im Ordner examples\esp32 des ZIPs, die in aBelle in examples\abelle\esp32. Jedes läuft mit F9 im RAM des Boards unter dem Debugger; Debug > Write to Flash and Run (Shift+F9) schreibt es in den Flash, dann startet es nach jedem Reset von selbst. Die Register, die ein Beispiel benutzt, stehen in seinen Kommentaren, mit der Quelle.
Was ein Beispiel schreibt, erscheint unter dem Debugger im Reiter Serial neben dem Ausgabefenster, sonst in einem Terminal am COM-Port mit 115200 Baud. Die Ausgaben auf dieser Seite zeigen, wie es aussieht; die Namen der Netze und die Adressen sind geändert.
Xtensa-Code mit .target esp32, im Ordner examples\esp32. Die Quelltexte stehen auch auf GitHub.
blink_ram.asm, blink_flash.asm
Die LED an GPIO 2 an und aus, je eine halbe Sekunde, gezählt mit dem Taktzähler ccount. Zeigt den IO-MUX, die GPIO-Register mit ihren Set- und Clear-Adressen und l32r für 32-Bit-Konstanten. Die Flash-Fassung schaltet am Anfang die Watchdogs ab.
hello_uart_ram.asm, hello_uart_flash.asm
„Hello, world!“ einmal pro Sekunde über UART0, den COM-Port des Boards. Der Text steht in .data im DRAM, wo der Kern Bytes lesen kann. Die Flash-Fassung grüßt bei jedem Start des Boards.
clock_ram.asm
Der Kern vom Quarz (40 MHz) und von der PLL mit 80, 160 und 240 MHz, und wie schnell eine Schleife bei jedem Takt läuft. Zeigt, wie ESP-IDF die PLL einschaltet, in wenigen Registern.
console.asm
Ein kleines Betriebssystem in Assembler: ein Dateisystem im Flash, Befehle für jedes Terminal (ls, cat, put, rm, df, run, boot) und die Pakete, mit denen das Fenster Board Files von Asmonite spricht.
Programme mit target "esp32", im Ordner examples\abelle\esp32. Sie brauchen nur das Board und das USB-Kabel. Text und Zahlen schreiben sie mit inc\uart.abel.
blink.abel
Die LED an GPIO 2 an und aus. Die Register als Feld an ihrer Adresse, eine Funktion des ROM mit at, und watchdogs_off(), damit das Programm auch aus dem Flash läuft.
hello_uart.abel
„Hello, world!“ und ein Zähler, etwa einmal pro Sekunde über UART0. Zeigt den FIFO des UART und wie man wartet, bis er Platz hat.
chipinfo.abel
Die MAC-Adresse, die Bauform und die Revision aus den eFuses, dazu die Größe des Flash aus seiner JEDEC-ID. In den eFuses steht sie nicht.
clock.abel
Schaltet den Kern alle sechs Sekunden auf 40, 20 und 10 MHz und misst, wie schnell eine Schleife läuft. Die LED blinkt bei jedem Takt gleich schnell, weil der Timer mitgeht.
timer.abel
Timer 0 der Timergruppe 0 zählt Mikrosekunden. Die LED blinkt, und jede Sekunde schreibt das Programm, wie lange es läuft.
dice.abel
Der Zufallsgenerator des ESP32: erst 600 Würfe und wie oft jede Zahl kam, dann ein Wurf pro Sekunde.
reaction.abel
Nach 2 bis 5 Sekunden geht die LED an; drück so schnell du kannst den Knopf BOOT. Das Programm schreibt deine Zeit und deine beste. Zeigt einen Pin als Eingang mit Pull-up.
sieve.abel
Ein Benchmark: die Primzahlen unter 20000, zehnmal, und die Zeit dafür. Das Feld des Siebs hat 20000 Bytes im DRAM.
temperature.abel
Der Temperatursensor im Chip, jede Sekunde sein Rohwert. Leg einen Finger auf das Modul, und der Wert steigt. Der Sensor ist nicht kalibriert; er zeigt Änderungen besser als Grad.
inc\network.abel den Namen und das Passwort deines WLAN eintragen (2,4 GHz, offen oder WPA2).run name in der Konsole oder als Autostart starten.Jedes WLAN-Beispiel verbindet sich zuerst, holt eine Adresse per DHCP und schreibt sie. Das Programm läuft auf dem ersten Kern, das WLAN auf dem zweiten: An einem Breakpoint bleibt die Verbindung stehen.
connecting to my-network connected ip: 192.168.1.73 mask: 255.255.255.0 router: 192.168.1.1 dns: 192.168.1.1 lease: 864000 s
scan.abel
Die WLAN-Netze in der Nähe: Signal, Kanal, Schutz, BSSID und Name. Braucht nur Install WiFi, kein Passwort.
-45 dBm ch 1 WPA2 02:11:22:33:44:01 my-network -74 dBm ch 1 WPA/WPA2 02:11:22:33:44:02 neighbour -84 dBm ch 6 WPA2/WPA3 02:11:22:33:44:03 cafe
dhcp.abel
Die ersten Frames von aBelle über das WLAN: ein DHCP-DISCOVER, von Hand gebaut, und das OFFER des Routers mit der Adresse, die er vergeben würde.
discover sent: 0 offer: 192.168.1.73 from 192.168.1.1
dns.abel
Namen in Adressen, beim DNS-Server des Routers, mit der Zeit jeder Antwort; ein Name mit CNAME und einer, den es nicht gibt. Dann alle noch einmal, aus dem Cache des Servers.
example.com = 172.66.147.243 (42 ms) no-such-name.invalid: no address
ping.abel
Vier ICMP-Echo-Anfragen an den Router und an einen Server im Internet, wie der Ping eines PCs, mit TTL und Zeit. Pings an das Board beantwortet jedes Beispiel von selbst.
reply from 192.168.1.1: seq 1, ttl 64, 3 ms 4 sent, 4 received, 0 % lost, min/avg/max 2/3/5 ms
ntp.abel
Fragt den Zeitserver der PTB in Braunschweig per NTP (UDP, Port 123) und zeigt Datum und Uhrzeit.
dns: ptbtime1.ptb.de = 192.53.103.108 time: 2026-11-10 06:50:48 UTC, 2026-11-10 07:50:48 CET
arpscan.abel
Fragt per ARP jede Adresse des Netzes ab und listet jedes Gerät, das antwortet, mit seiner MAC; auch Geräte, die keine Pings beantworten. Markiert MACs, die sich ein Gerät selbst ausgedacht hat.
wol.abel
Schickt das „Magic Packet“ an einen PC, der damit aus dem Ruhezustand startet. Die MAC des PCs trägst du in wol_target() ein.
Mit net_set_name und mdns_start hat das Board einen Namen im Netz: http://esp32.local/ statt der Adresse. TCP kann eine Verbindung zur Zeit, als Client oder Server.
udpecho.abel, udpecho.py
Schickt jedes UDP-Paket an Port 7777 an seinen Absender zurück. Auf dem PC: python udpecho.py mit der Adresse des Boards.
listening on 192.168.1.73:7777 (mask 255.255.255.0) echo 1: 6 bytes from 192.168.1.20:61940 echo 1
httpget.abel
Findet example.com per DNS, öffnet eine TCP-Verbindung zu Port 80, schickt ein GET und zeigt die Statuszeile, den Titel und die Länge der Seite.
tcp: connected in 26 ms status: HTTP/1.1 200 OK title: Example Domain bytes: 928
webserver.abel
Beantwortet jede Anfrage an Port 80 mit einer kleinen Seite: die Nummer der Anfrage, die Sekunden seit dem Start, die erste Zeile der Anfrage. Im Browser: http://esp32.local/.
telnetd.abel
Eine kleine Shell auf Port 23: telnet esp32.local (Windows: das Feature „Telnet-Client“ oder PuTTY). Die Dateien des Boards (ls, cat, hex, df), Speicher (mem), Netz (ip, ping, dns), die LED und ein Reset. Mit boot telnetd in der Konsole startet sie nach jedem Reset.
Die Bausteine dahinter, DHCP, DNS, ARP, ICMP, UDP, TCP und mDNS, stehen in aBelle in inc\net.abel und inc\tcp.abel. Im Debugger kannst du durch jeden Schritt gehen, während die Verbindung auf dem zweiten Kern weiterläuft.
Für Windows und DOS, mit dem Code, den der Assembler daraus macht.