You are on page 1of 20

Curso: Sistemas Digitales

Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt


Pontificia Universidad Católica del Perú Área de circuitos y sistemas

CAPITULO 2 – PARTE I
PUERTOS Y MÓDULOS DE ENTRADA/SALIDA
El computador interactúa con el mundo exterior a través de los periféricos, y el nexo de
comunicación entre los periféricos y el CPU son las interfaces de entrada/salida (abreviado:
interfaz de E/S), y habrán tantas interfaces como periféricos diferentes hayan conectados al
computador. En un microcontrolador, cuando la interfaz es compleja, es decir, involucra un
circuito secuencial como parte de su control, se le suele denominar “módulo de Entrada/Salida”
o abreviadamente “módulo de E/S” (I/O module). Cuando la interfaz tiene por finalidad la
comunicación con un equipo remoto, se le suele denominar línea de comunicación.

Por ejemplo, el microcontrolador TM4C123GH6PM cuentan con los siguientes módulos de E/S:
 Contadores/temporizadores (timer/counter)
 Conversor análogo-digital de 10 bits
 Reloj perro guardián (watchdog timer)
 Módulo de comunicación serial asíncrona (UART)
 Módulo de comunicación síncrona SSI (serial synchronous interface)
 Módulo de comunicación I2C (Two wire interface)
Tiene más de un módulo de E/S de cada tipo

¿Qué es un puerto (port)?


En general un puerto es una interfaz. En las computadoras de propósito general se denominan así
a las interfaces en las cuales se conecta un periférico externo, como por ejemplo: puerto de
impresora, puerto serial, puerto USB, puerto HDMI. En los microcontroladores se denomina así a
un grupo de pines del circuito integrado que son interfaces de E/S y cumplen en conjunto alguna
función en particular. Normalmente están agrupados según la función que desempeñan (por
ejemplo, un grupo de pines podría corresponder a un puerto serial, otro grupo a un puerto digital
de propósito general, otro grupo a un puerto I2C).

El microcontrolador TM4C123GH6PM cuenta con seis puertos digitales A, B, C, D, E y F. Los


puertos A al D son de 8 pines, el puerto E de 6 pines y el puerto F de 5 pines.

Los microcontroladores por lo general tienen más módulos de E/S y puertos que pines para la
conexión de los mismos a los periféricos. Por ejemplo, en el microcontrolador TM4C123GH6PM
el pin PD2 puede utilizarse como una interfaz digital de propósito general (GPIO), como una
entrada analógica o para recepción de datos del SSI1 o el SSI2, pero no puede emplearse para
más de una de esas opciones a la vez. Si por ejemplo se emplea como línea de recepción del SSI1
ya no puede emplearse como pin GPIO, ni como entrada analógica.

¿Cómo interactúa el CPU con los puertos y módulos de E/S?


Lo hace mediante los denominados registros de E/S (I/O registers). Cada módulo de E/S tiene
asociado un grupo de registros de E/S (o parte de algunos registros de E/S) que permiten
configurarlo, escribir datos a ser enviados al periférico o equipo remoto (si es un periférico de
salida o de E/S), y leer los datos recibidos del periférico (si es un periférico de entrada o de E/S).
De la misma manera, cada puerto digital de propósito general del microcontrolador tiene asociado

CAPITULO2Parte1rev12.docx 1 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

un grupo de registros que permite configurar los pines del puerto como entrada o salida, escribir
valores (0 o 1) en los pines configurados como salida, y leer los valores presentes en los pines del
puerto (0 o 1) sea que estén configurados como entrada o como salida.

Ejemplo: El microcontrolador TM4C123GH6PM cuenta con ocho módulos de E/S UART


denominados UART0, UART1, hasta UART7. Cada uno cuenta con 18 registros de E/S, de los
cuales 17 son para configuración del módulo y uno para transmisión y recepción de datos. Por
ejemplo, si se emplea el UART0, cuando se quiere transmitir un dato a un equipo remoto el valor
a transmitir se escribe en el registro de E/S UART0_DR_R. Cuando se ha recibido un dato de un
equipo remoto se lee del registro UART0_DR_R.

Así como las memorias están conformadas por registros, cada uno identificado por un número
que es su dirección, de la misma manera cada registro de E/S tiene una dirección que lo
identifica. El uso de la interfaz o módulo de E/S, por tanto, consiste en la escritura y lectura de
estos registros de E/S.
Dependiendo de la arquitectura del CPU y del diseño del computador, hay dos maneras como el
CPU accede a los registros de E/S. Estas dos maneras se denominan:
 Entrada/salida aislada
 Entrada/salida mapeada en memoria
Estas dos maneras no son excluyentes. En el caso del ATmega88, por ejemplo, se emplean
ambas. En el caso de los núcleos Cortex-M3 y Cortex-M4, sólo emplean el segundo.

Entrada/salida aislada
El CPU cuenta con un espacio de direcciones de registros de E/S que es independiente del
espacio de memoria. Para acceder a los registros de E/S, el CPU cuenta con instrucciones
especiales para la escritura o lectura de estos registros. Normalmente el espacio de registros de
E/S es más pequeño que el de registros de memoria, y al igual que para la memoria, comienzan a
partir de la dirección 0.

Ejemplo: El microcontrolador ATmega88A cuenta con un espacio de registros de E/S de 64


direcciones ($00 a $3F). Tiene 87 registros de E/S de los cuales 39 están en el espacio de E/S
y cuenta con dos instrucciones para acceder a las direcciones en ese espacio:
 IN para leer un registro de E/S
 OUT para escribir en un registro de E/S

