DÍA 255 DE 365

Fase 5: Diseño Industrial y Proyecto Final

📖 Teoría a Estudiar:

La Coreografía del Arranque (Boot Sequence)

Un sistema de misión crítica no despierta e inmediatamente empieza a trabajar. Se somete a sí mismo a una estricta batería de pruebas POST (Power-On Self-Test). En nuestro Despachador de Gas LP, la secuencia innegociable es:

  1. Hard Reset & Relojes: Se estabilizan los cristales de cuarzo (HSE/LSE).
  2. Autodiagnóstico del Silicio (Día 253): El procesador verifica si murió por un apagón (Brown-out) o si las defensas (Option Bytes) están activas.
  3. Recuperación de Desastre (Día 252): Se lee la EEPROM. Si la máquina se apagó a media venta de gas, se recupera el saldo y se bloquea la bomba hasta enviar el reporte de incidente.
  4. Calibración Metrológica (Día 254): Se carga el factor de calibración desde la EEPROM a la RAM, validando el candado de hardware (Jumper).
  5. Arranque del Kernel: Solo si todo lo anterior es perfecto, se le entrega el control al Scheduler de FreeRTOS para despachar tareas.
ARQUITECTURA MAESTRA: DESPACHADOR GAS LP AWS IoT Core LTE MQTT MAINBOARD IP67 (Conformal Coated) ESP32 / Modem (Coprocesador Red) UART + DMA (Día 249/251) STM32F401 (Cortex-M4) FreeRTOS Kernel (Preemptive) 1. Task_Metrologia 2. Task_RFID_Crypto 3. Task_Telemetry 4. Task_Audio_FSM 5. Task_Balizas 6. Task_Tamper_ADC EEPROM DB + Journaling I2C Star GND (Net-Tie) Caudalímetro EOL Resistor 10k ADC DMA (Día 240) Sensor Temp PT100 DSP Filter (API 54) RFID RC522 Crypto Mifare SPI Sello OIML PC817 Opto GPIO Válvula Gas LP (24V DC - PGND) Torreta Andon FSM Visual (Día 248) Buzzer PWM Transistor Drive (Día 247) Teclado ESD Filtro TVS (Día 244)

⚙️ Código Maestro: El Cerebro del Sistema

A continuación, presentamos la estructura definitiva del archivo main.c. Observa cuidadosamente cómo cada función que hemos desarrollado a lo largo de este trimestre tiene un lugar específico en la línea de tiempo del procesador. El RTOS no arranca hasta la línea 80; todo lo que ocurre antes es supervivencia pura de hardware.


/**
 * @file main.c
 * @brief DESPACHADOR DE GAS LP - FIRMWARE MASTER (CIERRE FASE 5)
 * @author Arquitecto de Sistemas Embebidos
 * @version 1.0.0 (OIML Compliant, SIL-3 Architecture)
 */

#include "stm32f401xe.h"
#include "cmsis_os2.h"
#include "hardware_watchdog_bor.h"
#include "disaster_recovery.h"
#include "metrologia_oiml.h"
#include "uart_pcb_integrity.h"
#include "rfid_mifare.h"
#include "buzzer_fsm.h"
#include "balizas_andon.h"
#include "tamper_adc.h"

// Variables Globales de Estado del Sistema
volatile FSM_Estado_t estado_maquina_actual = ESTADO_INICIALIZANDO;

