CommunityCodierung & Entwicklunggithub.com

stm32-firmware

STM32-Firmwareentwicklung mit STM32CubeMX / STM32CubeIDE + HAL/LL und PlatformIO – Projektstruktur und USER CODE-Regeln, Peripherie (UART/I2C/SPI/ADC/Timer/DMA), Taktgeber, Low Power, Flash/Option Bytes, Kommandozeilen-Build, Flashen und Debuggen mit ST-Link (STM32CubeProgrammer CLI, OpenOCD, GDB, SWV) sowie HardFault-Analyse.

Was ist stm32-firmware?

Dieses Skill ist speziell für die Entwicklung von STM32-Firmware konzipiert und deckt die gesamte Bandbreite von der Projektinitialisierung bis zur Fehleranalyse ab. Es unterstützt die gängigsten Entwicklungsumgebungen wie STM32CubeMX/CubeIDE und PlatformIO und stellt sicher, dass alle projektspezifischen Konfigurationen – wie der genaue Mikrocontroller-Typ, die verwendete HAL/LL-Bibliothek oder ein eventuelles RTOS – korrekt identifiziert werden. Das Skill enthält wichtige Regeln für das Arbeiten mit CubeMX-generiertem Code, insbesondere die Beachtung der USER CODE-Blöcke, um Datenverlust durch Code-Regeneration zu vermeiden. Es bietet zudem detaillierte Anleitungen für das Erstellen, Flashen und Debuggen von STM32-Projekten über die Kommandozeile und gibt praxisnahe Hinweise zu häufigen Fehlern bei der HAL-Nutzung, z.B. bei I2C-Adressen, UART-Empfang oder DMA-Puffern. Bei Abstürzen oder Startproblemen leitet das Skill systematisch durch die Analyse von HardFaults und anderen Fehlern, inklusive der Decodierung des gestackten Programmzählers und der Überprüfung der ST-Link-Verbindung. Es arbeitet eng mit dem Skill `embedded-c-cpp` zusammen, um allgemeine C/C++-Qualität, Tests und Architektur abzudecken.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/budenga/firmware-skills/tree/HEAD/skills/stm32-firmware

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

STM32-Firmware (CubeMX/HAL + PlatformIO, ST-Link)

Lade auch embedded-c-cpp für Codierungsstandards, Architektur, Unit-Tests und allgemeines Debugging. Dieses Skill enthält die STM32-spezifischen Teile.

Identifiziere zuerst das Projekt

Lies das Repository, bevor du Code schreibst. Diese Fakten ändern die Antwort:

FindeWo
Exakter Bauteil (z.B. STM32G431KBT6) und Familie (F0/F1/F4/G0/G4/L4/H7/U5...).ioc (Mcu.UserName), platformio.ini board =, Startup-Dateiname
Projekttyp.ioc + .project/.cproject → CubeIDE; .ioc + CMakeLists.txt/CMakePresets.json → CubeMX CMake; platformio.ini → PlatformIO
HAL vs. LL vs. RegisterDrivers/STM32xx_HAL_Driver, #include "stm32xx_ll_*.h", CubeMX "Erweiterte Einstellungen" pro Peripherie
RTOSMiddlewares/Third_Party/FreeRTOS, cmsis_os.h
TaktgeberSystemClock_Config() in main.c, .ioc RCC-Abschnitt; Nucleo-Boards liefern normalerweise HSE 8 MHz vom ST-Link (HSE Bypass)
ProbeST-Link (on-board auf Nucleo/Discovery, oder ST-Link V2/V3 eigenständig)

Die Familie ist sehr wichtig: Kerne (M0+/M3/M4F/M7/M33), FPU oder nicht, Flash-Schreibgranularität (Halbwort auf F1, Doppelwort auf G4/L4, Flash-Wort auf H7), DMA (DMAMUX auf G0/G4/L4+/H7), Caches (F7/H7). Wenn du dir bei einem Register- oder Peripheriedetail unsicher bist, sage lieber, was man im Referenzhandbuch (RM) nachschlagen soll, anstatt zu raten.

Die CubeMX-Regeln, die Arbeitsverlust verhindern

