Anda di halaman 1dari 6

Pontificia Universidad Católica del Perú

Curso: IEE256 Sistemas Digitales Profesor: Ing. Hugo Pratt

Circuito de comunicación asíncrona (UART) en Tiva TM4C123GH6PM


El microcontrolador TM4C123GH6PM cuenta con ocho módulos UART denominados UART0...UART7.

Reloj de módulos de E/S


Para poder emplear un módulo de E/S (periférico) primero debe activarse la señal de reloj del módulo y del puerto
GPIO al que se conectará el módulo, pues sino, no es posible hacer uso de los registros de E/S de dicho módulo y
puerto. Para activar la señal de reloj de los módulos UART0, UART1 y UART2 se emplea el registro de E/S RCGC1.
Para activar la señal de reloj de los módulos UART3 ...UART7 se emplea el registro RCGCUART. En ambos registros
de E/S cada bit corresponde a la habilitación de la señal de reloj de un periférico del microcontrolador. Luego que se
ha escrito uno de esos registros se debe esperar una cantidad de tiempo para que se active el reloj del módulo (no
debe accederse a los registros del módulo hasta que pase ese tiempo). El registro PRUART permite saber si ya está
activo el reloj del módulo UART y es por lo tanto seguro acceder a los registros de E/S. Este registro no existe en los
microcontroladores de la familia Stellaris, pues el tiempo de espera en ellos es siempre de 3 ciclos de reloj del sistema,
pero en la familia Tiva el tiempo puede ser mayor y además variable.

bit 31 17 16
RCGC1 TIMER0
valor
inicial 0
15 3 2 1 0
UART2 UART1 UART0
valor R/W R/W R/W
inicial 0 0 0 0
Dirección: 0x400F.E104
bit x = 1 Se activa la señal de reloj para el módulo de E/S seleccionado, y se podrá configurar y utilizar.
bit x = 0 Se desactiva la línea de reloj del módulo de E/S. Estará deshabilitado y la escritura en cualquier registro de
E/S del módulo generará una falla del bus (bus fault)
Hay otros bits que no son reservados, y que se han omitido pues sólo se están mostrando los correspondientes
al UART, así que deben mantener sus valores.
Ejemplo: Si bit 2 se pone a 1, se activará la señal de reloj del UART2 y se podrá configurar y usar.
Importante: Este registro no forma parte de los registros GPIO, sino a los registros del sistema.
Su nombre en lenguaje C es: SYSCTL_RCGC1_R

bit 31 8 7 6 5 4 3 2 1 0
RCGCUART reservado R7 R6 R5 R4 R3 R2 R1 R0
R/W R/W R/W R/W R/W R/W R/W R/W
valor inicial 0 0 0 0 0 0 0 0 0
Dirección: 0x400F.E618
bit Rx = 1 Se activa la señal de reloj para el módulo UARTx (x=0 ...7)
bit Rx = 0 Se desactiva la línea de reloj del módulo UARTx
Ejemplo: Si bit 5 se pone a 1, se activará la señal de reloj del UART5 y se podrá configurar y usar.

Importante: Para los módulos UART0, UART1 y UART2, debe activarse el reloj con registro RCGC1. Para los otros
módulos sólo se puede hacer con registro RCGCUART.
Nombre en lenguaje C: SYSCTL_RCGCUART_R

bit 31 2 1 0
PRUART reservado R7 R6 R5 R4 R3 R2 R1 R0
valor inicial R R R R R R R R
0 0 0 0 0 0 0 0 0
Dirección: 0x400F.EA18
bit x = 1 Módulo UARTx está listo y puede accederse a sus registros de E/S.
bit x = 0 Módulo UARTx no está listo. Si se intenta escribir o leer un registro de E/S se generará una excepción del
sistema.
R0 : bit para módulo UART0, R1: bit para módulo UART1, etc.
Ejemplo: Si bit 1 se pone a 1, entonces la señal de reloj del módulo UART1 está activa y se podrá configurar y usar.
Nombre en lenguaje C: SYSCTL_PRUART_R

UART_TM4C12GH6PM_RegistrosRev3.docx Página 1 de 6 14/05/2018


Pontificia Universidad Católica del Perú
Curso: IEE256 Sistemas Digitales Profesor: Ing. Hugo Pratt