Entrada/salida mapeada en memoria (I/O mapping)


Los registros de E/S son vistos por el CPU como registros de memoria, aunque realmente no lo
son. En este caso, de todo el espacio de memoria disponible, una porción (un rango de
direcciones) es reservada para el uso de los registros de E/S. Cada vez que se lea o escriba en una
dirección correspondiente a ese rango, se estará leyendo o escribiendo en un registro de E/S.

CAPITULO2Parte1rev12.docx 2 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

Ejemplo 1: El microcontrolador ATmega88A tiene un espacio de datos con direcciones que van
de $000 a $4FF de las cuales el rango de $020 a $0FF es para los registros de E/S (224
direcciones). Se dice que “los registros de E/S están mapeados en memoria de $020 a $0FF”.
La memoria SRAM de 1KB ocupa las direcciones $0100 a $4FF, y los registros del CPU R0 a
R31 están mapeados en las direcciones $000 a $01F.

Ejemplo 2: El TM4C123GH6PM al tener núcleo Cortex-M4 tiene un único espacio de memoria


de 4GB, donde están la memoria Flash, SRAM, y todos los registros de E/S. Para cada módulo
de E/S hay una región del espacio de memoria de 4KB donde están sus registros de E/S (no se
usan las 4096 direcciones, sino mucho menos). Por ejemplo, el UART1 tiene sus registros de E/S
en la región de 0x4000.D000 a 0x4000.DFFF. Uno de sus registros, UART1_DATA_R ocupa las
direcciones 0x4000.D000 a 0x4000.D003 (32 bits en total)

Modelo de memoria del núcleo Cortex-M4


Aunque aquí se describe el núcleo Cortex-M4, que es el empleado en el microcontrolador
TM4C123GH6PM, toda la información que aquí se menciona también se aplica sin modificación
al núcleo Cortex-M3 que es empleado en otras familias de microcontroladores.

El núcleo Cortex-M4 tiene arquitectura Harvard y es de 32 bits. Al ser de arquitectura Harvard


cuentan con más de un bus de datos. Cuenta con dos buses para la memoria de instrucciones,
uno para acceder a los módulos de E/S y otro para la memoria SRAM. Sin embargo, desde el
punto de vista de programación, la memoria se ve como un único espacio donde está la memoria
Flash, memoria SRAM y los registros de E/S. Además, a pesar que es un CPU de 32 bits, el
espacio de memoria se ve como un arreglo de registros de 8 bits, donde cuatro direcciones
consecutivas corresponden a un registro de 32 bits, pero puede leer 32 bits (4 direcciones)
simultáneamente.

Esta información resumida se muestra en la siguiente figura, a la cual se denomina "mapa de


memoria" (memory map). La figura mostrada es la que corresponde al núcleo Cortex-M4
(independiente del microcontrolador).

Un mapa de memoria es un diagrama o tabla que muestra el rango de direcciones ocupado por
todas las memorias e interfaces de E/S que tiene un microcontrolador, y en el caso más general un
computador. En el caso de los microcontroladores, si los registros del CPU también tienen
asignados direcciones de memoria, también se indican en este diagrama (por ejemplo, el
ATmega88).

Para la arquitectura del núcleo Cortex-M4, la compañía ARM Limited ha definido un mapa de
memoria fijo, la cual debe seguir cualquier fabricante de microcontroladores que emplee este
núcleo y que se muestra en la siguiente figura. Este mapa de memoria junto con las reglas que
ha definido ARM Limited, se denomina modelo de memoria (memory model) del núcleo
Cortex-M4.

CAPITULO2Parte1rev12.docx 3 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

Fig. 1 Mapa de memoria general del núcleo Cortex-M4. Cualquier microcontrolador con este núcleo tendrá
este mapa de memoria. Esta figura es también válida para el núcleo Cortex-M3.

Puede observarse en la figura que la región establecida para la memoria SRAM es de 0.5GB
(512MB) y para la memoria de programa también. Además, la región para la memoria SRAM
necesariamente debe comenzar en la dirección 0x2000.0000 y la memoria de programa en la
dirección 0x0000.0000.

De esto podemos deducir que nunca encontraremos un microcontrolador con núcleo Cortex-M4 o
Cortex-M3 que tenga más de 512MB de memoria RAM.
Observar también que está definida una región para los registros de E/S (bloque Peripheral en la
figura), así que no habrá un microcontrolador con núcleo Cortex-M4 cuyos registros de E/S
comiencen por ejemplo en la dirección 0x3000.0000.

Los registros de E/S y mapa de memoria del TM4C123GH6PM


El microcontrolador TM4C123GH6PM tiene más de 1000 registros de E/S. En la figura se
muestra parcialmente el detalle del mapa de memoria de este microcontrolador.

CAPITULO2Parte1rev12.docx 4 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

Fig. 2 Mapa de memoria del TM4C123GH6PM. Las regiones para registros de E/S son de 4KB y comienzan
en múltiplos de 0x1000.
Para cada módulo de E/S hay una región de 4KB. La dirección menor de cada región se llama
dirección base (base address). Por ejemplo, la dirección base del puerto D es 0x4000.7000.

Los puertos de propósito general del TM4C123GH6PM


Los pines de los microcontroladores tienen funciones múltiples. Una de ellas es la de ser puertos
de entrada/salida de propósito general, la cual es la configuración por defecto de la mayoría de
pines cuando se energiza el microcontrolador. Por propósito general nos referimos a que los pines
del puerto actúen como entradas digitales o como salidas digitales. Un acrónimo para estos
puertos es GPIO (General Purpose Input/Output).

