Cuando el STM32 le envía la Trama Binaria de la Venta de Gas (Día 222) al ESP32 o al Módem celular, el pin TX del STM32 sube de 0V a 3.3V bruscamente. En el dominio digital, esto es una onda cuadrada perfecta. En el mundo de la física, una onda cuadrada perfecta requiere energía infinita. Lo que realmente viaja por la pista de cobre es una onda con "picos" de resonancia (Ringing) y rebotes eléctricos.
Si la pista de cobre es muy larga y no está diseñada correctamente, la onda choca contra el pin RX del ESP32 y "rebota" de regreso hacia el STM32, corrompiendo los bits siguientes. Esto se conoce como Reflexión de Señal. Además, si las pistas TX y RX viajan muy juntas en paralelo, el campo magnético de una inducirá voltaje en la otra, causando Cross-Talk (Diafonía).
Pasos en KiCad para Dual-Core UART:
PA9 (TX). Conecta la de U2 (ESP32) directamente al pin GPIO17 (TX).HighSpeed_UART. Asignale un ancho de pista (Track Width) de 0.25 mm y una separación (Clearance) mínima de 0.75 mm (Regla 3W).Ejercicio 1: Mitigación por Software (Hardware Error Handling). Incluso con la mejor PCB, el encendido de los motores eléctricos de la gasolinera generará ruido radiado transitorio. Nuestro firmware MISRA-C debe configurar el UART del STM32 para rechazar ruido, e interceptar los errores de hardware (Framing Error / Noise Error) para evitar que el RTOS procese tramas corruptas.
/**
* @file uart_pcb_integrity.c
* @brief Configuración Hardware UART y Gestión de Errores Electromagnéticos (MISRA-C)
*/
#include "stm32f401xe.h"
#include "cmsis_os2.h"
#include <stdint.h>
extern UART_HandleTypeDef huart1;
// =========================================================================
// INICIALIZACIÓN DE ALTA ROBUSTEZ FÍSICA
// =========================================================================
void UART_Integridad_Init(void) {
// La configuración base del CubeMX suele usar 16x Oversampling.
// Esto significa que el STM32 lee el pin RX 16 veces por cada bit recibido
// y usa una "Votación Mayoritaria" (Majority Vote) para decidir si es 1 o 0.
// Esto es vital para descartar picos de ruido electromagnético.
huart1.Instance = USART1;
huart1.Init.BaudRate = 921600; // Alta velocidad, muy sensible al layout de la PCB
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE; // Usamos CRC8 en nuestro protocolo (Día 222)
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16; // Regla de Oro EMI
if (HAL_UART_Init(&huart1) != HAL_OK) {
// Manejador de Error Seguro
}
}
// =========================================================================
// GESTIÓN DE ERRORES DE HARDWARE (ISR LAYER)
// =========================================================================
/**
* @brief Callback invocado automáticamente por el silicio del STM32 cuando
* detecta corrupción eléctrica en la pista de la PCB.
*/
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
uint32_t error_code = huart->ErrorCode;
// 1. Error de Encuadre (Framing Error - FE)
// La pista UART sufrió Cross-Talk severo o los relojes perdieron sincronía.
if ((error_code & HAL_UART_ERROR_FE) != 0U) {
// Contabilizar para diagnóstico predictivo de la placa madre
// Logs_Registrar_Anomalia_PCB(ERROR_TIPO_FE);
}
// 2. Error de Ruido (Noise Error - NE)
// El Oversampling detectó que el bit varió demasiado rápido durante la lectura.
// Típico de cuando un relé industrial se enciende cerca del cableado.
if ((error_code & HAL_UART_ERROR_NE) != 0U) {
// Logs_Registrar_Anomalia_PCB(ERROR_TIPO_NE);
}
// 3. Error de Desbordamiento (Overrun - ORE)
// El ESP32 envió datos muy rápido y el STM32 estaba ocupado (Data Race).
if ((error_code & HAL_UART_ERROR_ORE) != 0U) {
// Purga obligatoria del registro de datos y reinicio del DMA
__HAL_UART_CLEAR_OREFLAG(huart);
}
// ACCIÓN MITIGADORA MISRA-C:
// Abortar la recepción actual y reiniciar el túnel DMA.
// Dependemos de nuestro protocolo (Día 222) para retransmitir la trama.
HAL_UART_AbortReceive_IT(huart);
// Reiniciar_DMA_Recepcion();
}
}
Objetivo del día: Diseño de Hardware a Nivel Placa (Board-Level Design) y Compatibilidad Electromagnética (EMC).
Un error clásico al pasar de un Arduino en Protoboard a una placa industrial final (PCB) es asumir que "si las conexiones coinciden, la placa funcionará". Muchos ingenieros diseñan placas donde el STM32 y el ESP32 están físicamente alejados, y rutean la pista de comunicación paseando por toda la tarjeta, cruzando por debajo de los relays de 24V y haciendo giros de 90 grados.
Cuando prueban esa máquina, la pantalla se congela aleatoriamente o el sistema se reinicia. Buscan el error en el código C durante meses, sin éxito. El problema no era lógico, era físico. Al aplicar las reglas de **Integridad de Señal** en KiCad (Resistencias de Damping en serie, regla de separación 3W y protección del Plano de Tierra), has creado una carretera digital silenciosa e inmune al ruido del motor de la gasolinera. Documentar este ruteo de alta velocidad en tu Tesis demuestra madurez ingenieril: entiendes que el Microcontrolador no es un ente abstracto, sino un chip analógico intentando sobrevivir en un entorno hostil. Has fusionado exitosamente el Hardware y el Software.
FE) y Ruido (NE) usando los Callbacks de la ISR.