Registros de E/S del UART


No se deben modificar los bits que aparecen en color gris, pues son reservados o empleados para otras funciones que no
se verán en el curso.

Nombre (offset)
bit 31 12 11 10 9 8 7 0
UARTDR reservado OE BE PE FE DATO
(0x000) R R R R R/W
valor inicial 0 0 0 0

bit 31 10 9 8 7 6 5 4 1 0
UARTCTL reservado RXE TXE LBE HSE UARTEN
(0x030) R/W R/W R/W R/W R/W
valor inicial 1 1 0 0 0

bit 31 4 3 2 1 0
UARTRSR reservado OE BE PE FE
(0x004) R R R R R
valor inicial 0 0 0 0
bit 31 8 7 6 5 4 3 2 0
UARTFR reservado TXFE RXFF TXFF RXFE BUSY
(0x018) R R R R R
valor inicial 1 0 0 1 0

bit 31 16 15 0
UARTIBRD reservado DIVINT
(0x024) R/W
valor inicial 0x0000

bit 31 6 5 0
UARTFBRD reservado DIVFRAC
(0x028) R/W
valor inicial 0x00

bit 31 8 7 6 5 4 3 2 1 0
UARTLCRH reservado SPS WLEN FEN STP2 EPS PEN BRK
(0x02C) R/W R/W R/W R/W R/W R/W R/W
valor inicial 0 00 0 0 0 0 0
Configuración del UART

Configuración de trama
Número de bits por carácter Bit de paridad
WLEN Bits por PEN EPS SPS Modo Paridad
carácter
0 00 5 0 X X Deshabilitado
1 01 6 1 0 0 habilitado, paridad impar
2 10 7 1 0 1 habilitado. 1 (marca)
3 11 8 1 1 0 Habilitado, paridad par
1 1 1 Habilitado, 0 (espacio)
Bits de parada
STP2 Bits de parada
0 1 bit
1 2 bits

UART_TM4C12GH6PM_RegistrosRev3.docx Página 2 de 6 14/05/2018


Pontificia Universidad Católica del Perú
Curso: IEE256 Sistemas Digitales Profesor: Ing. Hugo Pratt

Configuración de velocidad
1° Escoger valor de bit HSE (utilizar cero para compatibilidad con familia Stellaris) y calcular BRD con tres
decimales.
f osc
Velocidad (bps)  BRD 
f osc
 16   16 
 HSE   BRD  HSE  Velocidad
2  2 
2° Obtener las partes entera y fraccionaria:
DIVINT = parte entera de BRD
DIVFRAC = entero más cercano de [(parte fraccionaria de BRD) * 64]
3° La velocidad real será:
f osc
Velocidad (bps)  para DIVINT  0
16  DIVFRAC 
 DIVINT 
HSE  
2  64 

f osc
Velocidad (bps)  para DIVINT  0
 16 
 HSE 
2 

Ejemplo: Si fosc = 40MHz, y queremos velocidad = 115200bps, entonces, para HSE=1 se obtiene:
40  10 6
BRD   43.402
 16 
 1   115200
2 
Entonces DIVINT = 43
y DIVFRAC = 0.402*64 = 25.77, por lo tanto DIVFRAC = 26

fosc : Frecuencia de reloj del sistema, en Hz.

Velocidad (bps): La velocidad de transmisión y recepción en bps que se desea.

HSE: “High Speed Enable” Bit del registro UART0_CTL_R o UART2_CTL_R.

DIVINT Número de 16 bits sin signo (registro UART0_IBRD_R o UART2_IBRD_R)

DIVFRAC Número de 6 bits sin signo (registro UART0_FBRD_R o UART2_FBRD_R)

Configuración de buffers de transmisión y recepción


FEN Descripción
0 No se emplean buffers.
1 Se habilitan buffers de transmisión y recepción (FIFO Rx y FIFO Tx) de 16
registros de profundidad cada uno

Habilitar transmisión y recepción de datos


UARTEN TXE RXE Descripción
0 x x UART desactivado
1 0 1 habilitado para recepción, pero no para transmisión
1 1 0 Habilitado para transmisión, pero no para recepción
1 1 1 Habilitado para transmisión y recepción
Bits en registro UART0_CTL_R (para UART0)