// =========================================================================
// FUNCIÓN PRINCIPAL (ENTRY POINT)
// =========================================================================
int main(void) {
    
    // 1. INICIALIZACIÓN DE MUY BAJO NIVEL (HAL & Relojes)
    HAL_Init();
    SystemClock_Config(); // Sube el Cortex-M4 a 84 MHz
    
    // 2. AUTOPSIA DEL SILICIO (Día 253)
    // Antes de configurar memoria o periféricos, evaluamos por qué nos reiniciamos.
    ResetSource_t causa_muerte = Analizar_Causa_Muerte();
    
    // Autocuración: Verificamos que los Option Bytes (BOR Nivel 3) estén activos.
    // Si no lo están, la función sobreescribe la Flash y reinicia físicamente la placa.
    Asegurar_Blindaje_BrownOut();
    
    // 3. INICIALIZACIÓN DE BUSES SÍNCRONOS PRIMARIOS
    // Requerimos I2C y SPI para hablar con EEPROM y RFID inmediatamente.
    MX_I2C1_Init();
    MX_SPI1_Init();
    
    // 4. RUTINA FORENSE Y RECUPERACIÓN DE DESASTRE (Día 252)
    // Analizamos el Journaling de la EEPROM. Si la bandera dice "VENTA_EN_CURSO",
    // hubo un apagón. Cerramos la venta y recuperamos los litros.
    Recuperacion_Desastre_Init();
    
    // 5. CARGA DE PARÁMETROS METROLÓGICOS (Día 254)
    // Extraemos el K-Factor validando el Sello OIML (Hardware Interlock).
    Metrologia_Cargar_Parametros_EEPROM();
    
    // 6. INICIALIZACIÓN DE PERIFÉRICOS ASÍNCRONOS
    MX_GPIO_Init();
    UART_Integridad_Init();   // UART + DMA + Oversampling 16x (Día 249/251)
    MX_ADC1_Init();           // ADC para Circuito Tamper EOL (Día 240)
    MX_TIM2_Init();           // Timer PWM para Zumbador (Día 247)
    
    // 7. INICIALIZACIÓN DEL RTOS (FreeRTOS v10.x)
    osKernelInitialize();
    
    // 8. CREACIÓN DE TAREAS (HILOS PARALELOS)
    // Prioridades: Seguridad > Metrología > Comunicaciones > HMI
    
    // Tarea 1: Detección Antivandalismo de Hardware (Prioridad Real-Time)
    osThreadNew(Task_ADC_Tamper_Monitor, NULL, &ThreadAttr_Tamper_High);
    
    // Tarea 2: Cálculo de Flujo y API 54 Thermodinámica (Prioridad Alta)
    osThreadNew(Task_Metrologia_Core, NULL, &ThreadAttr_Metro_High);
    
    // Tarea 3: Crypto Autenticación Mifare (Prioridad Normal)
    osThreadNew(Task_RFID_ControlAcceso, NULL, &ThreadAttr_RFID_Normal);
    
    // Tarea 4: Offload UART a ESP32/AWS (Prioridad Normal)
    osThreadNew(Task_Telemetria_Cloud, NULL, &ThreadAttr_Comm_Normal);
    
    // Tarea 5: Sintetizador de Audio No-Bloqueante (Prioridad Baja)
    osThreadNew(Task_Buzzer_Player, NULL, &ThreadAttr_HMI_Low);
    
    // Tarea 6: Balizas de Estado Andon Poka-Yoke (Prioridad Baja)
    osThreadNew(Task_Balizas_Andon, NULL, &ThreadAttr_HMI_Low);
    
    // 9. ARRANQUE DEL PLANIFICADOR (SCHEDULER)
    // El sistema cambia al estado REPOSO y la CPU asume control asíncrono total.
    estado_maquina_actual = ESTADO_REPOSO;
    osKernelStart();
    
    // 10. EL POZO SIN FONDO
    // En un sistema RTOS perfecto, la ejecución NUNCA debe llegar a este punto.
    // Si llega aquí, significa que la RAM se agotó al crear las tareas.
    while (1) {
        // Disparar baliza ROJA por hardware directo.
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); 
    }
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Cierre Trimestral: El Prototipo de Grado Industrial está listo.

Mira lo que has construido. No es un proyecto de universidad pegado con cinta adhesiva. Es un sistema Tolerante a Fallos, diseñado bajo reglas MISRA-C, con barreras galvánicas, encriptación AES/Crypto1 en el borde, sellos físicos OIML, recuperación de bases de datos offline y arquitectura asíncrona RTOS con aceleración DMA. Has domado la termodinámica del gas licuado de petróleo y las fluctuaciones de la red eléctrica nacional.

El corazón físico de la máquina está latiendo. En el próximo y último trimestre (Q4), levantaremos la mirada hacia la estratósfera. Conectaremos este titan de acero y silicio con la nube (AWS IoT Core), orquestaremos actualizaciones inalámbricas seguras (FOTA con Firmas Criptográficas), procesaremos flujos de caja en aplicaciones móviles y finalizaremos la documentación exigida para la certificación comercial. Tómate un respiro, Arquitecto. El hardware está domado.

📝 Resumen del Dia