CubeMX generiert main.c, stm32xx_it.c, stm32xx_hal_msp.c und Initialisierungsdateien bei jeder Regeneration neu. Nur Text zwischen /* USER CODE BEGIN x */ und /* USER CODE END x */ bleibt erhalten.

  • Lege die Anwendungslogik in eigenen Dateien ab (App/app.c, App/app.h oder app.cpp für C++) und rufe app_init() / app_loop() aus USER CODE BEGIN 2 und dem while (1) USER-CODE-Block auf.
  • Ändere Pins, Taktgeber, DMA, Interrupts und Peripherieparameter in der .ioc-Datei, dann generiere neu – nicht, indem du MX_xxx_Init() bearbeitest (das wird überschrieben, und die .ioc-Datei passt nicht mehr zum Code).
  • Committe die .ioc-Datei. Sie ist die Quelle der Wahrheit für die Hardwarekonfiguration.
  • Aktiviere "Generiere Peripherie-Initialisierung als Paar von .c/.h-Dateien pro Peripherie" unter Projektmanager → Code-Generator: kleinere main.c, sauberere Diffs.
  • Details und C++-Integration: references/cubemx-hal.md.

Bauen, Flashen, Debuggen

Wähle den Pfad, der zum Projekt passt; vollständige Befehle in references/build-flash-debug.md.

ProjektBauenFlashen (ST-Link)Debuggen
CubeIDEIDE, oder Headless stm32cubeide ... -buildIDE, oder STM32_Programmer_CLI -c port=SWD -w app.elf -v -rstCubeIDE-Debugger (ST-LINK GDB-Server)
CubeMX CMake (VS Code)cmake --preset Debug && cmake --build --preset DebugSTM32_Programmer_CLI oder OpenOCDVS Code STM32-Erweiterung / OpenOCD + GDB
PlatformIOpio run -e <env>pio run -e <env> -t upload (upload_protocol = stlink)pio debug / VS Code (debug_tool = stlink)

Flashen verändert das Board: Bestätige mit dem Benutzer, welches Board/welcher Probe angeschlossen ist, bevor du einen Upload ausführst, und führe niemals Massenlöschung, Option-Byte- oder Leseschutzbefehle ohne explizite Bestätigung aus (RDP Level 2 ist permanent).

HAL-Nutzung – die Fehler, die am meisten Zeit kosten

  • I2C-Adressen werden linksverschoben übergeben: HAL_I2C_Master_Transmit(&hi2c1, 0x76 << 1, ...).
  • HAL-Callbacks laufen im Interrupt-Kontext (HAL_UART_RxCpltCallback, HAL_GPIO_EXTI_Callback, HAL_TIM_PeriodElapsedCallback): halte sie kurz, kein HAL_Delay, keine blockierenden Sendevorgänge.
  • HAL_Delay / HAL_GetTick benötigen SysTick: Ein Aufruf aus einem höherprioren ISR oder bei deaktivierten Interrupts führt zu einem Stillstand. Verwende bei FreeRTOS in CubeMX für SYS → Timebase Source einen Basis-Timer (TIM6/TIM7).
  • UART-Empfang: Verwende HAL_UARTEx_ReceiveToIdle_DMA (variable Rahmenlängen) oder Interrupt-Modus in einen Ringpuffer; starte den Empfang im Callback und in HAL_UART_ErrorCallback neu (ein Überlauf stoppt den Empfang stillschweigend).
  • DMA-Puffer auf F7/H7 (Daten-Cache): Vor TX bereinigen, nach RX ungültig machen, 32-Byte-ausgerichtet und -groß; auf H7 können DMA1/2 nicht auf DTCM-RAM zugreifen – platziere Puffer im D2/AXI-SRAM.
  • Überprüfe den Rückgabewert jedes HAL-Aufrufs (HAL_OK, HAL_ERROR, HAL_BUSY, HAL_TIMEOUT); ein HAL_BUSY bedeutet normalerweise, dass eine vorherige Übertragung nie beendet wurde.
  • Timeouts: Niemals HAL_MAX_DELAY in Produktionspfaden.
  • Weitere Muster (UART DMA, ADC DMA, Timer/PWM, EXTI, Low Power, Flash-Schreibvorgänge, Watchdog, Reset-Ursache): references/cubemx-hal.md.