CAPITULO2Parte1rev12.docx 5 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

El microcontrolador TM4C123GH6PM cuenta con seis puertos digitales de propósito general


(GPIO) , cuyos nombres son: A, B, C, D, E y F. En la Fig. 3 se muestra qué pines del circuito
integrado con encapsulado LQFP de 64 pines (que es el que se empleará en el laboratorio)
corresponden a qué puerto. Cada pin de un puerto puede configurarse como línea de entrada, o
como línea de salida.

Fig. 3 Los puertos del microcontrolador TM4C123GH6PM. En rectángulos del mismo color y formato están
los pines que pertenecen al mismo puerto.

Observar que cada pin del puerto tiene un nombre y un dígito del 0 al 7 que lo identifica. Por
ejemplo, el pin N°18 es el pin PA1 del puerto A. En algunos pines al lado de cada nombre hay
una diagonal y otro nombre. Este nombre hace referencia a la función alternativa que puede tener
el pin cuando no se emplea como GPIO. Para el pin N°18, la función alternativa es como señal
U0Tx, línea de transmisión del módulo de E/S UART0. Algunos pines del microcontrolador
tienen hasta nueve funciones alternativas. La figura sólo muestra algunas de ellas, y sólo de
algunos pines.

Puede observarse además, que los pines de un mismo puerto no son todos adyacentes entre sí. La
razón para denominar a los pines 1, 4, 45, 46, 47, 48, 57 y 58 como puerto B no tiene que ver con

CAPITULO2Parte1rev12.docx 6 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

su disposición en el circuito integrado, sino con la manera como se relacionan con los registros de
E/S, como veremos a continuación.

Los registros de configuración, de lectura y de escritura


Todos los registros de E/S del microcontrolador son de 32 bits. Pero no necesariamente se
emplean o están definidos los 32 bits de un registro de E/S.
Cada uno de los puertos de propósito general (GPIO) en el TM4C124GH6PM cuenta con
veinticuatro registros de E/S. Uno para lectura y escritura de datos, y los demás para
configuración de los pines del puerto. De estos veinticuatro registros, sólo utilizaremos catorce
en el curso, pero en esta parte nos centraremos en cinco esenciales que describo a continuación:
 Uno para configurar cada pin del puerto como entrada o salida
 Uno para habilitar los pines para señales digitales
 Uno para activar o no las resistencias de pull-up, en caso se requiera
 Uno para activar o no las resistencias de pull-down en caso se requiera
 Uno para leer el valor (0 o 1) presente en cada pin del puerto o escribir un valor en los
pines configurados como salida.
Además de esos registros, que cada módulo GPIO tiene, también hay un registro adicional cuya
finalidad es la siguiente:
 Habilitar la señal de reloj del módulo GPIO que se va a configurar y emplear

La manera en que se emplean los registros en cada puerto es similar, razón por la cual se
explicará en detalle para el puerto B.

El puerto B
El puerto B consta de 8 pines que son: PB0, PB1, PB2, PB3, PB4, PB5, PB6 y PB7.
Cuenta con los siguientes registros de E/S:
 GPIO_PORTB_DIR_R para configurar los pines como entrada o salida.
 GPIO_PORTB_DATA_R para escribir un valor en los pines configurados como salida, o
para leer el valor presente en los pines del puerto.
 GPIO_PORTB_DEN_R para habilitar los pines para señales digitales.
 GPIO_PORTB_PUR_R para activar las resistencias de pull-up.
 GPIO_PORTB_PDR_R para desactivar las resistencias de pull-up.

Además, hay un registro que no pertenece a ninguno de los módulos GPIO, y que permite activar
la señal de reloj que llega a dichos módulos y es el siguiente:
 SYSCTL_RCGCGPIO_R
Con excepción de SYSCTL_RCGCGPIO_R, todos los registros mencionados están en la región
de memoria que corresponde al puerto B. Estos registros de E/S tienen direcciones en el espacio
de datos, como se indica en la siguiente tabla.

CAPITULO2Parte1rev12.docx 7 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

Tabla 1 Direcciones de los registros de E/S del puerto B


Desplazamiento Dirección
Registro (offset)

GPIO_PORTB_DATA_R 0x3FC 0x4000.53FC


GPIO_PORTB_DIR_R 0x400 0x4000.5400
GPIO_PORTB_PUR_R 0x510 0x4000.5510
GPIO_PORTB_PDR_R 0x514 0x4000.5514
GPIO_PORTB_DEN_R 0x51C 0x4000.551C
Dirección base: 0x4000.5000

La dirección base para los registros de E/S del puerto B es 0x4000.5000. En los manuales no se
especifica la dirección completa de cada registro, sino a cuántas direcciones por encima de la
dirección base está. Este número se llama desplazamiento (offset), y es el valor que aparece en los
manuales. Para determinar la dirección de un registro empleamos la siguiente ecuación:
Dirección registro E/S = Dirección base + offset

Relación entre pines y bits de los registros de E/S


Para facilitar la lectura, en esta parte emplearemos una notación abreviada para los nombres de
los registros. En vez de escribir el nombre completo del registro, emplearemos una abreviatura
genérica como se explica a continuación:
 GPIO_PORTB_DIR_R lo llamaremos GPIODIR
 GPIO_PORTB_DEN_R lo llamaremos GPIODEN
 GPIO_PORTB_PDR_R lo llamaremos GPIOPDR
 GPIO_PORTB_PUR_R lo llamaremos GPIOPUR
 GPIO_PORTB_DATA_R lo llamaremos GPIODATA
