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.
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).
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á.
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;
}
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.