CommunityProgramación y desarrollogithub.com

stm32-firmware

Desarrollo de firmware STM32 con STM32CubeMX/STM32CubeIDE + HAL/LL y PlatformIO: estructura de proyecto, reglas USER CODE, periféricos (UART/I2C/SPI/ADC/timers/DMA), clocks, bajo consumo, flash/option bytes, compilación desde línea de comandos, flasheo y depuración con ST-Link (STM32CubeProgrammer CLI, OpenOCD, GDB, SWV) y análisis de HardFault.

¿Qué es stm32-firmware?

Esta habilidad especializada para agentes de IA (Claude Code, Cursor, Codex, etc.) proporciona guía completa para el desarrollo de firmware en microcontroladores STM32, utilizando las herramientas oficiales de ST (STM32CubeMX, STM32CubeIDE) junto con HAL/LL y PlatformIO. Es útil para cualquier desarrollador que trabaje con placas STM32, Nucleo, Discovery o Blue Pill, archivos .ioc, código HAL_ o que se enfrente a HardFaults. La habilidad abarca desde la identificación precisa del proyecto (parte, familia, tipo de proyecto, RTOS, clocks) hasta la compilación, flasheo y depuración con ST-Link. Incluye reglas críticas para evitar la pérdida de trabajo con CubeMX (uso correcto de USER CODE), patrones comunes de HAL que causan errores costosos (direcciones I2C, callbacks en interrupción, DMA con caché, timeouts), y un flujo completo de recuperación ante fallos (HardFault, fallos de conexión ST-Link, cuelgues en SystemClock_Config). Se recomienda usar junto con la habilidad 'embedded-c-cpp' para estándares de código C/C++, pruebas y arquitectura general.

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

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

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

Cargue también embedded-c-cpp para estándares de codificación, arquitectura, pruebas unitarias y depuración general. Esta habilidad contiene las partes específicas de STM32.

Primero, identifique el proyecto

Lea el repositorio antes de escribir código. Estos hechos cambian la respuesta:

EncontrarDónde
Parte exacta (ej. STM32G431KBT6) y familia (F0/F1/F4/G0/G4/L4/H7/U5...).ioc (Mcu.UserName), platformio.ini board =, nombre del archivo de inicio
Tipo de proyecto.ioc + .project/.cproject → CubeIDE; .ioc + CMakeLists.txt/CMakePresets.json → CubeMX CMake; platformio.ini → PlatformIO
HAL vs LL vs registrosDrivers/STM32xx_HAL_Driver, #include "stm32xx_ll_*.h", "Advanced settings" de CubeMX por periférico
RTOSMiddlewares/Third_Party/FreeRTOS, cmsis_os.h
ClocksSystemClock_Config() en main.c, sección RCC del .ioc; las placas Nucleo suelen alimentar HSE 8 MHz desde el ST-Link (HSE bypass)
SondaST-Link (integrada en Nucleo/Discovery, o ST-Link V2/V3 independiente)

La familia importa mucho: núcleos (M0+/M3/M4F/M7/M33), FPU o no, granularidad de escritura flash (half-word en F1, double-word en G4/L4, flash-word en H7), DMA (DMAMUX en G0/G4/L4+/H7), cachés (F7/H7). Cuando no esté seguro de un registro o detalle de periférico, indique qué verificar en el manual de referencia (RM) en lugar de adivinar.

Las reglas de CubeMX que evitan pérdida de trabajo

CubeMX regenera main.c, stm32xx_it.c, stm32xx_hal_msp.c y los archivos de inicialización cada vez. Solo sobrevive el texto entre /* USER CODE BEGIN x */ y /* USER CODE END x */.

  • Coloque la lógica de aplicación en sus propios archivos (App/app.c, App/app.h, o app.cpp para C++) y llame a app_init() / app_loop() desde USER CODE BEGIN 2 y el bloque USER CODE dentro de while (1).
  • Cambie pines, clocks, DMA, interrupciones y parámetros de periféricos en el .ioc, luego regenere — no editando MX_xxx_Init() (se sobrescribe, y el .ioc deja de coincidir con el código).
  • Haga commit del archivo .ioc. Es la fuente de verdad para la configuración del hardware.
  • Active "Generate peripheral initialization as a pair of .c/.h files per peripheral" en Project Manager → Code Generator: main.c más pequeño, diffs más limpios.
  • Detalles e integración C++: references/cubemx-hal.md.