Debemos recordar que se debe usar el nombre completo de cada registro al escribir los
programas.
Al usar esta abreviatura, lo que se explique para el puerto B será aplicable a cualquiera de los
otros puertos GPIO.

A cada pin del puerto B le corresponde un bit de cada registro de E/S. El bit que le corresponde
es el número que aparece en el nombre del pin. Por ejemplo, al pin PB5 le corresponden los bits
5 de los registros GPIODIR, GPIODEN, GPIOPDR, GPIOPUR y GPIODATA. En cambio al pin
PB0 le corresponden los bits 0 de estos registros.
Los bits 8 al 31 son reservados, y no debemos modificarlos.
Usaremos la siguiente notación para explicar el manejo del puerto.

PBn Pin del puerto B. El valor de n indica el número de pin (0 a 7)


DIRn Bit n del registro DIR (0 a 7)
DENn Bit n del registro DEN (0 a 7)
PUEn Bit n del registro PUR (0 a 7)
PDEn Bit n del registro PDR (0 a 7)

Configuración de pines como entrada o salida

CAPITULO2Parte1rev12.docx 8 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

Cada pin del puerto B puede configurarse como entrada o salida independientemente de los
demás. Escribiendo un 1 en el bit DIRn se configura el pin PBn como salida, escribiendo un 0 se
configura como entrada.
Ejemplo: Para configurar los pines PB0, PB3, PB5 como salidas y los pines PB1,
PB2, PB4, PB6 y PB7 como entradas, tendría que escribirse el siguiente valor en
registro GPIO_PORTB_DIR_R:
bit 31 8 7 6 5 4 3 2 1 0
GPIODIR reservado 0 0 1 0 1 0 0 1

Escritura en pines configurados como salidas


Si el pin PBn está configurado como salida (DIRn=1) entonces escribiendo un 1 en DATAn el
pin estará en nivel alto (1 lógico) y escribiendo un cero estará en nivel bajo (0 lógico).
Ejemplo: Si sólo los pines PB0, PB3 y PB5 están configurados como salida, para que el
pin PB0 esté en 1 lógico, PB3 en 0 lógico y PB5 en 1 lógico, debería de escribirse el
siguiente valor en GPIO_PORTB_DATA_R:
bit 31 8 7 6 5 4 3 2 1 0
GPIODATA reservado 0 0 1 0 0 0 0 1

Como los pines PB7, PB6, PB4, PB2 y PB1 están configurados como entrada, los valores escritos no los
afectarán, pero lo mejor es garantizar que no modificamos esos bits, para lo cual usaremos técnicas de
enmascaramiento que se explican más adelante.

Lectura del estado de los pines del puerto B


Independientemente de si están configurados como entradas o salidas, al leer el registro DATA se
lee el estado de todos los pines. En el bit DATAn estará el estado del pin PBn (0 o 1).

Resistencias internas de pull-up


El microcontrolador tiene internamente una resistencia de pull-up para cada pin de E/S. Estas
resistencias se pueden conectar internamente habilitándolas con el registro GPIOPUR.
Escribiendo un 1 en el bit PUEn se activa la resistencia de pull-up en el pin PBn.

Ejemplo:
En la Fig. 4 se muestra un circuito con un pulsador (P1) y un diodo led (D1). Los condensadores
C1 y C2 se emplean para desacoplar (filtrar) el ruido presente en la fuente de alimentación. El pin
38 es la línea de inicio (RESET). La resistencia R1 limita la corriente que entrega el
microcontrolador por el pin PB1.

CAPITULO2Parte1rev12.docx 9 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

Fig. 4 Circuito con un pulsador y un led


El LED es un periférico de salida, por lo tanto, debemos configurar el pin PB1 como salida. El
pulsador es un periférico de entrada, y por ello debemos configurar el pin PB0 como entrada. Los
demás pines del puerto B no están conectados, pero los configuraremos como salidas.
El pulsador para funcionar correctamente necesita una resistencia de pull-up. En el circuito no
tiene ninguna conectada así que se debe activar la resistencia interna del pin PB0. Esta resistencia
permitirá que en la entrada, cuando no esté presionado el pulsador, exista una tensión de 3,3V
que corresponde a un 1 lógico. Además, queremos que inicialmente el LED esté prendido. Para
que el led se encienda debe estar el pin PB1 en nivel alto (1 lógico).
Los valores que deben escribirse en los registros GPIODIR y GPIOPUR del puerto B serán
entonces los siguientes:
bit 31 8 7 6 5 4 3 2 1 0
GPIODIR reservado 1 1 1 1 1 1 1 0

bit 31 8 7 6 5 4 3 2 1 0
GPIOPUR reservado 0 0 0 0 0 0 0 1

bit 31 8 7 6 5 4 3 2 1 0
GPIODATA reservado 0 0 0 0 0 0 1 0

Al estar el bit 0 de GPIODIR en 0, se configura el pin PB0 como entrada. Los demás bits valen 1,
con lo cual los pines PB1 a PB7 están configurados como salida.
El bit 0 de GPIOPUR vale 1con lo cual la resistencia de pull-up del pin PB0 se activa.
El pin PB1 está configurado como salida, y el bit 1 de GPIODATA vale 1, este valor aparecerá en
el pin PB1 (nivel alto) generándose una tensión positiva en la salida cercana a los 3,3V con lo
cual se prenderá el led D1.
Los pines PB2 a PB7 están configurados como salida, y el valor escrito en los bits 2 a 7 de
GPIODATA es 0. Este valor aparecerá en los pines PB2 a PB7 y será una tensión cercana a los
0V.

