DÍA 145 DE 365

Fase 3: Comunicaciones y Redes Industriales

📖 Teoría a Estudiar

Sleep vs Standby: Apagando el Regulador Central

Tu placa recibe 3.3V, pero el núcleo matemático del procesador (Core) y la memoria RAM principal funcionan a 1.2 Voltios. El chip STM32 tiene un regulador de voltaje interno dedicado a mantener viva esta zona. En el Modo Sleep (Día 144), solo desconectamos la señal de reloj; el regulador de 1.2V sigue encendido, por lo que la RAM retiene tus variables y los periféricos siguen listos.

El Modo Standby es nuclear: Literalmente le ordena al hardware apagar el regulador de 1.2V. Al hacerlo:

El Renacimiento (Wake-Up) no es una Interrupción

Como el núcleo y la memoria mueren, al salir de Standby no retomas el código donde te quedaste. El microcontrolador ejecuta un Reinicio de Sistema (System Reset). La función main() vuelve a empezar desde cero, como si hubieras presionado el botón físico de RESET. La única forma de recordar qué estaba haciendo la máquina antes de dormir, es leer los Backup Registers (BKP) que aprendimos a usar en el Día 142, ya que esos sobreviven porque están alimentados por la pila VBAT independiente.

MODO STANDBY: CORTE DEL REGULADOR DE 1.2V (SYSTEM WIPE) Internal LDO Regulator: OFF 0 Voltios 1.2V CORE DOMAIN SRAM (Variables Borradas) CPU Core (Apagado) Periféricos (Desconfigurados) ☠ DEAD ☠ Wake-up Unit (Alimentado x VDD) PA0 "START" Rising Edge en PA0 Dominio de Respaldo (Batería VBAT) RTC LSE Alarma / Reloj SRAM BKP Memoria Salva El Flanco en PA0 Restaura el Regulador de 1.2V (Reboot)

⚙️ Ejercicios Prácticos

Ejercicio 1: Tu Despachador medirá constantemente la batería primaria. Si cae por debajo de un umbral de emergencia (ej. 10.5V), el sistema guardará el Odómetro en los Backup Registers y llamará a la función entrar_modo_standby(). Configuraremos el pin especial de despertador WKUP (PA0) para que, cuando el usuario presione el botón físico de "ENCENDIDO/VENTA", inyecte un flanco de subida en PA0, reiniciando la máquina desde cero mágicamente.


/**
 * @file power_standby.c
 * @brief Gestión de Hibernación Extrema y Retorno mediante WKUP Pin (PA0)
 */

#include "stm32f401xe.h"
#include <stdbool.h>

extern void respaldar_totalizador_vivo(void);   // Día 142
extern void cargar_variables_desde_bkp(void);   // Día 142

/**
 * @brief Prepara el hardware y ejecuta el suicidio lógico del CPU
 */
void entrar_modo_standby(void) {
    
    // 1. Activar el reloj del periférico de Poder (PWR)
    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
    
    // 2. Habilitar el pin mágico Wake-Up (WKUP), que está cableado a PA0.
    // Ojo: En Standby, PA0 deja de ser un GPIO normal y se vuelve un circuito puro de PWR.
    PWR->CSR |= PWR_CSR_EWUP; 
    
    // 3. Limpiar la bandera de Wake-Up (Por si alguien apretó el botón antes)
    PWR->CR |= PWR_CR_CWUF;
    
    // 4. Seleccionar MODO STANDBY (en lugar de Modo Sleep/Stop)
    // El bit PDDS (Power Down Deepsleep) ordena APAGAR el regulador de 1.2V.
    PWR->CR |= PWR_CR_PDDS;
    
    // 5. Configurar el núcleo ARM Cortex-M para entrar en sueño profundo
    // Bit SLEEPDEEP del System Control Register
    SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
    
    // 6. ¡Apagar las luces!
    // Al ejecutar WFI con PDDS y SLEEPDEEP en 1, la memoria RAM muere instantáneamente.
    __WFI(); 
    
    // -------------------------------------------------------------
    // EL CÓDIGO NUNCA LLEGARÁ A ESTA LÍNEA.
    // El despertar ocasiona un System Reset y el programa reinicia en el main().
    // -------------------------------------------------------------
}

/**
 * @brief Revisa si acabamos de prender por batería o si venimos de un Standby
 */
void diagnosticar_arranque(void) {
    
    RCC->APB1ENR |= RCC_APB1ENR_PWREN; // Habilitar acceso a registros PWR
    
    // Si la bandera SBF (Standby Flag) está en 1, no fue un encendido normal.
    // Fuimos revividos por el botón WKUP (PA0) o una Alarma del RTC.
    if (PWR->CSR & PWR_CSR_SBF) {
        
        // Venimos de Standby. Limpiamos la bandera para el futuro.
        PWR->CR |= PWR_CR_CSBF;
        
        // ¡Cuidado! La RAM Volátil se borró. 
        // El Odómetro y estado de la máquina deben recuperarse de inmediato.
        cargar_variables_desde_bkp();
        
        // uart_escribir_cadena("Regresando de Standby!\r\n");
    } else {
        // Encendido normal (Power On Reset o Botón Negro de Reset)
        cargar_variables_desde_bkp();
    }
}

int main(void) {
    
    // Lo primero que hace el firmware al arrancar (Reboot)
    diagnosticar_arranque();
    
    // inicializar_relojes();
    // inicializar_adc_voltaje();
    
    while(1) {
        
        // Leer voltaje de la batería principal (Ejemplo 12V SLA)
        // float voltaje_bateria = leer_bateria_principal();
        
        // Supongamos que simulo la caída de voltaje:
        bool bateria_muerta = false; 
        
        // Si el panel solar no dio carga y la batería bajó de 10.5V:
        if (bateria_muerta) {
            
            // 1. Guardamos el estado actual (si estábamos a mitad de una venta)
            respaldar_totalizador_vivo();
            
            // 2. Apagamos relés y válvulas mecánicas
            // valvula_off();
            
            // 3. Hibernación extrema. Consumo: ~2.5 microamperios.
            entrar_modo_standby();
        }
        
        // Despacho normal guiado por Máquinas de Estado...
    }
    
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Supervivencia Remota (Off-Grid) y Recuperación Segura.

Muchos de los Despachadores de Gas de última generación se instalan en zonas rurales o "Carburadoras Móviles" montadas en el chasis de camionetas alimentadas solo con el alternador y una batería automotriz. Si el vehículo se apaga todo el fin de semana, el despachador consumiría la batería del camión, dejándolo varado.

Con tu nueva arquitectura Standby -> WakeUp -> BKP Restore, has solucionado este problema electromecánico por software puro. Cuando tu ADC detecte que el voltaje del camión es peligroso, el STM32 respaldará las ventas en la RAM inmortal del BKP (Día 142) y "se suicidará" lógicamente. El consumo será tan bajo que la batería ni se inmutará durante meses. El Lunes en la mañana, el operador simplemente presiona el gigantesco botón físico verde de "START" (conectado a `PA0`). El microcontrolador resucita en microsegundos, lee el registro BKP, imprime un log serial que dice *"Recuperado de Hibernación"* y está listo para facturar gas como si nada hubiera pasado. Ingeniería off-grid nivel militar.

📝 Resumen del Día