DÍA 094 DE 365

Fase 2: Fundamentos de Hardware y Electrónica

📖 Teoría a Estudiar

El Espectro de Abstracción en STM32

STMicroelectronics entrega tres formas de hablar con su hardware. Imagina que quieres conducir un automóvil:

El "Overhead" (Costo) Computacional

El problema del HAL no es compilar un LED; el problema es cuando manejas interrupciones de alta velocidad. Una interrupción UART en HAL llama a una función genérica que revisa más de 12 banderas de error distintas antes de leer tu byte. Ese proceso puede consumir 80 ciclos de reloj. En Bare-Metal, leer ese mismo byte consume 2 ciclos de reloj.

PIRÁMIDE DE ABSTRACCIÓN Y RENDIMIENTO HAL LL (Low-Layer) CMSIS (Bare-Metal) SILICIO (Hardware Transistores) TIEMPO DE DESARROLLO (Rápido) Portabilidad de Código RENDIMIENTO & CONTROL (Veloz) Menor consumo de memoria Flash HAL_GPIO_TogglePin() LL_GPIO_TogglePin() GPIOA->ODR

⚙️ Ejercicios Prácticos

Ejercicio 1: Compara visualmente el código necesario para conmutar un pin (por ejemplo, el relé de la válvula) usando las tres metodologías. Nota cómo la función LL y Bare-Metal son casi idénticas físicamente al compilar, mientras que el HAL esconde un proceso monstruoso.


// ==========================================================
// MÉTODO 1: EL ENFOQUE HAL (Hardware Abstraction Layer)
// ==========================================================
// Pro: Fácil de leer. 
// Contra: Llama a una función externa. Incurre en un salto de contexto 
// en la memoria, apila variables, verifica si el puerto existe (assert), 
// y finalmente hace la conmutación matemática. Lento.

HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);


// ==========================================================
// MÉTODO 2: EL ENFOQUE LL (Low-Layer de STMicroelectronics)
// ==========================================================
// Pro: ST define esto como '__STATIC_INLINE'. El compilador reemplaza 
// la "función" por la operación matemática directa. Es rápido y legible.

LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_5);

/* (Internamente en el archivo stm32f4xx_ll_gpio.h, LL hace esto:)
   __STATIC_INLINE void LL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t PinMask) {
       uint32_t odr = GPIOx->ODR;
       GPIOx->BSRR = ((odr & PinMask) << 16U) | (~odr & PinMask);
   }
*/


// ==========================================================
// MÉTODO 3: EL ENFOQUE BARE-METAL PURO (CMSIS)
// ==========================================================
// Pro: Cero overhead, compilación de una sola instrucción en Ensamblador, 
// memoria hiper-reducida y control total. 
// Contra: Requiere documentar bien el código.

GPIOA->ODR ^= (1 << 5); 

// (O si usamos el registro seguro atómico BSRR como en el Día 93):
// if (GPIOA->ODR & (1<<5))  GPIOA->BSRR = (1 << (5 + 16)); // Reset
// else                      GPIOA->BSRR = (1 << 5);        // Set
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Justificación técnica del uso de CMSIS para Metrología.

Tu Despachador de Gas usará un sensor de flujo de Efecto Hall. Cada vez que pasa 1 mililitro de gas, el sensor envía un pulso eléctrico al pin de tu procesador. Si el gas fluye a alta presión, recibirás miles de pulsos por segundo.

Si usas la librería HAL, cada vez que llegue un pulso, el procesador abandonará lo que esté haciendo, guardará contexto, ejecutará la masiva función HAL_GPIO_EXTI_IRQHandler, limpiará banderas y buscará un "Callback". Ese proceso consume hasta 80 ciclos de reloj. Si los pulsos son muy rápidos, el procesador se asfixiará (Starvation) y perderá pulsos. Perder un pulso significa regalarle gas al cliente sin cobrárselo.

En nuestro enfoque Bare-Metal, el hardware interrumpe, tú limpias la bandera escribiendo un solo bit en un registro, sumas litros++ y sales. Toma 12 ciclos de reloj. Es por esto que las aplicaciones de metrología pesada desprecian el HAL y abrazan el Silicio. Para el resto del curso, usaremos CMSIS puro, apoyándonos en LL solo como material de consulta cuando el Reference Manual sea demasiado oscuro.

📝 Resumen del Día