CAPITULO2Parte1rev12.docx 10 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

Una vez escritos los valores indicados en GPIODIR y GPIOPUR, podrá leerse también el estado
de los pines del puerto B. Cada vez que se lea el registro GPIODATA, el estado del pulsador se
encontrará en el bit 0 (pues está conectado al pin PB0). Si dicho bit vale 0, el pulsador está
presionado, y si vale 1 el pulsador no está presionado.

Resistencias de pull-up y su finalidad


En la Fig. 5 se muestra en parte (a) un interruptor con un terminal conectado a tierra (0V) y el
otro al aire. Cuando el interruptor está cerrado la tensión en nodo A es 0V, pero cuando el
interruptor está abierto, no puede decirse que haya una tensión en el nodo A, pues no existe un
camino para la corriente eléctrica.

Fig. 5 Interruptor con un terminal al aire


Si se conectara el terminal que está al aire a la entrada de una compuerta lógica, por ejemplo un
inversor, como se muestra en la Fig. 5b cuando el interruptor esté abierto la compuerta generará
un valor en su salida B, pero sería cualquier valor aleatorio e incluso podría variar en el tiempo,
pues se comportaría como cualquier compuerta que tiene sus entradas al aire. Se dice que su valor
por ello es indeterminado.

El problema radica en no tener un camino eléctrico que llegue al nodo A cuando el interruptor
está abierto. En la Fig. 6 se muestra una solución al problema.

Fig. 6 Interruptor con resistencia de pull-up


La resistencia R1 logra que exista un camino eléctrico del nodo A hacia la fuente de
alimentación. Cuando el interruptor está abierto, no circula corriente por la resistencia R1, la
caída de tensión entre sus terminales será 0V y por lo tanto el potencial en el nodo A será de

CAPITULO2Parte1rev12.docx 11 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

3,3V. Cuando el interruptor esté cerrado el nodo A estará a 0V, y habrá una tensión de 3,3V en
R1, circulando una corriente de 0.33mA. En la Fig. 6b puede apreciarse que ahora cuando el
interruptor está cerrado la salida B está en 3,3V (1 lógico) y cuando está abierto la salida está en
0V (0 lógico). En resumen, se ha logrado tener una señal lógica binaria en función al estado del
interruptor (cerrado 1, abierto 0).

La resistencia R1 se llama “resistencia de pull-up” (pull-up resistor) por tener conectado uno de
sus terminales a la tensión positiva de la fuente de alimentación, y el otro terminal a otro nodo (en
nuestro ejemplo el nodo A).

En el ejemplo de la Fig. 4 hay conectado un pulsador (P1), que cuando no está presionado tiene
sus dos terminales abiertos, presentándose la misma situación de la Fig. 5. Por ello, para evitar los
problemas mencionados, se activa la resistencia de pull-up interna del pin PB0.

Para completar el ejemplo del circuito, y lograr que el led D1 se prenda debemos hacer un
programa que haga que el CPU escriba el valor 0b11111110 en GPIODIR, el valor 0b00000001
en GPIOPUR, y el valor 0b00000010 en GPIODATA del puerto B.

Los demás puertos (A, C, D, etc.)


Al igual que para el puerto B, los puertos A, C, D, E y F tiene cada uno sus propios registros con
la misma funcionalidad que los del puerto B. Los nombres de los registros siguen la siguiente
nomenclatura:
GPIO_PORTx_DIR_R (x=A, B, ...,F)
GPIO_PORTx_DEN_R
GPIO_PORTx_PUR_R
GPIO_PORTx_DATA_R

Por ejemplo, el registro GPIODIR del puerto G es GPIO_PORTG_DIR_R

El puerto F tiene sólo cinco pines (PF0 ... PF4) por lo tanto sólo se deben emplear los bits 0 a 4
de los registros de E/S de dicho puerto.

Habilitación de la señal de reloj de los módulos de E/S


Los microcontroladores son circuitos digitales síncronos, razón por la cual emplean una señal de
reloj. En el caso de la familia Stellaris y Tiva, a esta señal de reloj se le denomina “reloj del
sistema” (system clock) y es la empleada por el CPU. Esta señal de reloj llega a cada uno de los
módulos de E/S a través de una compuerta habilitadora que permiten que pase o no la señal de
reloj. Si no se habilita para un módulo de E/S, no llegará la señal de reloj a dicho módulo y por lo
tanto no se podrá hacer uso de los registros de E/S de dicho módulo, pues un registro sólo se
puede actualizar si recibe un pulso en su línea de reloj, y si no llega la señal de reloj nunca habría
un pulso1.
¿Por qué no está habilitada la señal de reloj siempre?
La razón principal es porque los circuitos digitales consumen más energía cuando tienen la señal
de reloj activada. Al permitir seleccionar a qué módulos activar la señal de reloj o no, podemos
1
Si por ejemplo se intenta leer o escribir en un registro de E/S del puerto B, pero no se activó la señal de reloj del
puerto B, el sistema generará lo que se denomina una excepción por falla en el bus (bus fault), pues se intentó leer o
escribir en un registro sin éxito, pues no llegaba la señal de reloj.

CAPITULO2Parte1rev12.docx 12 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

