DÍA 281 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

El Oscilador Pierce y la Capacitancia Parásita (Cs)

Un cristal de cuarzo no oscila por sí solo; es un filtro mecánico de altísimo factor Q. Para mantenerlo vibrando, el STM32 utiliza un amplificador inversor interno (Oscilador Pierce). Para que este circuito resuene exactamente a la frecuencia grabada en el metal del cristal (ej. 8.000 MHz), necesita "ver" una capacitancia de carga (Load Capacitance - CL) perfecta en sus terminales.

La fórmula industrial dictamina que los dos capacitores cerámicos físicos (C1 y C2) que sueldas a tierra no son iguales al CL del cristal. La placa de cobre en sí misma actúa como un capacitor invisible. Cada milímetro de pista que dibujas en KiCad agrega Capacitancia Parásita (Cs), típicamente estimada entre 3 pF y 5 pF.

La ecuación de diseño es: C1 = C2 = 2 * (CL - Cs).

Si ruteas el cristal con pistas largas, cruzas otras señales, o usas Vías para cambiar de capa, la capacitancia parásita (Cs) se volverá incontrolable. El reloj arrancará tarde, oscilará con Jitter (temblor de fase) o, peor aún, se detendrá silenciosamente si la temperatura ambiente baja de cero grados en la estación de gas.

El Anillo de Guarda (Guard Ring)

Para proteger esta frágil danza analógica del ruido infernal de los relés y antenas Wi-Fi vecinas, se aísla el cristal construyendo una jaula de Faraday bidimensional en la PCB. Se dibuja un anillo de cobre alrededor del cristal, conectado a la tierra analógica, confinando el campo eléctrico. Se prohíbe terminantemente que cualquier otra pista cruce por debajo del cristal en ninguna capa.

TOP LAYER - RUTEO DE CRISTAL (HSE) STM32F401 OSC_IN OSC_OUT VSS (GND) GUARD RING (Conectado a GND Analógico Puro) 8 MHz Y1 C1 C2 REGLAS DE RUTEO (DFM) 1. C1 y C2 lo más cerca del MCU. 2. Pistas de igual longitud. 3. NUNCA usar Vías para la señal. 4. Rodear con Anillo de Guarda. KEEP-OUT ZONE: Sin cobre debajo

⚙️ Pasos Prácticos en KiCad 8

Paso 1: Posicionamiento Táctico.
En el PCB Editor, posiciona el cristal (Y1) y los capacitores (C1, C2) tan cerca físicamente de los pines OSC_IN y OSC_OUT del STM32 como las reglas de manufactura lo permitan. La distancia total de la pista de cobre no debería superar los 10 o 15 milímetros.

Paso 2: Ruteo Analógico Limpio.
Selecciona un ancho de pista fino (0.25 mm) para evitar engrosar el cobre y aumentar la capacitancia. Rutea desde el cristal hasta el STM32 en la capa superior (F.Cu). No presiones la tecla 'V' en ningún momento; está prohibido usar vías en estas dos pistas. Mantén ambas pistas lo más simétricas y paralelas posible.

Paso 3: El Anillo de Guarda y el Keep-Out.

  1. Usa la herramienta Add a filled zone en la capa F.Cu para dibujar un perímetro de cobre alrededor de los componentes del reloj. Asígnalo a la red GND.
  2. Conecta este polígono directamente al pin VSS (GND) más cercano del STM32.
  3. Usa la herramienta Add a rule area (Keep-Out). Dibuja un rectángulo en las capas internas y en la capa B.Cu exactamente debajo del cristal y las pistas. Marca la opción "Keep out copper pour / tracks". Esto evita que el plano inferior actúe como una placa de capacitor (reduciendo la Cs parasitaria) y asegura que no pases una ruidosa pista I2C por debajo del reloj.

💻 Firmware: Detección de Falla de Hardware (Bare-Metal)

Incluso con el mejor diseño de PCB del mundo, un cristal puede dañarse físicamente si el Despachador recibe un golpe mecánico fuerte. El estándar de alta disponibilidad dicta que el software no debe quedarse colgado en un bucle infinito (while(1)) esperando a que el hardware defectuoso responda. Diseñaremos un inicializador seguro con *Timeout*.


