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
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
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
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:
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.
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)
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
- - - - - - - - - - - - - - - -
En lenguaje C escribiríamos:
GPIO_PORTD_PCTL_R = (GPIO_PORTD_PCTL_R & 0x00FFFFFF) | 0x11000000;