DÍA 109 DE 365

Fase 2: Fundamentos de Hardware y Electrónica

📖 Teoría a Estudiar

El Perro Guardián Independiente (IWDG)

Un Watchdog Timer (WDT) es un contador regresivo de hardware. El procesador tiene la obligación de recargar este contador (patear al perro o "Kick the dog") continuamente. Si por algún error de software, interferencia electromagnética o desbordamiento de memoria el procesador se queda congelado, dejará de recargar el contador. Cuando el contador llega a cero, el hardware asume que el cerebro ha muerto y dispara físicamente el pin de RESET interno del microcontrolador, forzando un reinicio completo desde cero.

Aislamiento del Reloj: LSI vs HSE

¿Qué pasa si el problema fue que el cristal de cuarzo maestro (HSE) o el PLL se averiaron? Si el Watchdog dependiera de ese mismo reloj, también moriría. Por eso, el STM32 incluye un Low-Speed Internal oscillator (LSI). Este oscilador es un circuito analógico RC de 32 kHz completamente independiente, enterrado profundamente en el silicio. Aunque el núcleo de 84MHz colapse, el LSI seguirá latiendo implacablemente para ejecutar el reinicio.

El Registro de Llaves (Key Register)

Para evitar que un código corrupto detenga o altere al perro guardián por accidente, el IWDG está protegido por llaves mágicas de 16 bits que debes escribir en el registro KR:

ARQUITECTURA DEL WATCHDOG INDEPENDIENTE (IWDG) Dominio Principal (VDD) CPU (ARM Cortex-M) Reloj: PLL 84 MHz while(1) { IWDG->KR = 0xAAAA; // Kick Ejecutar_Telemetria(); Control_Valvulas(); } Dominio Aislado IWDG (VDD_LSI) LSI 32 kHz Hardware Counter 1999 1998 ... 0 Refresh 0xAAAA (Restaura a 2000) ¡PULSO DE RESET FÍSICO AL NÚCLEO! (Se activa solo si el contador llega a cero)

⚙️ Ejercicios Prácticos

Ejercicio 1: Inicializa el IWDG utilizando la matemática Bare-Metal. El oscilador LSI corre a aproximadamente 32,000 Hz. Si configuramos el Prescaler (PR) en 3, dividimos el reloj entre 32. Nuestro timer contará a 1 kHz (1 milisegundo por tick). Configura el registro Reload (RLR) con el valor de 2000 para otorgarle al microcontrolador una ventana de supervivencia exacta de 2 segundos antes de disparar el reinicio del sistema.


/**
 * @file iwdg_driver.c
 * @brief Driver Bare-Metal para el Watchdog Independiente
 */

#include "stm32f401xe.h"

void inicializar_perro_guardian(void) {
    
    // 1. DESBLOQUEAR EL ACCESO A LOS REGISTROS
    // Escribimos la llave mágica en el Key Register
    IWDG->KR = 0x5555;
    
    // 2. CONFIGURAR EL PRESCALER (PR)
    // El valor '3' corresponde a un divisor de /32 (Ver Reference Manual)
    // Reloj = 32 kHz / 32 = 1,000 Hz (1 Tick por Milisegundo)
    IWDG->PR = 3; 
    
    // 3. CONFIGURAR EL VALOR DE RECARGA (RLR)
    // Si queremos 2 segundos de tolerancia, escribimos 2000.
    // El IWDG cuenta hacia abajo. Si pasan 2000ms sin que el código lo alimente, 
    // el hardware reiniciará violentamente el microcontrolador.
    IWDG->RLR = 2000;
    
    // 4. ESPERAR SINCRONIZACIÓN DE DOMINIOS DE RELOJ
    // Como el IWDG corre en LSI y el CPU en APB (HSE/HSI), toma unos ciclos 
    // que el registro SR (Status Register) actualice los valores.
    while ((IWDG->SR & (IWDG_SR_PVU | IWDG_SR_RVU)) != 0);
    
    // 5. ARRANCAR EL PERRO GUARDIÁN
    // Escribimos la llave Start. ¡A partir de aquí, el reloj es una bomba de tiempo!
    IWDG->KR = 0xCCCC;
    
    // 6. PRIMER ALIMENTO AL PERRO
    IWDG->KR = 0xAAAA;
}

// Macro limpia para invocar en el main loop
#define PATEAR_AL_PERRO() (IWDG->KR = 0xAAAA)

int main(void) {
    
    // Las válvulas arrancan apagadas por defecto (Día 96)
    // Valvula_Init(); 
    
    // Se arranca la bomba de tiempo de 2 segundos
    inicializar_perro_guardian();
    
    while(1) {
        
        // --- CÓDIGO NORMAL DEL DESPACHADOR ---
        // Leer Modbus, Mostrar en LCD, Cerrar/Abrir Válvulas
        
        // --- SEÑAL DE VIDA (ALIMENTAR AL WATCHDOG) ---
        // Al ejecutar esta línea, el contador IWDG vuelve a subir a 2000.
        // Si el código entra en un bucle infinito en la línea de arriba y nunca
        // llega aquí, pasados 2 segundos, la máquina se reiniciará.
        PATEAR_AL_PERRO();
        
        // PRUEBA DE FALLO (Descomentar para ver el sistema morir y revivir)
        // while(1); // <- Simulación de fallo catastrófico. El MCU se reiniciará.
    }
    
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Certificación de Seguridad de Alta Disponibilidad.

Una máquina expendedora de chicles puede quedarse congelada esperando que alguien la desconecte de la pared y la vuelva a enchufar. Un Despachador de Gas LP con la válvula maestra abierta que sufra una "Pantalla Azul de la Muerte" y se congele es una zona de desastre nivel industrial.

Al encender el IWDG, acabas de inyectar paranoia física en el silicio. Si tu código C comete un fallo crítico de segmentación, o si un chispazo del motor del camión altera los registros de memoria deteniendo tu bucle principal, el contador del LSI (completamente inmune y aislado en otra parte del chip) bajará sin piedad a cero tras 2 segundos. Cuando lo haga, el hardware interno cortará la energía al núcleo, forzando un Reset_Handler (Día 91). Al reiniciarse, tus puertos GPIO se pondrán en estado de alta impedancia, cortando la señal del Optoacoplador, apagando el MOSFET y el resorte físico de la válvula bloqueará el flujo de Gas LP, apagando el peligro mecánicamente antes de que alguien siquiera tenga que pulsar el Paro de Emergencia.

📝 Resumen del Día