Wenn es abstürzt oder nicht startet

  • HardFault / MemManage / BusFault / UsageFault → references/faults-and-recovery.md (CFSR/HFSR lesen, gestackten PC decodieren mit addr2line).
  • ST-Link kann keine Verbindung herstellen ("No target found", "DEV_TARGET_HELD_UNDER_RESET") → Verbindung unter Reset herstellen; überprüfen, ob SWD-Pins in der .ioc-Datei nicht als GPIO umkonfiguriert wurden; BOOT0; RDP-Level → references/faults-and-recovery.md.
  • Hängen in SystemClock_Config → HSE nicht vorhanden/Bypass-Fehlanpassung, falscher PLL, Flash-Latenz zu niedrig.
  • Peripherie stumm → Taktgeber aktiviert? Pin-AF korrekt? MX_xxx_Init tatsächlich aufgerufen und in der richtigen Reihenfolge (DMA-Init vor der Peripherie, die es verwendet)?

Referenzdateien

DateiLesen, wenn
references/cubemx-hal.mdCode in einem CubeMX-Projekt schreiben/überprüfen, C++-Integration, Peripheriemuster, Low Power, Flash/EEPROM-Emulation, Watchdog, Reset-Ursache
references/build-flash-debug.mdToolchain-Installation, Build von der CLI, PlatformIO-Setup für STM32, Flashen, GDB/OpenOCD, printf/SWV-Logging, Größenanalyse
references/faults-and-recovery.mdHardFault und andere Fehler, Board stellt keine Verbindung her, Option-Bytes und Leseschutz, Wiederherstellung eines scheinbar unbrauchbaren Boards

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

esp32-firmware

ESP32 firmware with PlatformIO — Arduino framework (primary) and ESP-IDF (also inside PlatformIO, or Arduino as an IDF component) — for ESP32, S2, S3, C3, C6. Covers platformio.ini setup, Arduino core 2.x vs 3.x API differences, safe pin selection (strapping/flash/PSRAM/ADC2 pins), FreeRTOS tasks and ISRs, memory/PSRAM, Wi-Fi/BLE, NVS/Preferences, OTA, deep sleep, partitions, flashing over USB/serial, decoding Guru Meditation panics and boot loops. Use this skill whenever the user works on any ESP32 / ESP32-S3 / C3 / C6 board, platformio.ini with espressif32, Arduino sketches for ESP32, idf.py/sdkconfig, or pastes ESP32 serial output (rst:, Guru Meditation, Brownout, watchdog) — even if they only say "a placa reinicia" or "o upload falha". Use together with embedded-c-cpp for general C/C++ quality, testing and architecture.

pic-firmware

Microchip PIC and dsPIC firmware with MPLAB X IDE, XC8 / XC16 / XC-DSC / XC32 compilers and MPLAB Code Configurator (MCC Melody/Classic) for PIC16, PIC18, PIC24, dsPIC33 (F/EP/EV/CK/CH dual-core/A) and PIC32 — configuration bits, oscillator/PLL, TRIS/LAT/PORT/ANSEL, PPS, interrupts per family, 8/16-bit atomicity and hardware-stack limits, dsPIC DSP engine and Q15 fixed-point, high-speed PWM/ADC control loops, motor control and digital power, XC8 memory and optimization, headless builds, programming and debugging with PICkit 4/5, MPLAB Snap and ICD (ipecmd), reset causes and traps. Use this skill whenever the user mentions any PIC or dsPIC part (PIC16F, PIC18F, PIC24F, dsPIC33EP/CK/CH, PIC32MX/MZ), MPLAB X, MCC, XC8/XC16/XC-DSC/XC32, PICkit, Snap, ICD, `#pragma config`, motorBench, or a .X project folder — even for a short question like "o pino não lê nada no PIC" or "o meu controlo PI no dsPIC oscila". Use together with embedded-c-cpp for general C quality, testing and arc...

Verwandte Skills