UART_TM4C12GH6PM_RegistrosRev3.docx Página 3 de 6 14/05/2018


Pontificia Universidad Católica del Perú
Curso: IEE256 Sistemas Digitales Profesor: Ing. Hugo Pratt

Secuencia de Configuración del UART


De usarse más de un módulo UART, debe realizarse esta secuencia para cada módulo. Se muestran los registros para
configurar el UART0. Para configurar otro módulo reemplazar en los nombres UART0 por el modulo a usar, por
ejemplo, UART5.

1. Activar señal de reloj en el módulo UART a emplear: registro SYSCTL_RCGC1_R para UART0, UART1,
UART2, registro SYSCTL_RCGCUART_R para UART3...UART7
2. Esperar a que se active reloj del módulo UART. Analizar bit correspondiente de registro SYSCTL_PRUART_R
3. Activar señal de reloj de módulo GPIO en cuyos pines estarán líneas de Tx y Rx del UART (registro
SYSCTL_RCGC2_R)
4. Esperar a que se active (registro SYSCTL_PRGPIO_R)
5. Desactivar modo analógico en dichos pines (registro GPIOAMSEL)
6. Habilitar dichos pines para señales digitales (registro GPIODEN)
7. Activar función alterna en pines a usar para el UART (registro GPIOAFSEL)
8. Conectar los pines al UART (registro GPIOPCTL)
9. Desactivar el módulo UART (no la señal de reloj), poniendo a 0 bit UARTEN de registro UART0_CTL_R
10. Configurar velocidad (registros UART0_IBRD_R y UART0_FBRD_R)
11. Configurar trama y buffers con registro UART0_LCRH_R
12. habilitar UART0 (bit UARTEN=1 en registro UART0_CTL_R)

Si luego de la configuración, durante la ejecución del programa se quiere modificar la velocidad, el orden en que se
escribe en los registros debe ser alguno de éstos:

a. desactivar UART (UARTEN=0), escribir en UARTFBRD, UARTIBRD y UARTLCRH, activar UART


(UARTEN=1)
b. desactivar UART, escribir en UARTIBRD, UARTFBRD y UARTLCRH, activar UART
c. desactivar UART, escribir en UARTBRD y UARTLCRH, activar UART
d. desactivar UART, escribir en UARTIBRD y UARTLCRH, activar UART

Cada vez que quiera modificarse la trama (escribir en UARTCTL), primero debe desactivarse el UART (UARTEN=0),
esperar a que FIFO de Tx esté vacío, vaciar FIFO de Rx (leyendo todos los caracteres recibidos), modificar
UARTCTL, volver a activar UART (UARTEN=1). El fabricante menciona en hoja de datos que, de no hacerse de esta
manera, habrán resultados impredecibles en la operación del microcontrolador.

Envío y recepción de datos

Lectura y escritura de datos


Cada UART cuenta con dos registros temporales de datos. Uno para los datos a transmitir, y otro para los datos a
recibir. Ambos comparten la misma dirección, y se denomina a esta dirección UART0_DR_R (para UART0)
Transmisión de datos
1. Verificar que hay espacio en buffer de transmisión (bit TXFF de registro UARTFR vale 0)
2. El carácter a enviar escribirlo en registro UARTDR

Recepción de datos
1. Analizar si hay algún carácter recibido (bit RXFE de registro UARTFR vale 0)
2. Leer registro UARTDR, que contiene el carácter (5 a 8 bits)

Errores de comunicación
Los errores detectados se indican en bits FE, OE, PE y BE del registro UARTRSR o UARTDR.
Un bit en 1 significa que se detectó el error.
Los errores detectados corresponden al carácter que se acaba de leer por UARTDR
FE: Error de Trama (framing error)
PE: Error de paridad (parity error)
OE: Error de sobrescritura (data overrun error)
BE: Break error (línea de recepción en 0 lógico más de una trama)

UART_TM4C12GH6PM_RegistrosRev3.docx Página 4 de 6 14/05/2018


Pontificia Universidad Católica del Perú
Curso: IEE256 Sistemas Digitales Profesor: Ing. Hugo Pratt

Nombre de registros en lenguaje C, y sus direcciones de memoria:


UART0
Dirección base: 0x4000.C000