/**
 * @file hw_clock.c
 * @brief Inicialización de Reloj HSE Bare-Metal con Anti-Deadlock (MISRA-C)
 */

#include "stm32f401xe.h"
#include <stdint.h>
#include <stdbool.h>

// =========================================================================
// DEFINICIONES DE TIMEOUT (Guardrail)
// =========================================================================
// Define un límite de ciclos de CPU para esperar al cristal.
// A 16MHz (reloj interno HSI por defecto), 20000 iteraciones son ~unos pocos ms.
#define HSE_TIMEOUT_VAL     (20000U)

// =========================================================================
// SECUENCIA DE ARRANQUE SEGURO
// =========================================================================
/**
 * @brief Intenta encender el Cristal Externo (HSE). Si falla por daño físico
 *        o capacitancia parásita, aborta de forma segura.
 * @retval bool: TRUE si el cristal oscila y es estable, FALSE si murió.
 */
bool Clock_Init_HSE_Safe(void) {
    
    uint32_t timeout_counter = 0U;
    
    // 1. Activar el Oscilador Externo (HSE) en el RCC (Reset and Clock Control)
    RCC->CR |= RCC_CR_HSEON;
    
    // 2. ESPERA ACTIVA CON SALIDA DE EMERGENCIA
    // El hardware levantará el bit HSERDY cuando la oscilación Pierce sea estable.
    while (((RCC->CR & RCC_CR_HSERDY) == 0U) && (timeout_counter < HSE_TIMEOUT_VAL)) {
        timeout_counter++;
        
        // __NOP() evita optimizaciones agresivas del compilador en el loop
        __asm("nop"); 
    }
    
    // 3. EVALUACIÓN DE SALUD DEL HARDWARE
    if (timeout_counter >= HSE_TIMEOUT_VAL) {
        
        // ¡FALLO CRÍTICO DE HARDWARE DETECTADO!
        // El cristal físico está roto, desoldado, o el anillo de guarda falló.
        // Apagamos el HSE defectuoso para ahorrar energía.
        RCC->CR &= ~RCC_CR_HSEON;
        
        // El sistema seguirá corriendo usando el reloj interno HSI (menos preciso).
        // En un diseño industrial real, aquí levantaríamos un flag en la EEPROM 
        // y avisaríamos vía AWS: "Alarma: Operando con Reloj Degradado".
        
        return false; 
    }
    
    // 4. TRANSICIÓN DE NÚCLEO (Cambiar el CPU al reloj externo)
    // Limpiamos los bits de selección (SW) y ponemos 01 (Selección HSE)
    RCC->CFGR &= ~(RCC_CFGR_SW);
    RCC->CFGR |= RCC_CFGR_SW_HSE;
    
    // Esperamos confirmación del hardware de que el switch fue exitoso
    while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSE) {
        // En este punto ya sabemos que el cristal vibra, el switch es inmediato.
    }
    
    return true; // El corazón del sistema late a la perfección.
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Sincronización de Precisión y Prevención de Jitter en Metrología Crítica.

Un reloj inestable es un asesino silencioso de proyectos embebidos. Si rutearas el cristal de tu STM32F401 con pistas largas cruzando por encima de la capa de comunicación del ESP32, el ruido de radiofrecuencia (Wi-Fi) se acoplaría en las pistas de tu reloj. Esto introduciría Jitter (variación en el tiempo de los ciclos de reloj). El impacto en el Despachador de Gas LP sería devastador: tu procesador ejecutaría las interrupciones del caudalímetro en intervalos irregulares, calculando un volumen falso de litros y cobrándole de más (o de menos) al cliente. Es el tipo de "bug" fantasma que jamás encontrarás leyendo código C.

Al dominar el diseño electromagnético del Anillo de Guarda (Guard Ring) y las Zonas Keep-Out en KiCad, sellaste herméticamente el circuito analógico de Pierce de interferencias externas. Además, tu código de inicialización *Bare-Metal* con Timeout evita el bloqueo infinito (Deadlock) que inutilizaría la máquina si el cristal se fractura por las vibraciones del motor. Has diseñado una arquitectura de tiempo real de grado automotriz/industrial donde el hardware y el software se protegen mutuamente.

📝 Resumen del Día