DÍA 290 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

El Protocolo SWD (Serial Wire Debug)

Antiguamente, para programar y depurar microcontroladores, la industria usaba el estándar JTAG, que requería 4 o 5 pines de datos dedicados. ARM, buscando miniaturizar sus chips Cortex-M, inventó el SWD. Este protocolo logra exactamente lo mismo (flashear memoria, poner breakpoints y leer variables en tiempo real) pero usando únicamente dos pines lógicos:

El Conector Físico y el Pin NRST (Reset)

A nivel físico, además de SWDIO y SWCLK, necesitas conectar la Tierra (GND) para cerrar el circuito y una referencia de voltaje (3V3) para que el ST-Link sepa a qué nivel lógico "hablar".

Pero el secreto de los ingenieros senior es conectar siempre un quinto pin: el NRST (Hardware Reset). Si subes un código a tu STM32 que accidentalmente desactiva los pines PA13/PA14 o pone el chip en sueño profundo (Deep Sleep) en el primer milisegundo, la comunicación SWD colapsará. El pin NRST le permite al ST-Link forzar un reinicio físico del chip, tomando control de la memoria justo antes de que tu código "malo" comience a ejecutarse.

ARQUITECTURA DE PROGRAMACIÓN EN SISTEMA (SWD) ST-LINK V2 / V3 A PC (USB) VDD_TARGET SWDIO SWCLK NRST GND PCB HEADER STM32 MCU SWD-DP (Debug Port) Flash Memory 0x08000000 Destino del Binario Referencia 3.3V PA13 PA14 NRST

⚙️ Procedimiento Paso a Paso (El Flasheo)

Paso 1: Conexión del Hardware (Wire-up).
Utiliza cables jumper (Dupont) hembra-hembra si no tienes un conector de cinta plano (Ribbon cable). Conecta los pines del ST-Link a la bornera/header de tu placa respetando rigurosamente: 3.3V a 3.3V (Solo si la placa no tiene su propia fuente. Si tu Despachador ya está energizado con 24V, no conectes el 3.3V del ST-Link para evitar conflicto de fuentes; conecta solo el pin "TVCC / Target VDD" como sensor), GND a GND, SWDIO a PA13, SWCLK a PA14, y NRST a NRST.

Paso 2: Validar Comunicación (STM32CubeProgrammer).
Abre el software oficial STM32CubeProgrammer. En la esquina superior derecha, selecciona "ST-LINK". En la configuración, asegúrate de que el "Mode" esté en Normal (o Under Reset si el chip está testarudo) y "Reset Mode" en Hardware Reset. Haz clic en "Connect". Si lees en consola "Target connected. Device ID: 0x423...", has triunfado. Tu computadora está leyendo el silicio de tu placa.

💻 CI/CD de Firmware: Flasheo por Línea de Comandos (OpenOCD)

Los ingenieros de verdad no dan clics en interfaces gráficas para programar mil placas. Utilizan herramientas de código abierto como OpenOCD (Open On-Chip Debugger) integradas en su Makefile o pipeline.


# ==============================================================================
# SCRIPT DE AUTOMATIZACIÓN DE FLASHEO (Makefile Target)
# @brief Graba el binario base `firmware.elf` en el STM32 usando OpenOCD
# ==============================================================================

# Variables del entorno
OPENOCD = openocd
TARGET_CFG = target/stm32f4x.cfg
DEBUGGER_CFG = interface/stlink.cfg

flash:
	@echo "[*] Iniciando protocolo SWD e inyectando binario..."
	$(OPENOCD) -f $(DEBUGGER_CFG) -f $(TARGET_CFG) -c "program build/firmware.elf verify reset exit"
	@echo "[V] Flasheo exitoso. El microcontrolador ha reiniciado."

erase:
	@echo "[!] Borrando memoria Flash entera (Mass Erase)..."
	$(OPENOCD) -f $(DEBUGGER_CFG) -f $(TARGET_CFG) -c "init; reset halt; stm32f4x mass_erase 0; exit"
        

Código de Prueba (Blinky & Safe Boot):
El primer código que se flashea nunca es el código final. Es un programa mínimo para validar que el reloj (Día 281) y los actuadores operan correctamente sin matar a nadie.


/**
 * @file main.c
 * @brief Primer binario (Hello World) para el Despachador de Gas LP
 */
#include "stm32f4xx_hal.h"

// Dependencias de los días anteriores
extern bool Clock_Init_HSE_Safe(void);
extern void System_Safe_Boot_Check(void);

int main(void) {
    // 1. Inicialización de la capa de abstracción de hardware de ST
    HAL_Init();
    
    // 2. Intentar arrancar el Cristal de 8MHz que diseñamos
    if (!Clock_Init_HSE_Safe()) {
        // Falló el reloj de cuarzo. Entrar a bucle infinito de alarma SOS.
        while(1); 
    }
    
    // 3. Revisar que no haya cortos y que la línea 24V esté estable
    System_Safe_Boot_Check();
    
    // 4. Configurar el LED de la placa base (Ej. PC13)
    __HAL_RCC_GPIOC_CLK_ENABLE();
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    // 5. El Látido Inicial (Blinky)
    while (1) {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        HAL_Delay(500); // Medio segundo ON, Medio segundo OFF
    }
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Acceso a Memoria de Silicio y Despliegue (Deployment) Inicial.

Un PCB de cobre y silicio sin código es un objeto inerte, carente de propósito. Al integrar un conector de 5 pines y rutear la interfaz **Serial Wire Debug (SWD)** hacia los pines `PA13` y `PA14` de tu STM32, has construido el cordón umbilical de tu máquina.

A diferencia de los bootloaders UART rudimentarios o las placas Arduino que cargan código a ciegas por USB, el protocolo SWD te otorga "God Mode" sobre el procesador. Conecta tu ST-Link, y OpenOCD te permitirá no solo grabar la memoria Flash con la rutina de metrología del Gas LP, sino también pausar la ejecución del código en el milisegundo exacto en que la bomba de gas arranca (Breakpoints), e inspeccionar el valor de las variables RAM para ver si el ruido electromagnético corrompió las mediciones. Al flashear exitosamente tu código `Safe Boot` hoy y ver ese primer LED parpadear sin que el procesador estalle, has confirmado que la cadena entera —desde el esquemático en KiCad hasta el metal soldado— ha sido un éxito de ingeniería sin precedentes.

📝 Resumen del Día