Está en la página 1de 17

PROTOCOLO DE COMUNICACIÓN UART.

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).

UART -> UNIVERSAL ASYNCHRONOUS RECEIVER TRANSMITTER

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.

INTRODUCCIÓN A LA COMUNICACIÓN UART.

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.

CÓMO FUNCIONA UART

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.

1. La UART PASOS DE LA TRANSMISIÓN DE LA UART

transmisora recibe datos en paralelo desde el bus de datos:

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

Ejercicio : Trasmitir datos por UART.


En este ejercicio se mostrara como habilitar un puerto UART para transmitir datos por
puertos COM. Existen tres formas para hacer esto, Polling, interrupcion o accediendo a
la memoria DMA, para este ejemplo utilizaremos el caso mas basico que es a traves del
Polling.

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.

 Enable USART clock en RCC register.


 Enable GPIO clock en RCC register.
 Set PA2 y PA3 como alternate pin en MODER register.
 Set PA2 y PA3 para high speed mode en OSPEEDR register
 Set PA2 and PA3 as AF7 (AF7 define el modo USART).
 Set UART word length and parity en CR1 register.
 Enable transmit and receive (TE/RE bits) en CR1 register.
 Enable stop bits (STOP bits) en CR2 register.
 Calculate baud rate and set BRR register.
 Enable UART.

Desarollo paso a paso.

Paso 1. Enable USART clock en RCC register.


Section 6.4 del manual de referencia.
Para habilitar el clock que se encarga del USART 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 APB1 y
habilitarlo.

Para habilitar USART2 es necesario establecer un 1 en el bit 17 del registro.


Paso 2. Enable GPIO clock en RCC register.
Section 6.4 del manual de referencia.

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.

Paso 3. Set PA2 y PA3 como alternate pin en MODER register.


Section 8.4 del manual de referencia.

El registro MODER es el encargado de definir como va a trabajar el pin elegido, para


nuestro caso de estudio, es necesario definir los pines 2 y 3 del puerto A en la funcion
alternate.

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.

El registro OSPEEDR es el encargado de definir la velocidad de como va a trabajar el pin


elegido, para nuestro caso de estudio, es necesario definir esta velocidad en los pines 2
y 3 del puerto A como high speed.

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).

Configuracion del modulo USART


Section 40.8 del manual de referencia.

Para configurar el modulo UART es necesario configurar ciertos parametros que el


protocolo de comunicacion exige: inital bits, stop bits, message bits, parity
(even,odd,none),HWcontrol, Baudrate.

Para configurar estos parametros es necesario modificar los siguientes registros:


CR1,CR2 y BRR que son los registros encargados de manejar la comunicacion USART.
 

 
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 nuestro caso de estudio vamos a definir un mesaje de 8 bits y el protocolo de


comunicacion no va a tener bit de paridad.

Para definir 8Bits, de debe poner 00 en el subregistro M1,M0 del CR1.

Paso 7.Enable transmit and receive (TE/RE bits) en CR1 register.


Para modificar estos parametros se deben modificar el bit 2 para habilitar el receptor y
el bit 3 para habilitar el trasmisor.

Esto se hace poniendo el bit 2 y 3 en 1 en el subregistro RE/TE del CR1 register.

Paso 8.Enable stop bits (STOP bits) en CR2 register.


Para modificar estos parametros se deben modificar los bits 13,12 para definir el
numero de bits de parada. En nuestro caso de estudio se va a definir 1 bit de parada.

Para definir 1bit, se debe poner 00 en el subregistro STOP del CR2 register.

Paso 9.Calculate baud rate and set BRR register.


Debido a que se va a utilizar UART es necesario configurar el baud rate de comunicacion
debido a que la comunicacion va a ser asincrona.

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.

Paso 10.Enable UART.


Para habilitar el uso del USART se debe modificar el bit 0, subregistro UE del registro
CR1. Para habilitar, se debe establecer un 1 en este bit.

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);

// Make GPIOA Pin2,3 as alternate pin (bits 1:0 in MODER register)


GPIOA->MODER &= 0xABFFFF0F; //clear bits 4,5,6,7 for P2 and P3
GPIOA->MODER |= 0x000000A0; //Write 10 to bits 4,5,6,7 for P2
and P3

// Set GPIOA Pin2,3 in high speed mode


GPIOA->OSPEEDR |= 0x000000A0; //Write 10 to bits 4,5,6,7 for P2
and P3

// Choose AF7 for USART2 in alternate function registers


GPIOA->AFR[0] |= 0x7700;

//UART configuration

// Set USART2 word length


USART2->CR1 |= 0x00001000; //word length define with 8bits
// Set USART2 Parity control bit
USART2->CR1 |= (0 << 10);
// Set USART2 stop bits
USART2->CR2 |= (0b00 << 12);
// USART2 tx enable, TE bit 3
USART2->CR1 |= (1 << 3);
// USART2 rx enable, RE bit 2
USART2->CR1 |= (1 << 2);
// Set Baud Rate at 9600Bps, internal clock 8Mhz by default
/*
* formula para calcular el Baudrate
* TX/RX BR = Fclk/(USARTDIV)
* 8MHz internal clock by default
* TX/RX BR = 4000000/9600=416.16
* 416.16d = 01A0hex
*/
USART2->BRR |= 0x01A0;
// Enable USART2 UE, bit 0
USART2->CR1 |= (1 << 0);

const uint8_t mensaje[] = "hello world\n\r";

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++);
}
}

__asm__("NOP"); // Assembly inline can be used if needed


return 0;
}

Ejemplo codigo usando libreria HAL


Para este ejemplo se utilizo la libreria Hal que provee el STM32CubeIDE para configurar
el modulo USART2 como UART y trasmitir un mensaje por consola.

Para esto se deben seguir los siguientes pasos.

Pasos

 Abrir el Cube ioc para configurar los pines.


 General el codigo.
 Hacer uso de las librerias para transmitir un mensaje.

Paso 1.Abrir el Cube ioc para configurar


los pines.
En esta parte, se deben configurar el USART y sus parametros, y habilitar los pines del
GPIOA.

Paso 1. General el codigo.


Para generar el codigo luego de haber configurado los parametros, se debe guardar el
archivo y dar clic en la opcion Device Configuration Tool Code Generation.

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;

Paso 3. Hacer uso de las librerias para


transmitir un mensaje.
En el codigo principal, dentro del while(1) del int main(void) function, se puede definir la
trasmision de datos usando las funciones de la libreria HAL.

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t


Timeout)

huart --> es el canal de trasmision/recepcion. Para este caso seria huart2


pData --> es el mensaje que se va a transmitir.
Size --> es el tamaño/longitud del mensaje que se va a transmitir.
Timeout --> Tiempo que se espera para que se termine la trasmision.
Ejemplo.

HAL_UART_Transmit(&huart2, "Hello world\n\r",13, HAL_MAX_DELAY);

También podría gustarte