Nombre genérico Nombre para UART0 Dirección de memoria valor inicial


UARTDR UART0_DR_R 0x4000.C000 0x0000.0000
UARTCTL UART0_CTL_R 0x4000.C030 0x0000.0300
UARTFR UART0_FR_R 0x4000.C018 0x0000.0090
UARTFBRD UART0_FBRD_R 0x4000.C028 0x0000.0000
UARTIBRD UART0_IBRD_R 0x4000.C024 0x0000.0000
UARTLCRH UART0_LCRH_R 0x4000.C02C 0x0000.0000
UARTRSR UART0_RSR_R 0x4000.C004 0x0000.0000

Nombre de los bits de los registros de E/S en lenguaje C


Los nombres de los registros y bits (máscaras de bits) están definidos en el archivo de cabecera lm3s9b92.h. Cada
nombre de bit define un número de 32 bits en el cual sólo un bit vale 1, el que tiene la posición que le corresponde en el
registro de E/S al cual pertenece.
Registro Nomenclatura de bit en valor Ejemplo
lenguaje C máscara del bit valor
UART0_CTL_R UART_CTL_nombre 1 << posicion_bit UART_CTL_TXE 1 << 8
UART2_CTL_R 0x0000.0100
UART0_RSR_R UART_RSR_nombre 1 << posicion_bit UART_RSR_PE 1 << 1
UART2_RSR_R 0x0000.0002
UART0_FR_R UART_FR_nombre 1 << posicion_bit UART_FR_TXFE 1 << 7
UART2_FR_R 0x0000.0080
UART0_LCRH_R UART_LCRH_nombre 1 << posicion_bit UART_LCRH_STP2 1 << 3
UART2_LCRH_R 0x0000.0008
Ejemplo: RXFE es el bit 4 del registro UARTFR (registro UART0_FR_R o UART2_FR_R). El nombre de la máscara
es UART_FR_RXFE y como es el bit 4, su valor, definido en el archivo tm4c123gh6pm.h, es 0x0000.0010

Máscaras para campos de bits


Campo Registro Nombre de máscara en lenguaje C valor de la máscara
DIVINT UARTIBRD UART_IBRD_DIVINT_M 0x0000.FFFF
DIVFRAC UARTFBRD UART_FBRD_DIVFRAC_M 0x0000.003F

UART_TM4C12GH6PM_RegistrosRev3.docx Página 5 de 6 14/05/2018


Pontificia Universidad Católica del Perú
Curso: IEE256 Sistemas Digitales Profesor: Ing. Hugo Pratt

Valores para selección de pines del TM4C123GH6PM donde se conectará módulo UART

Los valores entre paréntesis en la columna “Pin Mux/Pin Assignment” de la tabla 14-1 son los valores a escribir en el
campo PMCx del registro GPIOPCTL correspondiente al pin indicado (ver la tabla de registros GPIO).
El UART0 siempre está conectado a pines PA0 y PA1.

Ejemplo: Para conectar el UART2 del TM4C123GH6PM sólo hay una opción: pines PD6 (para U2Rx) y PD7 (para
U2Tx). Para conectar señal U2Rx al pin PD6, según tabla 14-1 debe escribirse el valor 0x1 en el campo
PMC6 (pues es para el pin PD6) y 0x1 en el campo PMC7 del registro GPIO_PORTD_PCTL_R (pues son
pines del puerto D). El registro se muestra a continuación:

bit 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
GPIOPCTL PMC7 PMC6 PMC5 PMC4
0x52C RW RW RW RW RW RW RW RW RW RW RW RW RW RW RW RW
valor inicial - - - - - - - - - - - - - - - -

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
PMC3 PMC2 PMC1 PMC0
RW RW RW RW RW RW RW RW RW RW RW RW RW RW RW RW
- - - - - - - - - - - - - - - -

nible PMCx : Selector de Multiplexor de Funciones del Pin x.


valor inicial: 0x0000.0000 para puertos

En lenguaje C escribiríamos:
GPIO_PORTD_PCTL_R = (GPIO_PORTD_PCTL_R & 0x00FFFFFF) | 0x11000000;

UART_TM4C12GH6PM_RegistrosRev3.docx Página 6 de 6 14/05/2018

Anda mungkin juga menyukai