DÍA 099 DE 365

Fase 2: Fundamentos de Hardware y Electrónica

📖 Teoría a Estudiar

El Árbitro de ARM: NVIC

En procesadores antiguos, si una interrupción estaba ejecutándose, el procesador se volvía sordo a cualquier otra señal hasta terminar. La arquitectura ARM Cortex-M soluciona esto con el NVIC (Nested Vectored Interrupt Controller). La palabra clave aquí es Nested (Anidado).

El NVIC permite que una interrupción urgente suspenda a una interrupción menos urgente. Imagina que el procesador está actualizando los milisegundos en la función SysTick_Handler() y, de repente, el usuario presiona el Paro de Emergencia. Si el botón tiene mayor prioridad, el procesador dejará el SysTick a medias, saltará a apagar las válvulas, y luego regresará a terminar el SysTick. Esto es Preemption (Apropiación).

La Matemática Inversa de las Prioridades

En el mundo ARM, existe una regla contraintuitiva y letal si se olvida: El número más bajo representa la prioridad más alta.

JERARQUÍA DE PREEMPTION (NVIC ANIDADO) Tiempo (t) Main Loop Prioridad 5 (Baja Urgencia) Prioridad 0 (Alta Urgencia) while(1) IRQ Timer ISR_Timer IRQ_Emergencia Preemption! ISR_Emergencia (Cierra Válvulas) Termina Timer while(1)

⚙️ Ejercicios Prácticos

Ejercicio 1: Utiliza las macros nativas de CMSIS para habilitar y asignar prioridades a dos interrupciones físicas. En este caso, asignaremos la Prioridad 0 al botón de Emergencia (EXTI0) y la Prioridad 5 al Timer SysTick.


/**
 * @file main.c
 * @brief Configuración del NVIC (Nested Vectored Interrupt Controller)
 */

#include "stm32f401xe.h"

// Macros nativas de CMSIS (core_cm4.h):
// NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
// NVIC_EnableIRQ(IRQn_Type IRQn)

void configurar_prioridades_nvic(void) {
    
    // --- 1. CONFIGURACIÓN DEL SYSTICK ---
    // El SysTick es vital para medir milisegundos, pero no es de vida o muerte.
    // Le asignamos una prioridad MEDIA-BAJA (5).
    // Nota: El SysTick usa una función distinta en CMSIS porque es interno del núcleo.
    NVIC_SetPriority(SysTick_IRQn, 5); 
    
    
    // --- 2. CONFIGURACIÓN DEL PARO DE EMERGENCIA (EXTI0) ---
    // Imagina que mapeamos el Pin PA0 al canal EXTI0 (External Interrupt 0).
    // Esta es la señal más crítica de toda la máquina. 
    // Le asignamos la prioridad MÁS ALTA posible (0).
    NVIC_SetPriority(EXTI0_IRQn, 0);
    
    // Una vez configurada la jerarquía, habilitamos el canal en el hardware del NVIC
    NVIC_EnableIRQ(EXTI0_IRQn);
    
    // --- 3. CONFIGURACIÓN DEL PUERTO SERIE RS485 (USART2) ---
    // Recibir comandos Modbus de la oficina central es importante, 
    // pero si chocan los paquetes, se pueden retransmitir. 
    // Prioridad BAJA (10).
    NVIC_SetPriority(USART2_IRQn, 10);
    NVIC_EnableIRQ(USART2_IRQn);
}

// --- RUTINAS DE SERVICIO DE INTERRUPCIÓN (ISR) ---

// ISR del SysTick (Prioridad 5)
void SysTick_Handler(void) {
    // Si la emergencia ocurre aquí dentro, el hardware suspenderá esta función,
    // saltará a EXTI0_IRQHandler, y luego regresará aquí.
    extern volatile uint32_t milisegundos_globales;
    milisegundos_globales++;
}

// ISR del Paro de Emergencia (Prioridad 0)
void EXTI0_IRQHandler(void) {
    // 1. Apagar válvulas mediante BSRR inmediatamente
    GPIOA->BSRR = (1 << (5 + 16)); 
    
    // 2. Limpiar la bandera de interrupción en el registro de EXTI (Pending Register)
    EXTI->PR |= (1 << 0); 
    
    // ¡Nadie puede interrumpir esta función porque tiene prioridad 0!
}

int main(void) {
    configurar_prioridades_nvic();
    while (1) {
        // ...
    }
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Determinismo absoluto ante eventos críticos.

Un sistema de consumo (como una impresora 3D) puede permitirse congelarse medio segundo para actualizar un gráfico en pantalla. Tu Despachador de Gas LP no tiene ese lujo. Al escribir Bare-Metal, tienes acceso directo al árbitro de ARM (el NVIC).

Al asignar explícitamente la Prioridad 0 al pin del Paro de Emergencia (EXTI0) y la Prioridad 5 al reloj maestro, acabas de construir un Sistema Determinista. Esto significa que puedes garantizar contractualmente a un auditor de seguridad que, sin importar cuán saturado esté el procesador calculando criptografía o transmitiendo por RS485, si alguien golpea el botón físico, la válvula de gas perderá energía en una fracción exacta de microsegundo. El silicio cortará la ejecución, aislará el flujo eléctrico y salvará la integridad mecánica del entorno.

📝 Resumen del Día