Compilación, flasheo, depuración

Elija la ruta que coincida con el proyecto; comandos completos en references/build-flash-debug.md.

ProyectoCompilarFlashear (ST-Link)Depurar
CubeIDEIDE, o headless stm32cubeide ... -buildIDE, o STM32_Programmer_CLI -c port=SWD -w app.elf -v -rstDepurador de CubeIDE (servidor GDB ST-LINK)
CubeMX CMake (VS Code)cmake --preset Debug && cmake --build --preset DebugSTM32_Programmer_CLI o OpenOCDExtensión STM32 de VS Code / OpenOCD + GDB
PlatformIOpio run -e <env>pio run -e <env> -t upload (upload_protocol = stlink)pio debug / VS Code (debug_tool = stlink)

Flashear cambia la placa: confirme con el usuario qué placa/sonda está conectada antes de ejecutar una subida, y nunca ejecute borrado masivo, option bytes o comandos de protección de lectura sin confirmación explícita (RDP nivel 2 es permanente).

Uso de HAL — los errores que más tiempo cuestan

  • Direcciones I2C se pasan desplazadas a la izquierda: HAL_I2C_Master_Transmit(&hi2c1, 0x76 << 1, ...).
  • Los callbacks de HAL se ejecutan en contexto de interrupción (HAL_UART_RxCpltCallback, HAL_GPIO_EXTI_Callback, HAL_TIM_PeriodElapsedCallback): manténgalos cortos, sin HAL_Delay, sin transmisiones bloqueantes.
  • HAL_Delay / HAL_GetTick necesitan SysTick: llamarlos desde una ISR de mayor prioridad o con interrupciones deshabilitadas cuelga el sistema. Con FreeRTOS, configure SYS → Timebase Source a un temporizador básico (TIM6/TIM7) en CubeMX.
  • Recepción UART: use HAL_UARTEx_ReceiveToIdle_DMA (tramas de longitud variable) o modo interrupción con un buffer circular; reinicie la recepción en el callback y en HAL_UART_ErrorCallback (un overrun detiene la recepción silenciosamente).
  • Buffers DMA en F7/H7 (caché de datos): limpiar antes de TX, invalidar después de RX, alineados y de tamaño múltiplo de 32 bytes; en H7, DMA1/2 no pueden acceder a DTCM RAM — coloque los buffers en D2/AXI SRAM.
  • Verifique el valor de retorno de cada llamada HAL (HAL_OK, HAL_ERROR, HAL_BUSY, HAL_TIMEOUT); un HAL_BUSY generalmente significa que una transferencia anterior nunca terminó.
  • Timeouts: nunca use HAL_MAX_DELAY en rutas de producción.
  • Más patrones (UART DMA, ADC DMA, timers/PWM, EXTI, bajo consumo, escrituras flash, watchdog, causa de reset): references/cubemx-hal.md.

Cuando se cuelga o no arranca

  • HardFault / MemManage / BusFault / UsageFault → references/faults-and-recovery.md (leer CFSR/HFSR, PC apilado, decodificar con addr2line).
  • ST-Link no puede conectar ("No target found", "DEV_TARGET_HELD_UNDER_RESET") → conectar bajo reset; verificar que los pines SWD no se hayan reconfigurado como GPIO en el .ioc; BOOT0; nivel RDP → references/faults-and-recovery.md.
  • Cuelgue en SystemClock_Config → HSE no presente/discrepancia de bypass, PLL incorrecto, latencia flash demasiado baja.
  • Periférico silencioso → ¿reloj habilitado? ¿AF de pin correcto? ¿MX_xxx_Init realmente llamado y en el orden correcto (inicializar DMA antes que el periférico que lo usa)?

Archivos de referencia

ArchivoLeer cuando
references/cubemx-hal.mdEscribir/revisar código en un proyecto CubeMX, integración C++, patrones de periféricos, bajo consumo, emulación flash/EEPROM, watchdog, causa de reset
references/build-flash-debug.mdInstalación de toolchain, compilación desde CLI, configuración de PlatformIO para STM32, flasheo, GDB/OpenOCD, registro printf/SWV, análisis de tamaño
references/faults-and-recovery.mdHardFault y otras fallas, la placa no conecta, option bytes y protección de lectura, recuperación de una placa que parece bricked

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...

Skills relacionados