Durante la crisis de semiconductores de 2020-2022, microcontroladores que costaban $3 USD llegaron a venderse en el mercado gris por $80 USD. Las empresas que diseñaron sus placas para soportar una única matrícula de componente se paralizaron. Las empresas que aplicaron DFSC (Design for Supply Chain) simplemente cambiaron su orden de compra a un chip alternativo y continuaron fabricando.
STM32F401RCT6 (256KB Flash) es 100% compatible Pin-to-Pin con el STM32F411RCT6 (512KB Flash) y la familia STM32F412.Paso 1: Identificar Riesgos en el BOM.
Abre tu Lista de Materiales (BOM). Identifica los componentes de fuente única (Single-Sourced). Si usas un regulador Buck DC-DC de Texas Instruments que nadie más fabrica, tienes un riesgo extremo. Si usas un amplificador operacional genérico (como el LM358), tienes docenas de proveedores alternativos.
Paso 2: Ruteo de Huellas Anidadas.
En el Pcbnew de KiCad, coloca el Footprint de un integrado SOIC-8. Luego, coloca justo en el centro el Footprint de la versión TSSOP-8 del mismo componente. Asigna la misma red eléctrica (ej. Net-(U1-Pad1)) a los pines correspondientes de ambos encapsulados y conéctalos con pistas cortas de cobre. Ignora la advertencia de colisión física (Courtyard overlap) de KiCad, ya que en producción solo soldarás uno de los dos chips a la vez.
Si la fábrica agota el `STM32F401` y suelda el `STM32F411` en tu placa, el hardware encenderá perfecto, pero el software se estrellará si no lo preparas. El F401 corre a 84 MHz y el F411 corre a 100 MHz. Configuraremos el C Preprocessor para adaptar la lógica de reloj y periféricos simplemente cambiando una sola línea de código antes de compilar.
/**
* @file hardware_config.h
* @brief Capa de Configuración Defensiva para Gestión de Desabasto (DfSC)
*/
#ifndef HARDWARE_CONFIG_H
#define HARDWARE_CONFIG_H
// =========================================================================
// SELECTOR DE TARGET (Modificar según disponibilidad en la fábrica)
// =========================================================================
#define TARGET_MCU_STM32F401 // Comentar si no hay stock
//#define TARGET_MCU_STM32F411 // Descomentar si usamos el chip alternativo
// =========================================================================
// RESOLUCIÓN DE DEPENDENCIAS EN TIEMPO DE COMPILACIÓN
// =========================================================================
#ifdef TARGET_MCU_STM32F401
#include "stm32f401xe.h"
#define SYS_CLOCK_FREQ_HZ 84000000U
#define EEPROM_START_ADDR 0x08020000U // Sector 5 de la Flash
#define MCU_IDENTIFIER_STR "STM32-F401RC (84MHz)"
#endif
#ifdef TARGET_MCU_STM32F411
#include "stm32f411xe.h"
#define SYS_CLOCK_FREQ_HZ 100000000U
#define EEPROM_START_ADDR 0x08040000U // Mapeo de Flash es distinto en F411
#define MCU_IDENTIFIER_STR "STM32-F411RC (100MHz)"
#endif
// =========================================================================
// APLICACIÓN EN LA LÓGICA DE INICIALIZACIÓN
// =========================================================================
/**
* @brief Inicializa los relojes del sistema adaptándose al chip soldado.
*/
void SystemClock_Config_Adaptive(void) {
printf("\r\n[BOOT] Detectado Target: %s\r\n", MCU_IDENTIFIER_STR);
#if (SYS_CLOCK_FREQ_HZ == 84000000U)
// Configuración específica de PLL para 84 MHz (F401)
// PLL_M = 8, PLL_N = 336, PLL_P = 4, PLL_Q = 7
Configure_PLL_Registers(8, 336, 4, 7);
#elif (SYS_CLOCK_FREQ_HZ == 100000000U)
// Configuración específica de PLL para 100 MHz (F411)
// PLL_M = 8, PLL_N = 400, PLL_P = 4, PLL_Q = 8
Configure_PLL_Registers(8, 400, 4, 8);
#else
#error "Frecuencia de reloj del MCU no soportada."
#endif
}
#endif // HARDWARE_CONFIG_H
Objetivo del día: Sostenibilidad de Manufactura y Resiliencia en la Cadena de Suministro.
Durante tu carrera universitaria te enseñaron a seleccionar el componente "perfecto" para el problema "perfecto". En la ingeniería industrial real, el componente "perfecto" es el componente que puedes comprar hoy en cantidades de 10,000 unidades con entrega inmediata. Si tu Despachador de Gas LP dependía de un sensor de temperatura digital de Texas Instruments que tiene un tiempo de entrega de 52 semanas, tu proyecto era un fracaso logístico esperando suceder.
Al aplicar las técnicas de **Design for Supply Chain (DfSC)**, has transformado tu diseño estático en un diseño fluido. Al trazar huellas anidadas (Nested Footprints) en tu placa KiCad, permites que tu ensamblador de PCB cambie de encapsulados sin cobrarte nuevos costos de ingeniería (NRE - Día 317). Y lo más importante, al estructurar tu código C con directivas de preprocesador (`#ifdef`), separaste la lógica de negocio de la lógica del hardware. Ahora, si la escasez golpea y debes migrar de emergencia a un `STM32F411`, tu algoritmo de metrología, la compensación API 54 y el RTOS que implementaremos pronto permanecerán intactos; solo necesitas cambiar un `#define` y compilar. Has garantizado que tu Tesis nunca será víctima del mercado global.
#ifdef, #define). Esto permite compilar el Firmware de manera condicional para ajustar registros o relojes según el hardware alternativo soldado.