DÍA 130 DE 365

Fase 3: Comunicaciones y Redes Industriales

📖 Teoría a Estudiar

La Magia de la Asincronía

En SPI e I2C, utilizábamos una señal de reloj (SCK o SCL) para que ambos chips marcharan al mismo ritmo. En la transmisión Asíncrona (UART), ¡No hay cable de reloj! Solamente hay un cable de Transmisión (TX) y uno de Recepción (RX).

¿Cómo saben los chips cuándo leer un bit si no hay un metrónomo físico? Se ponen de acuerdo previamente en el software. Ambos equipos se configuran a la misma velocidad (Ej. 115200 Baudios, o bits por segundo). Si el receptor sabe que cada bit durará exactamente $8.68\text{ } \mu s$, simplemente mide el tiempo internamente.

La Trama de Datos (The Data Frame)

Dado que no hay reloj, el receptor no sabe en qué momento el transmisor empezará a hablar. Por defecto, la línea UART se mantiene en Alto (3.3V) en reposo (Idle). Cuando el transmisor quiere enviar la letra 'A' (0x41):

  1. Baja la línea a 0V durante un ciclo completo. A esto se le llama Start Bit (Bit de Inicio). Sirve para "despertar" al receptor y sincronizar sus cronómetros.
  2. Envía los 8 bits de datos, desde el menos significativo (LSB) hasta el más significativo (MSB).
  3. Sube la línea a 3.3V durante al menos un ciclo. A esto se le llama Stop Bit (Bit de Parada), devolviendo la línea al reposo.
ARQUITECTURA ASÍNCRONA: CONEXIÓN CRUZADA Y TRAMA (FRAME) STM32 USART2 TX (PA2) RX (PA3) Receptor (PC o ESP32) RX TX El TX de uno va al RX del otro Deben compartir Tierra (GND) Trama Serial enviando letra 'A' (0x41 -> Binario 0100 0001) 3.3V (1) 0V (0) Idle START D0 (1) D1 (0) D2 (0) D3 (0) D4 (0) D5 (0) D6 (1) D7 (0) STOP

La Matemática del Baud Rate (El Registro BRR)

Para configurar la velocidad a 115200 bps, el STM32 utiliza el registro BRR (Baud Rate Register). Este registro divide el reloj del bus interno (APB) en una Mantisa (Parte entera) y una Fracción. Suponiendo que usaremos el USART2 (conectado al bus APB1 que corre a 42 MHz):

USARTDIV = 42,000,000 / (16 * 115200) = 22.786

La parte entera (Mantisa) es 22 (0x16).
La parte fraccional se calcula multiplicando el decimal por 16: 0.786 * 16 = 12.57 -> Lo redondeamos a 13 (0xD).
El valor final que inyectaremos en hardware Bare-Metal es 0x016D.

⚙️ Ejercicios Prácticos

Ejercicio 1: Inicializaremos el USART2, que en las placas Nucleo-F401RE está conectado internamente al chip ST-LINK, permitiéndonos enviar texto directo por el cable USB a la computadora. Configuraremos PA2 (TX) y PA3 (RX) como Función Alternativa 7 (AF7), ajustaremos el Baud Rate y crearemos una función de transmisión simple (Polling).


/**
 * @file usart_driver.c
 * @brief Configuración Bare-Metal del USART2 a 115200 Baudios
 */

#include "stm32f401xe.h"

void inicializar_usart2_115200(void) {
    
    // 1. ACTIVAR RELOJES (GPIOA y USART2)
    // USART2 vive en el bus APB1 (42 MHz)
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
    RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
    
    // 2. CONFIGURAR PINES FÍSICOS (PA2 = TX, PA3 = RX)
    // Modo Función Alternativa (10 en el registro MODER)
    GPIOA->MODER &= ~(GPIO_MODER_MODE2 | GPIO_MODER_MODE3);
    GPIOA->MODER |=  (GPIO_MODER_MODE2_1 | GPIO_MODER_MODE3_1);
    
    // Asignar AF7 (Valor 0111) a los pines PA2 y PA3 en AFR Ligh (AFRL)
    // PA2 empieza en el bit 8, PA3 en el bit 12
    GPIOA->AFR[0] &= ~(0xFF << 8); 
    GPIOA->AFR[0] |=  (0x77 << 8); 
    
    // 3. CONFIGURAR EL BAUD RATE (Velocidad)
    // Cálculo para 42MHz y 115200 bps:
    // Mantisa = 22 (0x16), Fracción = 13 (0xD)
    // USART2->BRR = (Mantisa << 4) | Fracción;
    USART2->BRR = 0x016D; 
    
    // 4. CONFIGURAR CONTROL REGISTER 1 (CR1)
    // Limpiamos todo. Por defecto usa 8 Data bits, 1 Stop bit, sin Paridad.
    USART2->CR1 = 0; 
    
    // Habilitar el Transmisor (TE) y el Receptor (RE)
    USART2->CR1 |= USART_CR1_TE | USART_CR1_RE;
    
    // 5. ENCENDER EL PERIFÉRICO
    USART2->CR1 |= USART_CR1_UE; // USART Enable
}

/**
 * @brief Transmite un solo carácter por la línea TX (Bloqueante)
 */
void uart_enviar_caracter(char c) {
    // Esperar a que el Transmit Data Register Empty (TXE) sea 1
    while (!(USART2->SR & USART_SR_TXE));
    
    // Escribir el carácter en el registro de datos
    USART2->DR = c;
}

/**
 * @brief Imprime una cadena completa de texto por UART
 */
void uart_escribir_cadena(const char *texto) {
    while (*texto) {
        uart_enviar_caracter(*texto++);
    }
}

int main(void) {
    
    // inicializar_relojes_84mhz(); // Esencial para que el cálculo de BRR funcione
    inicializar_usart2_115200();
    
    // Al encender la máquina, saludamos a la terminal serial de la computadora
    uart_escribir_cadena("\r\n=== SISTEMA DESPACHADOR INICIADO ===\r\n");
    uart_escribir_cadena("Cargando variables en RAM...\r\n");
    uart_escribir_cadena("Listo para RS485.\r\n");
    
    while(1) {
        // En el futuro, enviaremos la telemetría periódicamente
        // uart_escribir_cadena("Presion: 120 PSI\r\n");
        // delay_ms_nobloqueante(1000);
    }
    
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Interfaz de Diagnóstico y Telemetría Centralizada.

Hasta hoy, tu máquina era una "Caja Negra". Operaba perfectamente, pero si querías saber cuántos litros había vendido en total durante el día, tendrías que mirar la pequeña pantalla LCD o sacar la memoria EEPROM y leerla en un laboratorio. Ninguna empresa gasera opera así; necesitan los datos de docenas de despachadores consolidados en un Servidor Central.

Al encender la interfaz **USART**, has creado el canal de telemetría. La configuración Bare-Metal que calculamos permite empujar datos a 115,200 bits por segundo hacia un transceptor, un módem Wi-Fi (como el ESP32) o un sistema SCADA. El texto que mandaste en el main() hoy, en el futuro será una trama de datos cifrada con cortes de caja y diagnósticos de sensores. Acabas de poner a tu Tesis en línea.

📝 Resumen del Día