DÍA 040 DE 365

Fase 1: Fundamentos de C y Lógica de Software

📖 Teoría Explícita: El Perro Guardián (Watchdog Timer)

1. La Falsa Seguridad del Código Perfecto

Los ingenieros asumen que si el código compila y pasa las pruebas, nunca fallará. La realidad en piso de planta es diferente. Un pulso electromagnético severo (EMI) puede alterar un solo bit en la memoria SRAM o corromper el reloj principal del MCU, congelando el software en un instante. Cuando esto ocurre, tu Matriz de Seguridad y tus Interrupciones dejan de existir.

2. Anatomía del Watchdog Independiente (IWDG)

Para solucionar esto, los microcontroladores incluyen un periférico llamado Independent Watchdog (IWDG). Es un temporizador regresivo que corre en un oscilador de hardware completamente separado (típicamente a 32 kHz). Si el reloj principal de la CPU falla, el Watchdog sigue contando. Su única misión es contar desde un valor X hasta 0. Si llega a cero, envía un pulso de hardware directo al pin de RESET del chip, reiniciando la máquina violentamente para llevar todos los pines a estado seguro (0V).

3. La Rutina de Refresco ("Patear al Perro")

Para evitar que el Watchdog reinicie el sistema durante la operación normal, el software debe ejecutar una instrucción específica (una "patada" o "refresco") para recargar el temporizador de nuevo a X antes de que alcance el cero. Si el software se congela en un bucle infinito, la "patada" nunca llegará, y el Perro Guardián morderá.

ARQUITECTURA DE AISLAMIENTO: CPU VS IWDG DOMINIO PRINCIPAL HSE/PLL 48 MHz CPU (Core) Ejecuta Súper Bucle DOMINIO INDEPENDIENTE LSI Osc. 32 kHz IWDG Counter 1000... 999... 0! "Patear" (Reset a 1000) HARDWARE RESET (Si llega a 0)

⚙️ Ejercicios Prácticos: Configuración Bare-Metal

Ejercicio 1: Programaremos los registros del IWDG de un microcontrolador (estilo Cortex-M). Debido a la importancia de este periférico, el hardware impone el uso de "Claves Mágicas" hexadecimales que deben escribirse en el registro de acceso para prevenir que una corrupción aleatoria de memoria deshabilite el sistema de seguridad.


#include <stdint.h>

// --- 1. ABSTRACCIÓN DE REGISTROS WATCHDOG (Pseudo-STM32 IWDG) ---
#define IWDG_BASE        0x40003000
#define IWDG_KR          (*((volatile uint32_t *)(IWDG_BASE + 0x00))) // Key Register
#define IWDG_PR          (*((volatile uint32_t *)(IWDG_BASE + 0x04))) // Prescaler
#define IWDG_RLR         (*((volatile uint32_t *)(IWDG_BASE + 0x08))) // Reload Register

// Claves Mágicas de Hardware (Estándar en la industria ARM)
#define IWDG_KEY_RELOAD  0xAAAA  // Clave para "patear" al perro
#define IWDG_KEY_ENABLE  0xCCCC  // Clave para encender el Watchdog
#define IWDG_KEY_UNLOCK  0x5555  // Clave para poder modificar configuraciones


// --- 2. INICIALIZACIÓN DEL PERRO GUARDIÁN ---
void Watchdog_Inicializar(void) {
    
    // 1. Quitar el seguro físico de los registros
    IWDG_KR = IWDG_KEY_UNLOCK;
    
    // 2. Configurar el Divisor de Frecuencia (Prescaler)
    // Supongamos que el LSI (Low-Speed Internal) corre a 32 kHz.
    // Prescaler 0x03 suele equivaler a dividir entre 32.
    // Reloj resultante: 32000 / 32 = 1000 Hz (1 ms por cada Tick).
    IWDG_PR = 0x03; 
    
    // 3. Configurar la Carga Máxima (Timeout)
    // Si cada tick toma 1ms, un límite de 1500 otorga 1.5 Segundos antes del Reset.
    IWDG_RLR = 1500; 
    
    // 4. Iniciar y bloquear el Watchdog
    // Una vez ejecutada esta línea, el WDT ya no se puede apagar por software.
    IWDG_KR = IWDG_KEY_ENABLE;
}


// --- 3. RUTINA DE REFRESCO ---
void Watchdog_Patear(void) {
    // Restaurar el contador de vuelta a 1500.
    // Esta es la ÚNICA línea que evita el colapso del sistema.
    IWDG_KR = IWDG_KEY_RELOAD;
}


// =====================================================================
// SÚPER BUCLE MAESTRO
// =====================================================================
int main(void) {
    
    // Inicializar reloj del sistema, Pines GPIO y hardware crítico.
    // Al reiniciar la placa, todos los GPIO inician en 0V (Válvulas cerradas).
    
    // Encender el vigilante
    Watchdog_Inicializar();
    
    while(1) {
        // 1. Procesar UART del ESP32 (Telemetría asíncrona)
        // 2. Revisar Matriz de Seguridad y Presiones (Día 33 y 38)
        // 3. Evaluar Máquina de Estados FSM (Día 31)
        
        // 4. CERTIFICADO DE VIDA:
        // Si el código se atasca en un "while" buscando un ACK de I2C 
        // o si un puntero a función nulo causa un Hard Fault,
        // esta línea jamás se alcanzará, el IWDG llegará a cero y 
        // cerrará las válvulas mediante un reinicio total en 1.5 segundos.
        Watchdog_Patear();
    }
    
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Autocorrección y Seguridad Intrínseca.

El Watchdog Timer no previene los errores de software, pero garantiza que la máquina asuma inmediatamente el Estado Seguro (Failsafe) si la CPU pierde el control. Cuando diseñas el hardware de potencia (Día 33), asumes que sin voltaje del microcontrolador, la electroválvula de 220V se cierra por efecto de su resorte mecánico. Si el MCU sufre una falla fatal mientras despacha gas, el IWDG obligará al pin de Reset a bajar a 0V, lo que apagará instantáneamente los pines GPIO, desenergizando la bobina y sellando la fuga hidráulica de forma automática.

📝 Resumen del Día