controlar en parte el consumo de energía del microcontrolador, y también podemos mantener


desactivados los módulos de E/S que no empleamos, y así ahorrar algo de energía.
Existen dos registros para manejar la activación de la señal de reloj, uno para activarlo y otro para
determinar si ya se activó.

El registro de habilitación de reloj SYSCTL_RCGCGPIO_R (abreviado RCGCGPIO)


En los módulos GPIO (puertos A...F) se controla la activación de la señal de reloj con el registro
RCGCGPIO. En la figura se muestra este registro para el microcontrolador TM4C123GH6PM.

bit 31 16
RCGCGPIO
R

15 6 5 4 3 2 1 0
R5 R4 R3 R2 R1 R0
R R/W R/W R/W R/W R/W R/W
0 0 0 0 0 0
Valor inicial: 0x0000.0000
Dir. Base: 0x400F.E000 Offset 0x608
R0: puerto A
R1: Puerto B
...
R5: Puerto F

Cada bit, del 0 al 5, permite activar la señal de reloj de uno de los puertos GPIO. Un 1 es para
activar el reloj en dicho puerto y 0 para desactivarlo. Observar que el valor inicial de este registro
es cero, es decir, ningún puerto está activado.
Por ejemplo, si queremos emplear el puerto B, debemos poner a 1 el bit 1 (R1) de este registro.

El registro de verificación de reloj SYSCTL_PRGPIO_R (abreviado PRGPIO)


Una vez activado el reloj del puerto GPIO toma una cantidad de ciclos de reloj que esté listo.
Para saber si ya está listo, y por lo tanto poder acceder a los registros de E/S, debe analizarse el
registro PRGPIO. Este registro permite saber si uno de los puertos GPIO (A...F) ya puede
accederse. En la figura se muestra este registro para el microcontrolador TM4C123GH6PM.

bit 31 16
PRGPIO
R

15 6 5 4 3 2 1 0
R5 R4 R3 R2 R1 R0
R R/W R/W R/W R/W R/W R/W
0 0 0 0 0 0
Valor inicial: 0x0000.0000
Dir. Base: 0x400F.E000 Offset 0xA08

Cada bit, del 0 al 5 es para conocer el estado de la señal de reloj de cada puerto (bit 0 puerto A,
bit 1 puerto B,..., bit 5 puerto F). Un 1 significa que el puerto puede accederse, un 0 que aún no
está listo.
Por ejemplo, si se activó la señal de reloj del puerto B con el registro RCGCGPIO, debemos
esperar a que el bit 1 del registro PRGPIO se ponga a 1 antes de leer o escribir el los registros de
E/S de dicho puerto.

CAPITULO2Parte1rev12.docx 13 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

Ejemplos en lenguaje C

Ejemplo 1
Configurar los pines PB3, PB6 y PB7 del puerto B como salidas y los demás pines del puerto B
como entradas.

Solución
Los pines del puerto B se configuran con el registro GPIO_PORTB_DIR_R. Se debe escribir un
1 para configurar un pin como salida y 0 para configurarlo como entrada. Debe entonces
escribirse el número 0b11001000 (binario) o 0xC8 (hexadecimal) en el registro GPIODIR. La
instrucción sería la siguiente:

GPIO_PORTB_R = 0b11001000; //configura pines PB7, PB6 y PB3 como


salidas

Ejemplo 2: Prender el led D1 del circuito de Fig. 4


Escribir una porción de programa en lenguaje C que prenda el led D1 del circuito de la Fig. 4.

Solución
Antes de poder configurar el puerto B, debemos activar su señal de reloj. Para ello debemos
poner a 1 el bit 1 del registro RCGC2.
SYSCTL_RCGCGPIO_R = 0x02; // bit 1 en 1

Según lo explicado para dicho circuito se quiere configurar los pines PB1 a PB7 como salida (bits
1 a 7 de GPIODIR deben valer 1), configurar el pin PB0 como entrada (bit 0 de GPIODIR debe
valer 0) y tener su resistencia de pull-up activada (bit 0 de GPIOPUR debe valer 1), y para
prender el led debe escribirse un 1 en bit 1 del registro GPIODATA.
El valor a escribir en GPIODIR debe ser entonces 0b11111110 (0xFE en base 16), el valor a
escribir en GPIOPUR 0b00000001 (0x01 en base 16) y el valor a escribir en GPIODATA
0b00000010.
La porción de programa que logra esto es:

GPIO_PORTB_DIR_R = 0xFE;
GPIO_PORTB_PUR_R = 0x01;
GPIO_PORTB_DATA_R = 0x02;

En el enunciado se puso “porción de programa”, pero ¿no es suficiente con esas instrucciones?
¿Qué le falta al programa y por qué?

En lenguaje C debe haber una función de nombre main que es la que se ejecuta al comenzar a
ejecutarse el programa.

El programa completo sería el siguiente:

CAPITULO2Parte1rev12.docx 14 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

#include <stdint.h>
void main(void)
{
uint32_t temp;
SYSCTL_RCGCGPIO_R = 0x02; // Activamos reloj en puerto B
while ((SYSCTL_PRGPIO_R & 0x02)== 0); // Hay que esperar a que bit 1
// de PRGPIO esté en 1
// para que esté realmente activado el reloj
GPIO_PORTB_DIR_R = 0xFE; // Pin PB0 entrada y los demás salida
GPIO_PORTB_PUR_R = 0x01; // Activamos resistencia pull-up en PB0
GPIO_PORTB_DATA_R = 0x02; // Prendemos el led (PB1 a 1)
while (1){
}
}

