Lo que NO debes decir: "Programé el microcontrolador para que baje el código de internet y se actualice solo, así no tenemos que ir a la gasera a conectarle el cable."
El Pitch del Arquitecto: "Implementé una Arquitectura FOTA (Firmware Over-The-Air) basada en un Gestor de Arranque personalizado (Custom Bootloader). La memoria Flash del STM32 está sectorizada en un Slot A (Activo) y un Slot B (Descarga). Cuando el ESP32 recibe una actualización, la inyecta en el Slot B. Mi Bootloader valida la firma criptográfica (SHA-256) del nuevo binario antes de ejecutar el re-mapeo de la Tabla de Vectores (Vector Table Relocation). Si la actualización falla por un corte de energía, el Bootloader hace un 'Rollback' automático al Golden Master, garantizando que el despachador jamás quede 'brickeado' (inutilizable)."
Lo que NO debes decir: "Le puse unos optoacopladores entre el micro y las válvulas para que si hay un corto no se queme la placa."
El Pitch del Arquitecto: "El diseño de PCB emplea un Aislamiento Galvánico estricto ($V_{iso} = 5000V_{rms}$). Separé físicamente el Dominio Lógico de 3.3V (STM32 y Metrología) del Dominio de Potencia de 24V (Electroválvulas). Esta barrera se sostiene mediante optoaisladores de alta velocidad para las señales y un convertidor DC-DC aislado para la energía. Esto asegura que el ruido transitorio (Flyback) de las bobinas de gas y las interferencias de modo común jamás crucen hacia el silicio, garantizando la integridad matemática del cálculo de volumen."
Paso 1: El Gancho (The Hook).
Nunca empieces explicando el código. Empieza con el Problema Físico o Comercial. Ejemplo: "Enviar a un técnico a actualizar 1,000 gaseras en todo el país costaría medio millón de pesos. Por eso, diseñé la Arquitectura FOTA..."
Paso 2: La Metáfora Técnica.
El jurado puede estar compuesto por mecánicos, administradores y electrónicos. Usa conceptos puente. Para el Bootloader, usa "La oficina de correos que revisa el paquete antes de abrirlo". Para el aislamiento galvánico, usa "Un foso de castillo que el ruido eléctrico no puede saltar porque la señal cruza volando en forma de luz (Optoacoplador)". Una vez que asienten con la cabeza, golpea con la jerga de ingeniería pesada (Vector Table, Flyback transients, Bare-Metal).
Este es uno de los fragmentos de código más técnicos que un ingeniero de software embebido debe dominar. Muestra exactamente cómo el microcontrolador abandona el Gestor de Arranque y le cede el control absoluto a tu aplicación de Despacho de Gas, manipulando directamente el puntero de la pila (Stack Pointer) y el contador de programa (Program Counter).
/**
* @file bootloader_jump.c
* @brief Rutina Bare-Metal para saltar desde el Bootloader hacia la Aplicación Principal.
* Evita el uso de librerías estándar. Manipulación directa de punteros de función y registros ARM.
*/
#include "stm32f4xx.h"
#include <stdint.h>
// La dirección física donde comienza el Sector 1 de Flash (SLOT A)
#define APPLICATION_ADDRESS 0x08040000
// Definición de un Puntero a Función que no recibe ni devuelve nada (void)
typedef void (*pFunction)(void);
// =========================================================================
// SALTO CRÍTICO DEL BOOTLOADER A LA APLICACIÓN
// =========================================================================
/**
* @brief Des-inicializa el hardware del bootloader y lanza el firmware de la app.
*/
void Bootloader_Jump_To_Application(void) {
pFunction JumpToApplication;
uint32_t JumpAddress;
// 1. COMPROBACIÓN DE INTEGRIDAD BÁSICA
// Validamos que el valor en la primera dirección de la App (que contiene el
// valor inicial del Main Stack Pointer) apunte a un área válida de SRAM.
// 0x20000000 es la base de la SRAM en la familia STM32.
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000) == 0x20000000) {
// 2. EXTRAER EL RESET HANDLER DE LA APLICACIÓN
// La dirección de inicio del código (Program Counter) está almacenada
// 4 bytes después del inicio de la aplicación (después del Stack Pointer).
JumpAddress = *(__IO uint32_t*)(APPLICATION_ADDRESS + 4);
// Asignamos esta dirección física a nuestro Puntero a Función
JumpToApplication = (pFunction)JumpAddress;
// 3. DESACTIVAR INTERRUPCIONES DEL BOOTLOADER
// Si no hacemos esto, una interrupción pendiente del Bootloader intentará
// ejecutarse cuando la App ya esté corriendo, causando un Hard Fault mortal.
__disable_irq();
// (En un sistema real, aquí también se resetean los periféricos HAL usados)
// HAL_DeInit();
// 4. PREPARAR EL ENTORNO DE EJECUCIÓN (ARM Cortex-M specific)
// Re-localizamos la Tabla de Vectores de Interrupción para que el núcleo
// sepa dónde encontrar las interrupciones de la NUEVA aplicación.
SCB->VTOR = APPLICATION_ADDRESS;
// Inicializamos el Main Stack Pointer (MSP) físico del procesador
// con el valor extraído de la memoria de la Aplicación.
__set_MSP(*(__IO uint32_t*)APPLICATION_ADDRESS);
// 5. EL SALTO SIN RETORNO
// Invocamos la función. El Program Counter (PC) salta a la aplicación.
// El Bootloader muere aquí, y la aplicación del Despachador de Gas "Nace".
JumpToApplication();
}
// 6. MANEJO DE ERROR
// Si la comprobación de integridad del paso 1 falla, significa que el Slot A
// está vacío o corrupto. El Bootloader debe entrar en modo de emergencia.
while(1) {
// Ejecutar rutina LED de error crítico o esperar comando de rescate UART.
}
}
Objetivo del día: Demostrar propiedad absoluta sobre el Hardware y el Software diseñado.
El Síndrome del Impostor ataca con fuerza justo antes de la línea de meta. Quizás dudes si tus decisiones de usar matemáticas de Punto Fijo en lugar de sprintf (Día 336), o tu decisión de utilizar KiCad para diseñar trincheras de aislamiento galvánico, fueron las correctas. Lo fueron.
Tu diseño es superior al 90% de los proyectos universitarios comerciales porque está fundamentado en la supervivencia en condiciones extremas. Cuando te pares frente a ese comité, no pidas disculpas por no tener una pantalla táctil HD reproduciendo videos 4K. Defiende tu LCD Transflectivo Monocromático (Día 357) argumentando el contraste solar y el consumo energético. Defiende tu Código C Bare-Metal argumentando el determinismo de la metrología del gas. Este ensayo general tiene como propósito que te creas el título que estás a punto de recibir. No eres un estudiante presentando un prototipo; eres el Arquitecto Defendiendo su Máquina.