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