En el programa la sentencia:
while ((SYSCTL_PRGPIO_R & 0x02)== 0);

Hace que el CPU espere a que el bit 1 del registro PRGPIO se ponga a 1, y cuando ello ocurra se ejcutará la siguiente
instrucción del programa.

El programa mostrado presenta varios problemas.


 Cuando se escribe en un registro, se escriben en todos los bits del registro.
 Al escribir en SYSCTLGPIO_R el valor 0x02 estamos activando el reloj del puerto B, pero al mismo
tiempo estamos desactivando el reloj de los demás puertos, si es que hubiesen estado activados.
En general, deberíamos de modificar sólo los bits que se requieran y dejar sin modificar los demás. En el caso del
registro SYSCTL_RCGCGPIO_R sólo deberíamos modificar el bit 1 y dejar los demás bits de dicho registro con su
valor original. Lo mismo deberíamos hacer con el registro GPIO_PORTB_PUR_R. Sólo modificar el bit 0 dejando
sin modificar los demás.

Para lograr lo anterior, se emplean técnicas de enmascaramiento de bits, que se explican la parte II de este capítulo.

Selección de pines en el TM4C123GH6PM

En la Fig. 3 se mostró la disposición de pines y puertos del microcontrolador TM4C123GH6PM


que emplea la tarjeta de evaluación Tiva C Launchpad TM4C123XL y se mencionó que para
una señal de una función alternativa podemos escoger en qué pin queremos que esté dicha señal.
En la Fig. 7 se muestra, por ejemplo, el módulo UART1 y a qué pines podría ir su línea de
transmisión (U1Tx) y línea de recepción (U1Rx).

El hecho que el UART1 pueda conectarse al pin PC5, no significa que sea el único módulo de
E/S que podría hacer uso de dicho pin. En la Fig. 8 se muestra qué módulos de E/S podrían hacer
uso del pin PC5. De hecho, para casi todos los pines de E/S puede escogerse entre más de un
módulo de E/S la señal a enviar al pin, o recibir desde el pin (en caso de señales de entrada).

CAPITULO2Parte1rev12.docx 15 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

Fig. 7 Multiplexaje de pines del módulo E/S UART1. La señal U1Tx puede conectarse a los pines PC5 o PB1.
La señal U1Rx a los pines PC4 o PB0.

CAPITULO2Parte1rev12.docx 16 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

Fig. 8 Multiplexaje del pin PC5. Además de ser pin GPIO (PC5), puede conectarse a otros seis módulos de
E/S. Se muestra el nombre de cada módulo y las señales que podrían llegar al pin. Sólo una de ellas puede
usarse por vez.

Selección de pines: Registros AMSEL, AFSEL y PCTL


Para seleccionar entre una función alternativa y la función GPIO de un pin de un puerto en
particular el microcontrolador cuneta con tres registros de E/S por puerto GPIO para la
configuración cuyos nombres abreviados son los siguientes:
 GPIOAMSEL. Para seleccionar entre señales analógicas (si las soporta el pin) o digitales
 GPIOAFSEL. Para seleccionar entre usar el pin como GPIO o con una de las funciones
alternativas.
 GPIOPCTL. Para seleccionar la función alternativa deseada.

En los registros GPIOAMSEL y GPIOAFSEL hay un bit de configuración por pin. En el registro
GPIOPCTL hay 4 bits de configuración por pin, con lo cual, teóricamente podrían haber hasta 16
opciones por pin. En el caso del TM4C123GH6PM, el pin con más opciones es el pin 28 (PF0)
que tiene 8 funciones alternativas, además de poder usarse como pin GPIO PF0.

Registro GPIOAFSEL
Hay un registro por puerto GPIO. El nombre específico de cada registro es GPIO_PORTx_AFSEL_R con
x=A, B, C, D, E o F. De estos registros se emplean los bits 0 a 7 para los puertos de 8 pines (A, B, C, D),
los bits 0 a 3 para el puerto E (es de 4 pines) y los bits 0 a 4 para el puerto F (es de 5 pines).

CAPITULO2Parte1rev12.docx 17 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

bit 31 8 7 6 5 4 3 2 1 0
GPIOAFSEL RESERVADO AFSEL
0x420 R R/W R/W R/W R/W R/W R/W R/W R/W
- - - - - - - -
bit x = 0: Pin x configurado como GPIO y controlado por registros GPIO
bit x = 1: Pin es controlado por algún módulo de E/S (alternate function)

Registro GPIOAMSEL
Este registro, uno por puerto, permite seleccionar, en los puertos que pueden tener funciones
analógicas, si se quiere emplear para una función analógica o digital. Si se conectara una señal
digital a un pin configurado para señales analógicas, puede malograrse el circuito
integrado. Por eso es importante, configurar el pin para señales analógicas sólo si se van a
emplear con este tipo de señal. Cuando se selecciona para funciones digitales, queda protegida la
parte analógica por un circuito de aislamiento interno.
bit 31 8 7 6 5 4 3 2 1 0
GPIOAMSEL RESERVADO GPIOAMSEL
0x528 R R/W R/W R/W R/W R/W R/W R/W R/W
0 0 0 0 0 0 0 0
bit x = 0: Funciones analógicas de Pin x desactivadas. Pin x puede tener funciones digitales.
bit x = 1: Funciones analógicas de Pin x activadas. Pin x no podrá tener funciones digitales.
Este registro sólo existe para puertos B, C, D y E, pues son los únicos con funciones analógicas. En lenguaje
C se llaman GPIO_PORTB_AMSEL _R, GPIO_PORTC_AMSEL _R, GPIO_PORTD_AMSEL _R y
GPIO_PORTE_AMSEL_R

