Entrada/Salida en Paralelo (GPIO)
Los pines se agrupan en puertos y permiten la configuración de entrada/salida, contando en ocasiones con una resistencia de pull-up interna.
- Etapas de salida:
- Push-pull: Fuerza niveles lógicos 0 y 1.
- Colector-drenador abierto (Open-drain): Solo fuerza el 0; requiere una resistencia de pull-up externa para alcanzar el nivel 1.
- Registros principales:
MODER(modo),PUPDR(configuración de pull-up/pull-down),ODR(datos de salida),IDR(datos de entrada) yBSRR(set/reset de bits de forma atómica).
ADC — Aproximaciones Sucesivas
El convertidor analógico-digital funciona mediante una búsqueda binaria: un DAC genera un valor de prueba, un comparador lo contrasta con la entrada y la unidad de control prueba bit a bit desde el MSB (bit más significativo). Cada comparación decide un bit (1 si el valor cabe, 0 si se excede).
- Arquitectura Cortex-M: Dispone de hasta 3 convertidores (donde ADC1 y ADC2 pueden operar en modo dual). Ofrece una resolución de 8 a 16 bits y hasta 20 fuentes de entrada (6 rápidas y 14 lentas). En ciertos modelos, fija los bits de dos en dos, por lo que N iteraciones resultan en 2N bits.
- Canales Regulares: Hasta 16 en secuencia con prioridad normal. Se configuran en
ADC_SQRny el resultado se almacena enADC_DR. - Canales Inyectados: Hasta 4 canales prioritarios sobre los regulares. Permiten disparo único o por evento. Se configuran en
ADC_JSQRy el resultado va aADC_JDRn. - Tiempo de conversión: Se define como
T_CONV = T_SMP + ciclos. Si se reduce excesivamente el tiempo de muestreo (T_SMP), se pierde precisión en los bits efectivos. El arranque se realiza conADSTARTpara regulares oJADSTARTpara inyectadas.
UART (Universal Asynchronous Receiver-Transmitter)
Es una comunicación serie asíncrona que utiliza 2 hilos. La trama se compone de: START + 5–8 bits de datos (enviando el LSB primero) + bit de paridad opcional (para detección de errores) + STOP (1–2 bits). En estado de reposo, la línea se mantiene en nivel alto.
- Velocidad: Se define como 1 dividido por la duración de un bit, medida en baudios.
- RS-232: Utiliza niveles de tensión invertidos (el «1» lógico oscila entre −3 y −15 V, y el «0» entre +3 y +15 V). Conecta equipos DTE (PC) con DCE (módem). El cruce de las líneas TX/RX da lugar a un cable null-modem.
- RS-485: Es una versión diferencial y multidispositivo. Puede ser Full-duplex (4 hilos) o Half-duplex (2 hilos).
- Implementación en Cortex-M: Utiliza registros de desplazamiento y una FIFO para liberar carga a la CPU. Registros clave:
TDR(transmisión),RDR(recepción),BRR(configuración de baudios) eISR(estado). Flags críticos:PE(error de paridad),FE(error de trama) yORE(pérdida de datos por desbordamiento de la FIFO).
I²C (Inter-Integrated Circuit)
Protocolo de solo 2 hilos: SDA (datos) y SCL (reloj), con masa común. Cada dispositivo posee una dirección única. El maestro inicia la comunicación y genera el reloj SCL, mientras que el esclavo es direccionado.
- Hardware: Salidas en colector/drenador abierto con resistencias de pull-up obligatorias. Esto permite una configuración de AND cableada.
- Trama: START + dirección (7 bits) + bit R/W + ACK + dato + ACK + STOP. Se envía el MSB primero. El ACK lo genera el receptor poniendo la línea SDA a 0.
- Condiciones de control: El START es un flanco de bajada de SDA con SCL alto; el STOP es un flanco de subida de SDA con SCL alto. Mientras SCL está alto, SDA no debe cambiar excepto para estas condiciones.
- REPEATED START: Permite reiniciar el bus sin liberarlo para combinar operaciones de escritura y lectura. En lectura, el maestro no genera el ACK en el último byte para indicar el fin de la transferencia.
- Arbitraje: En sistemas multimaestro, el dispositivo que emite un 1 pero lee un 0 en SDA pierde el arbitraje y pasa a modo esclavo.
- Velocidades y funciones: Standard (100 kbit/s), Fast (400 kbit/s) y Fast+ (1 Mbit/s). El esclavo puede realizar clock stretching (estirar el SCL) si requiere más tiempo de procesamiento.
SPI (Serial Peripheral Interface)
Protocolo síncrono y rápido (capaz de superar los 12 Mbps). Utiliza las líneas: SCK (reloj), MOSI (maestro a esclavo), MISO (esclavo a maestro) y un CS (Chip Select) por cada esclavo. Para N esclavos se requieren N+3 líneas.
- Funcionamiento: Opera en anillo; cada transmisión implica una recepción simultánea.
- Modos de transmisión: CPOL define el nivel de reposo del reloj y CPHA define el flanco activo. Existen 4 modos posibles.
- Variantes avanzadas: Dual, Quad y Octal SPI (con múltiples líneas de datos bidireccionales). Permite la tecnología XIP (Execute In Place) para ejecutar programas directamente desde memorias externas.
- Comparativa: El SPI es más veloz y full-duplex, pero requiere más cableado que el I²C, el cual direcciona por software y usa solo 2 hilos.
Programación en C y Arquitectura de Memoria
Variables y Punteros
- static local: Conserva su valor entre llamadas, su ámbito es local, no se almacena en la pila y se inicializa solo una vez.
- Punteros:
arepresenta el valor,&ala dirección y*pel contenido apuntado. El autoincremento de un puntero depende del tamaño del tipo de dato. - Paso de parámetros: Por valor (copia) o por referencia (usando
&varpara modificar el original, pudiendo usarconstpara protección). - Union: Los campos comparten la misma dirección de memoria. El tamaño de la unión es el del campo más grande.
Marco de Pila (Stack Frame)
En la arquitectura Cortex-M, los registros r0–r3 se usan para parámetros y retorno (no se preservan), mientras que r4–r11 y r13 deben preservarse.
- r13 (SP): El puntero de pila apunta a la cima; la pila crece hacia abajo.
- r7 (Frame Pointer): Copia fija del SP al entrar en la función para servir como referencia estable.
- Secuencia de ejecución: PUSH de registros → Ajuste de r7 → Reserva de espacio en pila (SUB SP) → Cálculos → Restauración de SP → POP de registros → BX LR.
Estándar MISRA C
Directrices de seguridad: usar tipos con tamaño definido (uint8_t), declarar como static funciones internas, uso obligatorio de llaves en estructuras de control, evitar el desplazamiento de bits con signo y no reutilizar nombres de variables en ámbitos anidados.
Sistemas Operativos de Tiempo Real (RTOS)
Un RTOS permite la multitarea mediante un planificador que alterna rápidamente entre tareas. El Tick es la interrupción periódica que actúa como latido del sistema.
- Cambio de Contexto: Proceso de guardar el estado de la tarea saliente (PC, pila, registros) y restaurar el de la entrante. En Cortex-M se usan dos pilas: MSP (para excepciones) y PSP (para tareas).
- Estados de un proceso: Ejecutando, Preparado, Bloqueado (esperando un recurso o delay) y Suspendido.
- Condiciones de Carrera: Ocurren cuando dos tareas acceden a una variable compartida de forma no atómica. Se protegen mediante secciones críticas o semáforos.
- Inversión de Prioridad: Un problema donde una tarea de prioridad media impide que una de prioridad alta se ejecute porque una de prioridad baja retiene un recurso. Se soluciona mediante la herencia de prioridad (implementada en los Mutex).
- Deadlocks: Bloqueo mutuo entre tareas por reserva cruzada de recursos. Se evita adquiriendo los recursos siempre en el mismo orden.
Linux Empotrado y Gestión de Procesos
Yocto y Buildroot son herramientas para crear imágenes de Linux a medida.
- Memoria Virtual: La MMU traduce direcciones virtuales a físicas en páginas (normalmente de 4 KB). Esto proporciona aislamiento entre procesos. Un page fault no siempre es un error; puede ser una carga bajo demanda (lazy allocation).
- Gestión de Procesos:
fork()crea una copia del proceso,exec()reemplaza el código del proceso actual ywait()permite al padre recoger el estado del hijo para evitar procesos zombie. - Hilos (Threads): Conocidos como procesos ligeros, comparten el segmento de datos y el heap, pero tienen su propia pila (.stack).
- Comunicación entre Procesos (IPC): Incluye señales (estándar y de tiempo real), memoria compartida (POSIX o mmap), tuberías (pipes/FIFOs) y variables de condición.
- Planificador de Linux: Utiliza políticas como
SCHED_OTHER(normal),SCHED_FIFOySCHED_RR(tiempo real). Los procesos de tiempo real tienen prioridad sobre los normales.
Periféricos Avanzados en STM32
PWM (Pulse Width Modulation)
Permite variar el ancho del pulso para controlar la potencia media. Se basa en un contador (CNT) y un comparador (CCR). Las fórmulas clave son: fPWM = fCK / [(PSC+1)(ARR+1)] y el ciclo de trabajo D = CCRn/(ARR+1).
Watchdog (Perro Guardián)
- IWDG (Independiente): Usa el reloj LSI, es resistente a fallos del reloj principal y se usa para resets de seguridad.
- WWDG (Ventana): Usa el reloj PCLK y requiere que el refresco se haga dentro de una ventana temporal específica, detectando ejecuciones demasiado rápidas o lentas.
DMA (Direct Memory Access)
Permite el movimiento de datos entre periféricos y memoria sin intervención de la CPU. El modo cycle steal alterna con la CPU, mientras que el modo burst acapara el bus para máxima velocidad.
Temporizadores y RTC
- Temporizadores: Se dividen en avanzados (TIM1/8 con PWM trifásica), de propósito general (TIM2-5 de 32 bits) y básicos (TIM6/7 para interrupciones simples).
- RTC (Real Time Clock): Funciona en el dominio VBAT para mantener la hora mediante una batería externa. Utiliza el cristal LSE de 32768 Hz y almacena los datos en formato BCD.
