Académique Documents
Professionnel Documents
Culture Documents
UART es un protocol que maneja comunicación serie. En la comunicación serie, el proceso de envio de
datos es mas sencillo, pero la velocidad de trasmisión no es tan rapida, ya que el proceso de envio de
datos se realiza bit a bit a diferencia de la comunicación paralela que envia varios bits al tiempo. Una de
las ventajas de esta comunicación es que solo necesita 2 cables (uno para transmitir y uno para recibir
las señales).
El protocolo UART utiliza comunicación asincrona, lo que significa que los datos pueden trasmitirse en
cualquier instante, y no hay ninguna coordinación temporal estricta entre TX y RX.
En este tipo de comunicación, dos dispositivos se comunican directamente entre ellos. Solo dos cables
son necesarios para transmitir datos entre dos dispositivos UART. Los datos fluyen desde el pin de
trasmisión TX del dispositivo de trasmisión y son recibidos a traves del pin de recepción RX del
dispositivo de recepción.
Las UART transmiten datos asincrónicamente, lo que significa que no hay una señal de reloj para
sincronizar la salida de los bits de la UART transmisor con el muestreo de los bits de la UART receptor. En
lugar de una señal de reloj, el dispositivo UART de transmision añade bits de inicio y parada al paquete
de datos que se está transfiriendo. Estos bits definen el comienzo y el final del paquete de datos para
que el dispositivo UART receptor sepa cuándo empezar a leer los bits.
Cuando el dispositivo UART receptor detecta un bit de inicio, comienza a leer los bits entrantes a una
frecuencia específica conocida como la tasa de baudios (BAUD RATE). La tasa de baudios es una medida
de la velocidad de transferencia de datos, expresada en bits por segundo (bps). Ambos dispositivos
UART deben operar a la misma velocidad en baudios(idealmente). La tasa de baudios entre los
dispositivos UART de transmisión y de recepción sólo puede diferir en un 10% aproximadamente antes
de que la sincronización de los bits se aleje demasiado, por el contrario pueden haber errores en la
codificación de la información. Ambos dispositivos UART Tambien deben ser configurados para trasmitir
y recibir datos con la misma estructura.
El dispositivo UART que va a transmitir los datos recibe los datos de un bus de datos. El bus de datos se
utiliza para enviar datos a UART por otro dispositivo como una CPU, memoria o microcontrolador. Los
datos se transfieren desde el bus de datos en forma paralela al dispositivo UART que los transmite.
Después de que el dispositivo UART transmisor obtiene los datos paralelos del bus de datos, añade un
bit de inicio, un bit de paridad y un bit de parada, creando el paquete de datos. A continuación, el
paquete de datos se emite en serie, bit a bit en el pin Tx. El dispositivo UART receptor lee el paquete de
datos bit a bit en su pin Rx, y luego convierte los datos de nuevo en forma paralela y elimina el bit de
inicio, el bit de paridad y los bits de parada. Finalmente, transfiere el paquete de datos en paralelo al bus
de datos del extremo receptor.
Los datos transmitidos por la UART están organizados en paquetes. Cada paquete contiene 1 bit de
inicio, 5 a 9 bits de datos, un bit de paridad (opcional), y 1 o 2 bits de parada:
START BIT
La línea de transmisión de datos UART se mantiene normalmente a un nivel de alto voltaje cuando no
está transmitiendo datos. Para iniciar la transferencia de datos, el dispositivo UART transmisor pasa la
línea de transmisión de alto a bajo durante un ciclo de reloj. Cuando el UART receptor detecta la
transición de voltaje de alto a bajo, comienza a leer los bits del paquete de datos a la frecuencia del
BAUD RATE.
DATA FRAME
El data frame contiene los datos reales que se están transfiriendo. Puede ser de 5 a 8 bits de largo si se
utiliza un bit de paridad. Si no se utiliza un bit de paridad, el data frame puede tener 9 bits de longitud.
PARITY BIT
La paridad describe la paridad o la imparidad de un número. El bit de paridad es una forma para que el
UART receptor sepa si algún dato ha cambiado durante la transmisión. Los bits pueden ser cambiados
por radiación electromagnética, Baud Rate desajustadas o transferencias de datos a larga distancia.
Después de que el UART receptor lee los bits del data frame, cuenta el número de bits con un valor de 1
y comprueba si el total es un número par o impar. Si el bit de paridad es un 0 (paridad par), los 1 bits de
la trama de datos deben totalizar un número par. Si el bit de paridad es un 1 (paridad impar), los 1 bits
en el marco de datos deben totalizar a un número impar. Cuando el bit de paridad coincide con los
datos, la UART sabe que la transmisión estuvo libre de errores. Pero si el bit de paridad es un 0, y el total
es impar; o el bit de paridad es un 1, y el total es par, el UART receptor sabe que los bits en la trama de
datos han cambiado.
STOPS BITS
Para señalar el final del paquete de datos, el UART transmisor conduce la línea de transmisión de datos
de un voltaje bajo a uno alto durante al menos dos bits de duración.
2. La UART transmisora añade el bit de inicio, el bit de paridad y el bit(s) de parada al cuadro de datos:
3. Todo el paquete se envía en serie desde la UART transmisora a la UART receptora. La UART receptora
toma una muestra de la línea de datos a la tasa de baudios pre-configurada
4. La UART receptora descarta el bit de inicio, el bit de paridad y el bit de parada del cuadro de datos:
5. La UART receptora convierte los datos en serie de nuevo en paralelo y los transfiere al bus de datos
del extremo receptor:
VENTAJAS
Sólo usa dos cables, no es necesaria una señal de reloj, tiene un bit de paridad para permitir la
comprobación de errores, la estructura del paquete de datos puede ser cambiada siempre y cuando
ambos lados estén preparados para ello.
DESVENTAJAS
El tamaño del marco de datos está limitado a un máximo de 9 bits, no soporta múltiples sistemas
esclavos o múltiples sistemas maestros, las tasas de baudios de cada UART deben estar dentro del 10%
de cada una.
Video de explicacion.
UART-Example
Este repositorio contiene el ejemplo paso a paso de como configurar la comunicacion
serial UART de la tarjeta de desarrollo STM32 NUCLEO-L476RG
En este caso se va a utilizar el puerto PA los pines 2 y3, debido a que estos pines se
puede configurar USART2 (para enviar datos a traves de ST-LINK sin necesidad de
cables/conexiones extras.)
Pasos.
Conociendo que registro se debe modificar, vamos a la seccion 6.4 RCC registers del
manual de referencia de la tarjeta para ver como se debe modificar el registro APB1 y
habilitarlo.
Para habilitar el clock que se encarga de los perifericos GPIO es necesario conocer cual
es el BUS de datos que conecta este modulo para setear el registro correspondiente.
Para ver esto, se debe mirar en el manual o datasheet del micro (STM32L476RGT6U)
Tabla 19.
Conociendo que registro se debe modificar, vamos a la seccion 6.4 RCC registers del
manual de referencia de la tarjeta para ver como se debe modificar el registro AHB2 y
habilitarlo.
Para habilitar GPIOA es necesario establecer un 1 en el bit 0 del registro.
Para settear estos pines con la funcion alternate es necesario poner 10 en los bits 5-4 y
7-6.
Paso 4. Set PA2 y PA3 como high speed mode pin en OSPEEDR
register.
Section 6.4 del manual de referencia.
Para settear estos pines con la funcion high speed es necesario poner 10 en los bits 5-4
y 7-6.
Paso 5. Set PA2 and PA3 as AF7 (AF7 define el modo USART).
Section 8.4 del manual de referencia.
Hay algunos I/O pines que pueden ser configurados de diferentes maneras debido a
que pueden desarrollar diferentes tareas. Por ejemplo, en nuestro caso, al querer utilizar
el USART2 que corresponde a los pines PA2 y PA3, podemos ver que estos pines
ademas de poder ser configurados como GPIO, se pueden configurar tambien como
Timmers y USART.
De esta forma, es necesario configurar el registro AFR (Alternate function register), este
registro esta dividido en dos partes -> AFRL y AFRH. El primero funciona para los
primeros 8 puertos (PA0-PA7) y el segundo para los ultimos 8 puertos (PA8-PA15).
Como se puede evidenciar en la imagen anterior, para definir el modo USART en los
PA2 y PA3, es necesario configurar AF7 en el registro.
Para settear estos pines con AF7 es necesario poner 0111 (7hex) en el registro, en la
parte correspondiente a los puertos 2 y 3.(AFSEL3,AFSEL2).
Paso 6.Set UART word length and parity en CR1 register.
Para modificar estos parametros se deben modificar los bits 28 o 12 para el word length
y el bit 10 para el parity.
Para definir 1bit, se debe poner 00 en el subregistro STOP del CR2 register.
Para hacer esta configuracion se debe hacer unos calculos teniendo en cuenta la
frecuencia del reloj y el BAUD RATE al que se quiera trasmitir/recibir.
En nuestro caso de estudio, se desea obtener un baud rate de 9600bps.
Codigo ejemplo.
Este codigo transmite por consola el mensaje Hello world. los pasos estan descritos y
explicados de acuerdo a la explicacion anterior.
include "stm32l476xx.h"
int main(void)
{
// Enable GPIOA Peripheral Clock (bit 0 in AHB2ENR register)
RCC->AHB2ENR |= (1 << 0);
//Enable peripheral clock for USART2 (bit 17 in 1 in APB1ENR1 register)
RCC->APB1ENR1 |= (1 << 17);
//UART configuration
while(1)
{
for (uint32_t i=0; i<sizeof(mensaje); i++){
// send character
USART2->TDR = mensaje[i];
// wait for transmit complete
while(!(USART2->ISR & (1 << 6)));
// slow down
for(int i=0; i<1000000; i++);
}
}
Pasos
Una vez generado el codigo, se procede a abrir el archivo main.c que contiene el las
configuraciones dispuesta en las siguientes funciones.
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
Al ver la funcion que contiene las configuraciones de UART podemos ver que todos los
parametros estan adecuadamente configurados como se habian definido en la CubeIDE
IOC tool.
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;