Registro GPIOPCTL
Este registro es el registro que permite seleccionar entre las diferentes funciones alternativas del
pin, sean éstas analógicas o digitales. Hay cuatro bits por pin, que corresponden a un dígito
hexadecimal. Si se representa el valor como número hexadecimal de 32 bits, habrá 8 dígitos
hexadecimales, correspondiendo el de más a la derecha (dígito menos significativo) a la
configuración del pin Pn0 (n=A, B, C, D, E o F), el siguiente dígito al pin Pn1, y así
sucesivamente. El manual del microcontrolador tiene una tabla de título “GPIO Pins and
Alternate Functions”2 donde especifica, para cada pin, qué valor corresponde a qué función
alternativa.
Para seleccionar la función GPIO en un pin, se pone a cero el valor del campo respectivo (los 4
bits).
Se presenta a continuación el detalle del registro GPIOPCTL. Cada campo de 4 bits (nible) está
etiquetado como PMCx, siendo x el número de pin del puerto (0 a 7). Para seleccionar la función
GPIO se pone el campo correspondiente a cero.

2
“Tiva™ TM4C123GH6PM Microcontroller DATA SHEET”, Rev. D, Texas Instruments, 2013.

CAPITULO2Parte1rev12.docx 18 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

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

A continuación se presenta una porción de la tabla 23-5 del manual del microcontrolador.

Ejemplo
Configurar el pin PD4 para que esté la señal digital de recepción (entrada) U6Rx del módulo
UART6, y los demás pines del puerto queden configurados como pines de salida GPIO y que
estén en nivel bajo (0 lógico).

Solución

Para poder emplear los pines del puerto D, debemos activar primero la señal de reloj de dicho
puerto utilizando el registro RCGCGPIO. Como es el puerto D, hay que poner a 1 el bit 3. En
lenguaje C sería así:

SYSCTL_RCGCGPIO_R = 0x08; // activamos reloj en puerto D

Como sólo quiere emplearse el pin PD4 con una función alternativa, pondremos a 1 el bit 4 del
registro GPIOAFSEL del puerto D, y los demás en cero. En lenguaje C sería así:

GPIO_PORTD_AFSEL_R = 0x10; // función alternativa sólo en pin PD4


Para seleccionar la función alternativa del pin PD4 revisamos la tabla 23-5 (ver líneas arriba) y
vemos que para la señal U6Rx, el valor del campo PMC4 (pues es el pin 4) debe ser 1.
Para configurar los demás pines como GPIO escribiremos en sus campos 0. En lenguaje C
quedaría así:
GPIO_PORTD_PCTL_R = 0x00010000; // campo PMC4=1, cada dígito
// hexadecimal corresponde a un campo

La señal U6Rx es una señal digital de entrada, y los demás pines se emplearán como pines GPIO,
los cuales son digitales, por lo tanto, debemos aislar la parte analógica de estos pines (hacemos
AMSEL = 0).

CAPITULO2Parte1rev12.docx 19 26/03/2019
Curso: Sistemas Digitales
Especialidad: Ing. Electrónica Profesor: Ing. Hugo Pratt
Pontificia Universidad Católica del Perú Área de circuitos y sistemas

GPIO_PORTD_AMSEL = 0x00; // ningún pin tendrá señales analógicas

Queremos que todos los pines, con excepción de PD4 sean salidas. PD4 debe ser entrada pues
U6Rx es una señal de entrada. Esto lo configuramos con el registro GPIODIR del puerto D.

GPIO_PORTD_DIR_R = 0xEF; // pin PD4 entrada, los demás salida

Deshabilitar la parte analógica no significa que se habilitó la parte digital de cada pin. Hay que
hacerlo explícitamente con el registro GPIODEN que habilita la parte digital del puerto.

GPIO_PORTD_DEN_R = 0xFF; // habilitamos todos los pines para señales digitales

Como queremos que todos los pines de salida estén en 0 lógico, escribiremos 0 en cada bit del
registro GPIODATA.

GPIO_PORTD_DATA_R = 0x00; // pines PD0...PD3, PD5...PD7 en 0 lógico.

El programa completo de configuración quedaría así:


#include <stdint.h>
void main(void)
{
uint32_t temp;

SYSCTL_RCGCGPIO_R = 0x08; // Activamos reloj en puerto D


while((SYSCTL_PRGPIO_R & 0x08) == 0); // Hay que esperar a que el reloj
//realmente esté activado el reloj
GPIO_PORTD_AMSEL = 0x00; // Ningún pin tendrá señales analógicas
GPIO_PORTD_PCTL_R = 0x00010000; // Campo PMC4=1 (PD4 será U6Rx) Cada dígito
// hexadecimal corresponde a un campo
GPIO_PORTD_DIR_R = 0xEF; // Pin PD4 entrada, los demás salida
GPIO_PORTD_AFSEL_R = 0x10; // Función alternativa sólo en pin PD4
GPIO_PORTD_DEN_R = 0xFF; // Habilitamos todos los pines para señales
// digitales
GPIO_PORTD_DATA_R = 0x00; // pines PD0..PD3, PD5..PD7 en 0 lógico

while (1){
}
}

CAPITULO2Parte1rev12.docx 20 26/03/2019

You might also like