Está en la página 1de 21

GPIO

Apuntes de clase V1.0


2019

GFR – 2019 - CC BY-SA 2.0


Índice de Contenidos
1 Entradas y salidas digitales (GPIO) ............................................................... 3
Introducción ............................................................................................ 3
2 GPIO del STM32 ........................................................................................... 3
Puertos y pines ........................................................................................ 4
Asignación de pines ................................................................................ 4
3 Algunos conceptos básicos............................................................................. 6
Familias lógicas ...................................................................................... 7
3.1.1 Características de la lógica TTL: ........................................................ 7
3.1.2 Características de la lógica CMOS: .................................................... 7
3.1.3 CMOS comparado con TTL................................................................ 7
Niveles .................................................................................................... 8
Resistencias de Pull-up/Pull-down ......................................................... 8
Disparador de Schmitt .......................................................................... 10
4 Características principales de las GPIO. ...................................................... 11
Estructura de cada pin ........................................................................... 11
Salida digital ......................................................................................... 12
Entrada digital ....................................................................................... 13
Entrada analógica .................................................................................. 13
5 Funciones alternativas .................................................................................. 14
Multiplexor de pin de E/S y mapeo ...................................................... 14
6 Características eléctricas de los GPIO ......................................................... 15
7 Interrupciones externas ................................................................................ 16
Configuración de interrupciones en pines GPIO .................................. 17
8 Sistema anti rebotes (Debouncing) .............................................................. 18
Calculo de los valores de resistencias ................................................... 20
Software Debounce ............................................................................... 20
8.2.1 Enfoque 1 .......................................................................................... 20
8.2.2 Enfoque 2 .......................................................................................... 21
9 Bibliografía................................................................................................... 21

2
1 Entradas y salidas digitales (GPIO)

Introducción
La figura 1 representa la idea de “entrada” y de “salida”, donde se toma siempre
como referencia al microcontrolador.

Figura 1: Diagrama genérico de una entrada y salida digital

En particular, la entrada/salida digital es un mecanismo básico de cualquier


microcontrolador que permite generar y leer señales en dos posibles estados, que serán
equivalentes a un “1” o a un “0” en la parte de software.
En el más simple de los casos, será una única señal (abierto/cerrado, alto/bajo,
hay/no-hay, etc.) que se representará en un solo bit; y, en otros casos, se empleará un
conjunto discreto de valores que se representará como números binarios y, por tanto,
requerirá más señales simultáneas.
El uso de este mecanismo a bajo nivel implica el acceso a los registros del hardware,
lo que es complicado en un curso de iniciación al uso de microcontroladores ARM
Cortex-M. En este apunte veremos las características generales que poseen las entradas y
salidas digitales y, posteriormente, se implementarán las prácticas con un enfoque basado
en las bibliotecas HAL que proporciona STM creando una abstracción sobre los registros
antes mencionados.

2 GPIO del STM32

Al subsistema encargado de la generación/lectura de señales digitales se le


denomina General propose input-output (GPIO). En cualquier microcontrolador hay al
menos un puerto de entrada-salida de propósito general. STM32 no es diferente y, como
se espera, también tiene varios puertos GPIO. Estos puertos generalmente se denominan
GPIOA, GPIOB, etc., pero a diferencia de la mayoría de los microcontroladores de 8/16
bits, estos puertos tienen 16 bits de ancho. Así, en general, cada puerto tiene 16 pines I/O
o E/S. Los pines del puerto tienen varios modos de operación y esto es lo que los hace
robustos y complejos a la vez. En las placas de desarrollo, la denominación de los pines
del puerto I/O se acorta, por lo que encontraremos PA0, PB12, etc. en lugar de GPIOA0,
GPIOB12, etc. Incluso en los manuales de referencia, esta denominación corta se usa
ampliamente. Al final, cada pin de E/S tiene, por naturaleza un propósito general.

3
Puertos y pines
Las señales digitales de un microcontrolador cualquiera se organizan en puertos,
que son agrupaciones de 8, 16 o 32 pines en función del modelo de microcontrolador. En
la familia STM32, las agrupaciones son de 16 pines que se corresponden internamente a
una palabra binaria de 16 bits. En la figura 2 se puede observar un ejemplo; los puertos
se numeran con letras (A, B, C, D, ...) y los pines con un número entre 0 y el número de
líneas/bits del puerto. Sin embargo, esta notación es particular de STM y cada fabricante
puede utilizar una notación distinta. Por ejemplo, un ARM Cortex-M de la marca NXP
utilizan puertos de 32 bits y la notación es distinta.

Figura 2: Puertos y pines en la plataforma STM32

Resulta importante mencionar aquí, que no debe confundirse el pin del puerto (línea) con
el pin del encapsulado (pata del chip). Por ejemplo, como se observa en la Figura 2, en el
Puerto B, el Pin 3 (Línea 3) corresponde al Pin 89 (Pata 89) del encapsulado.

Asignación de pines
El microcontrolador en la placa Nucleo es el STM32F446RET6 que viene en un
paquete de 64 pines LQFP64 (Low profile Quad Flat Pack). Las asignaciones de pines se
muestran en la Figura 3.

4
Figura 3: Puertos y pines en el STM32F446RET6

La placa Nucleo tiene dos conectores, cada uno de los cuales consta de dos
columnas de pines. El conector CN7 está a la izquierda en la Figura 4 y CN10 está a la
derecha (Figura 5).

Figura 4: Pines disponibles en la plataforma Nucleo64

CN7 y CN10 tienen 38 pines cada uno en dos columnas de 19 pines para un total
de 76 pines, de modo que todos los pines del paquete LQFP 64 se encuentran disponibles
junto con múltiples líneas de potencia, tierra y unos pocos pines sin conexión (NC).

5
Figura 5: Pines disponibles en la plataforma Nucleo64

Para los puertos de E/S, la Tabla 1 muestra los pines disponibles para la placa
Nucleo:

Tabla 1: Pines disponibles en la plataforma Nucleo64

 PB11 no tiene un pin de la placa.


 PA13 y PA14 se comparten con los circuitos de depuración y deben evitarse si es posible.
 Un LED de usuario (verde) está conectado a PA5 y está encendido cuando el pin está alto.
 Un botón de usuario está conectado a la PC13.

3 Algunos conceptos básicos

A continuación, veremos qué características nos ofrece cada una de las partes que
constituyen un puerto GPIO, pero antes, debemos entender con claridad algunos
conceptos fundamentales relacionados con la lógica digital.

6
Familias lógicas
Los diferentes tipos de dispositivos lógicos se clasifican en "familias", de las cuales,
las más importantes son la familia TTL y la familia CMOS. Estas familias son:

 TTL (Transistor-Transistor Logic), hecha con transistores bipolares.


 CMOS (Complementary Metal Oxide Semiconductor) hecha con MOSFETs.
 ECL (Emitter Coupled Logic) para velocidades extremadamente altas.
 NMOS, PMOS para circuitos integrados a gran escala (Very Larg Scale
Integrated) VLSI.

3.1.1 Características de la lógica TTL:


 10 mW de disipación de potencia por compuerta.
 Retrasos de propagación son de 10ns al tratar con 15pF/400 Ω de carga.
 El rango de tensión está entre 0 y Vcc donde Vcc es usualmente 4.75V – 5.25V.
Un nivel bajo es representado por niveles de tensión entre 0V– 0.8V, mientras que
un nivel alto se representa por niveles de tensión entre 2V – Vcc.

3.1.2 Características de la lógica CMOS:


 Potencia: La disipación de potencia depende de la potencia de la fuente de poder,
su frecuencia, carga en la salida y el tiempo de arranque. A 1 MHz y a 50pF de
carga, la disipación de potencia es típicamente 10nW por compuerta.
 Retrasos de propagación corta: Dependiendo de la fuente de alimentación, los
retrasos de propagación son usualmente de 25 ns a 50 ns.
 Tiempos de subida y bajada controlados: Los flancos de subida y de bajada son
usualmente denominados como rampas en lugar de funciones de escalón, y tardan
entre 20% – 40% más que los retrasos de propagación.
 Nivel de tensión desde 0 a VDD donde VDD es la fuente de tensión. Un nivel
bajo es cualquier valor entre 0 y 1/3 de VDD mientras que un nivel alto se
representa como cualquier valor entre 2/3 VDD y VDD.
3.1.3 CMOS comparado con TTL
 Los componentes CMOS son usualmente más caros que los equivalentes en TTL.
Sin embargo, la tecnología CMOS es más barata a nivel de sistema, esto debido a
los chips que poseen un menor tamaño además que requieren menos regulación.
 Los circuitos CMOS no drenan tanta potencia como los TTL en los períodos de
inactividad. Sin embargo, el consumo de potencia de los CMOS se incrementa
más rápidamente que los TTL al aumentar la velocidad del reloj. Un menor
consumo de corriente requiere menor distribución de la fuente de alimentación,
teniendo como producto un diseño más sencillo y barato.
 Debido a que los tiempos de subida y bajada son mayores, la transmisión de las
señales digitales resulta más sencilla y barata con los chips CMOS.
 Los componentes CMOS son más susceptibles a daños por descargas
electrostáticas con respecto a los componentes TTL.

7
Niveles
La electrónica digital utiliza sistemas y circuitos en los que sólo existen dos
estados posibles. Estos estados se representan mediante dos niveles de tensión diferentes:
ALTO (HIGH) y BAJO (LOW). Si consideramos lógica directa, un alto es un uno y un
bajo es un cero. Las tensiones que se utilizan para representar los unos y ceros reciben el
nombre de niveles lógicos. Lo ideal sería que un nivel de tensión representara el nivel
ALTO y otro nivel de tensión representara el nivel BAJO.
La figura 6 ilustra el rango general de variación para los niveles bajo y alto en
distintas familias de circuitos digitales. Los valores que se muestran en la figura son:

 Una tensión de entrada nivel alto se denomina VIH


 Una tensión de entrada nivel bajo se denomina VIL
 Una tensión de salida nivel alto se denomina VOH
 Una tensión de salida nivel bajo se denomina VOL

Los valores de tensión de entrada comprendidos entre VIH y VIL no son aceptables
para un funcionamiento correcto. Una tensión dentro de este rango podría ser interpretada
tanto como nivel alto cuanto como nivel bajo en un determinado circuito. Por tanto, estos
valores no aceptables no deben emplearse nunca.

Figura 6: Niveles de tensión de las distintas familias y según las tensiones


máximas de alimentación.

Es importante aclarar que los niveles exactos de la plataforma utilizada dependerán


de la tensión de alimentación. Esta información se encuentra en las características
eléctricas de la hoja de datos del microcontrolador y la desarrollaremos más adelante.

Resistencias de Pull-up/Pull-down
Las resistencias denominadas Pull up y Pull down, muy empleadas en circuitos
electrónicos digitales, no son ningún tipo de resistencia o componente electrónico

8
especial por su construcción, se trata de resistencias comunes que reciben este nombre
por su cometido dentro del circuito.
Las resistencias Pull-up/down son utilizadas en circuitos digitales para asegurar en
cualquier circunstancia un nivel lógico seguro y definido en una determinada entrada o
pin digital. Complementando lo visto anteriormente, podemos definir que, en electrónica
digital existen tres estados lógicos:
 Alto (High): Representa la presencia de voltaje eléctrico, también llamado Uno
Lógico.
 Bajo (Low): Representa la ausencia de voltaje eléctrico, también llamado Cero
Lógico.
 Flotante (Floating): Estado de Alta Impedancia (Hi-Z). Desconectado del resto del
circuito electrónico.
El estado de Alta Impedancia se utiliza cuando deseamos inhibir determinadas
salidas digitales, por ejemplo, en Buses de Comunicación. Eléctricamente es igual que si
no estuviera conectado, por lo tanto, no interfiere el funcionamiento eléctrico del resto de
circuitos. No todos los circuitos digitales disponen en sus salidas de los tres estados, a las
salidas digitales dotadas de esta característica se les denomina tri-state.
Pero lo que en una salida digital puede ser útil, para una entrada digital es
inadmisible, ya que solo puede reconocer estados Altos y Bajos. Una entrada digital no
conectada, o en Alta Impedancia, recogerá todo el ruido eléctrico ambiental, lo que dará
lugar a errores debidos a que ese ruido será interpretado como bruscas modificaciones de
estados lógicos. Además, producirá sobreconsumos y oscilaciones eléctricas indeseadas.
Todo ello, producirá comportamientos no esperados que se manifestarán en forma de
averías aleatorias que, en ocasiones, pueden llegar a causar daños irreversibles en la
electrónica de la entrada digital.
Para resolver esta indeterminación solo deberemos conectar la entrada digital,
mediante una resistencia, a la tensión de alimentación (presencia de voltaje = estado
lógico Alto). A esta resistencia se le dará un valor suficientemente alto como para que
cuando debemos poner esa entrada en estado Bajo, pueda soportar la corriente eléctrica
que circule por ella, dada por la máxima capacidad de drenaje de la puerta de entrada del
pin.
Por lo tanto, una resistencia Pull-up no es otra cosa que una resistencia de valor
fijo, conectada entre la alimentación eléctrica y la entrada digital en la deseamos
asegurar un valor lógico Alto. Con ella, eliminamos cualquier posibilidad de
indeterminación en su estado eléctrico producida por las salidas digitales o mecánicas
(pulsadores, interruptores, etc.) a las que se conecta.
Las resistencias Pull-down tienen el mismo cometido que las Pull-up, pero en
lugar de asegurar el valor lógico Alto, aseguran el nivel lógico Bajo.
Como se puede deducir de las anteriores explicaciones, son prácticamente
obligatorias cuando se usan interruptores o pulsadores manuales conectados a entradas
digitales (ver Figura 7), pero también se utilizan cuando debemos conectar distintas
salidas tri-state a una entrada digital, o cuando un solo pin digital puede funcionar como
entrada y salida. En general, se utilizarán siempre que necesitemos garantizar un
determinado valor lógico de manera permanente o durante tránsitos rápidos de estados
lógicos donde además facilitan la descargar de las capacidades parásitas que aparecen en
el circuito

9
Figura 7: Esquema de conexión de resistencias de Pull-up y Pull-down

Cabe destacar que para evitar circuitería exterior, muchos circuitos integrados ya
disponen de resistencias Pull-up o Pull-down en su interior, y en el caso concreto de los
Microcontroladores, es muy habitual que la conexión o no de sus resistencias Pull-up o
Pull-down interiores sea configurable mediante programación.
Disparador de Schmitt
Las compuertas Schmitt Trigger son dispositivos que se utilizan para convertir
señales imperfectas, lentas o con ruido en señales digitales bien definidas, rápidas y sin
ruido. Realizan las mismas funciones lógicas de las compuertas comunes, pero poseen
ciertas características distintivas especiales.
Sus características las hacen muy útiles en numerosas aplicaciones donde se
presentan problemas con señales mal definidas, distorsionadas o ruidosas.
Las compuertas operan como compuertas comunes, pero se caracterizan por poseer
histéresis que las hace inmunes al ruido y les permite trabajar con señales digitales no
ideales. Una compuerta Schmitt-trigger entrega siempre una onda cuadrada a la salida,
sin importar la forma de onda de la señal de entrada. En la figura 8 se muestra el símbolo
y el comportamiento de una compuerta Schmitt Trigger frente a una señal con ruido.

a) Símbolo Schmitt Trigger

b) Comportamiento de una salida digital sin y con Schmitt Trigger


Figura 8

10
4 Características principales de las GPIO.

Las características típicas de un puerto GPIO en la familia CORTEX-M4 son:


 Control sobre puertos de 16 líneas de E/S.
 Estados de salida: push-pull o drenaje abierto (open drain) + pull-up / down
 Selección de velocidad para cada E/S.
 Estados de entrada: flotante, pull-up / down, analógico.
 Cambio rápido (capaz de cambiar la salida cada dos ciclos de reloj).
 La multiplexación de pines altamente flexible permite el uso de pines de E/S
como GPIO o como una de las varias funciones asociadas a otros
periféricos.
Estructura de cada pin
Cada pin de un STM32F446RE tiene una estructura general similar a la mostrada
en la figura 9. En la parte de la izquierda se tienen los registros a los que accede el software
para gestionar la estructura, y en el extremo de la derecha se tiene el pin físico del
encapsulado.
La integridad de la estructura está protegida (hasta cierto punto) con diodos que
evitan tensiones negativas y tensiones superiores a VDD_FT, que en unos pines es la
tensión de alimentación del chip y en otros es una tensión TTL (5 voltios). Estos últimos
pines hacen al integrado compatible con señales clásicas TTL.
Para forzar niveles de tensión altos o bajos, se incorporan resistencias de pull-up
para “estirar hacia arriba” y de pull-down para “estirar hacia abajo”. Estas resistencias se
pueden desconectar, y su valor debe comprobarse en las hojas de características del chip
que se elija. Por ejemplo, en el chip STM32F446RE es de unos 40k (página 119 del
manual DocID027107 Rev 6).

Figura 9: Estructura interna básica de un pin (tolerante a 5V)


En resumidas cuentas, dentro de la estructura básica vemos un driver de entrada
digital, un driver de salida digital, una posible conexión a entrada/salida analógica y una
posible conexión a una función alternativa digital.

11
Salida digital
La figura 10 representa la estructura del pin configurada como salida. La estructura
se puede gestionar de muchas maneras que se describen en el manual de referencia
correspondiente, por ejemplo, para el STM32F4x están disponibles en [STM32F4-
reference-manual]. Básicamente, el driver de salida se puede configurar en modo push-
pull u open-drain (“drenador abierto”). Ambas configuraciones nos dicen cómo se diseña
internamente el pin GPIO de uC.

Figura 10: Estructura interna de un pin configurado como salida


Tipo de drenaje abierto (Open Drain): En el tipo de drenaje abierto solo habrá
un interruptor (transistor / MOSFET) dentro del microcontrolador, y este interruptor está
conectado a tierra.
Tipo Push-Pull: En el tipo Push-Pull, habrá dos interruptores (transistor/MOSFET)
dentro del microcontrolador. Un interruptor se conectará a tierra (Vss) y el otro se
conectará a Vcc/Vdd.
Los modos Open-Drain y Push-Pull se ilustran en la figura 11. En la mayoría de los
casos, el tipo push-pull será más ventajoso que el tipo Open Drain. Sin embargo, en
función de la configuración, se dispondrá de más o menos corriente para absorber-emitir,
pero siempre será de unos pocos miliamperios que dependerán del puerto elegido y del
modelo concreto de microcontrolador, debiéndose comprobar en las hojas de
características eléctricas. Además, las distintas configuraciones permiten adaptarse a gran
variedad de aplicaciones, pudiéndose complementar con distintas configuraciones de las
resistencias de pull-up y pull-down.

Figura 11: Salida Push-Pull y Open Drain

12
Entrada digital
La figura 12 ilustra la estructura de un GPIO configurado en modo entrada. La
entrada se realiza mediante un buffer tipo Schmitt para filtrar las señales. Mediante las
resistencias de pull-up y pull-down se amplía el rango de posibilidades de conexión sin
necesidad de añadir más componentes externos. Además, se observan dos diodos de
protección que se encargan de proteger la lógica de entrada de sobre tensiones tanto
positivas como negativas.

Figura 12: Estructura interna de un pin configurado como entrada

Cuando el pin de E/S está programado como entrada es importante saber que:
 El búfer de salida está deshabilitado
 La entrada del disparador Schmitt está activada
 Las resistencias de pull-up y pull-down se pueden activar o desactivar.
 Los datos presentes en el pin se muestrean en el registro de datos de entrada
cada ciclo de clock del bus AHB1.
Entrada analógica
Aunque detallaremos esta sección cuando veamos el proceso de conversión
analógico-digital / digital-analógico, vale la pena aquí detallar que sucede con la
arquitectura de cada pin cuando se lo configura para trabajar como entrada o salida
analógica.
Cuando el puerto de E/S está programado como configuración analógica sabemos
que:
 El búfer de salida estará deshabilitado
 La entrada del disparador Schmitt está desactivada, proporcionando un
consumo cero para cada valor analógico del pin de E/S. La salida del
disparador Schmitt se fuerza a un valor constante (0).
 Las resistencias débiles de pull-up y pull-down están deshabilitadas
 El acceso de lectura al registro de datos de entrada obtiene el valor “0”
 Los pines de E / S no serán tolerantes a 5 voltios.

13
Figura 13: Estructura interna de un pin configurado como analógico

5 Funciones alternativas
Multiplexor de pin de E/S y mapeo
Los pines de E/S del microcontrolador están conectados a periféricos/módulos
integrados a través de un multiplexor que permite que solo una función alternativa (AF)
de un periférico esté conectada a un pin de E/S a la vez. De esta manera, no puede haber
conflicto entre los periféricos que comparten el mismo pin de E/S. Cada pin de E/S tiene
un multiplexor con dieciséis entradas de función alternativas (AF0 a AF15) que se
pueden configurar a través de dos registros de 32 bits. Cada registro de 32 bits utiliza 4
bits para configurar un pin y elegir una de las 16 posibles opciones. Los 32 bits de ese
registro permiten configurar del pin del 0 al 7 y el otro registro permite configurar desde
el pin del 8 al 15.
 Después de un reset todas las E/S están conectadas a la función alternativa
0 del sistema (AF0).
 Las funciones alternativas de los periféricos se asignan de AF1 a AF13.
 En el Cortex-M4 el FPU EVENTOUT se asigna a la AF15.
Esta estructura de configuración se muestra en la figura 14.

Figura 14: Multiplexor para la elección de la función alternativa pin (0-7)

14
Además de esta arquitectura flexible de multiplexación de E/S, cada periférico tiene
funciones alternativas asignadas a diferentes pines de E/S para optimizar la cantidad de
periféricos disponibles en paquetes más pequeños.

Para saber qué funciones se multiplexan en cada pin GPIO, consultar a partir
de la página 46 del manual DocID027107 Rev 6.

6 Características eléctricas de los GPIO


Cuando se utiliza un microcontrolador para controlar un sistema embebido deben
considerarse sus propiedades eléctricas en el momento del diseño de la electrónica que
acondicionará las señales provenientes de los sensores y hacia los actuadores. Para no
cometer errores y provocar fallas irreversibles en el microcontrolador se deben consultar
las características eléctricas que ofrece la hoja de datos del mismo. A continuación,
mostraremos algunos extractos de la hoja de datos del microcontrolador STM32F446RE
referentes a las entradas y salidas digitales. Para todos los datos mostrados a continuación
y a menos que se especifique lo contrario, están basados en una temperatura ambiente TA
= 25°C, y una tensión de alimentación nominal VDD = 3.3 V.
En la Tabla 2 se observan los valores de tensiones que representan un 0 y un 1
lógico para las GPIO en función de la tensión de alimentación VDD. Como se puede
calcular, para una alimentación de 3.3V el valor mínimo de tensión para que sea
considerado un 1 (uno) lógico es de 2.31V y el valor máximo para ser considerado un 0
(cero) lógico es de 0.99V.

1. Garantizado por diseño.


2. Probado en producción.
Tabla 2: Valores de tensión para las E/S

Como se observa en la tabla 3, cada pin GPIO puede alimentar o absorber hasta
25mA. Sin embargo, se debe tener cuidado para que la corriente total que entra o sale del
chip por la suma de todos sus pines no exceda los 120mA. Exceder este valor puede
provocar un sobrecalentamiento del microcontrolador.

15
1. Garantizado por diseño.
2. Probado en producción.
Tabla 3: Valores de corriente para las E/S

7 Interrupciones externas

El controlador externo de interrupción (EXTI) consta de 23 líneas de detección de


flancos utilizadas para generar solicitudes de interrupción. Cada línea puede configurarse
independientemente para seleccionar el evento de activación (flanco ascendente, flanco
descendente, ambos) y se puede enmascarar de forma independiente. Un registro
pendiente mantiene el estado de las solicitudes de interrupción. El EXTI puede detectar
una línea externa con un ancho de pulso más corto que el período de reloj del APB2
interno que distribuye el reloj en la estructura de las GPIO. Se pueden conectar hasta 114
GPIOs a las 16 líneas de interrupción externas.

Figura 15: Esquema simplificado


Resumiendo, las principales características del controlador EXTI son las siguientes:
 Activador y máscara independientes en cada línea de interrupción.
 Bit de estado dedicado para cada línea de interrupción.
 Generación de hasta 23 solicitudes de interrupciones de software.
 Detección de señales externas con un ancho de pulso inferior al período de
reloj APB2.

16
La figura 16 muestra un diagrama de External interrupt controller (EXTI) de los
microcontroladores STM32F4.

Figura 16: Esquema simplificado

El EXTI consiste en una serie de detectores de flancos capaces de generar eventos


o interrupciones. Estos detectores están conectados a pines de los puertos o a elementos
como la alarma del reloj de tiempo real, el evento de despertar del puerto Ethernet, etc..
Para la programación de la EXTI las bibliotecas HAL ocultan en parte su
configuración asociándola a la programación del dispositivo objetivo. Para entenderlo
mejor, por ejemplo, determinadas combinaciones de configuración de los pines GPIO
harán que el HAL configure automáticamente también este periférico.
Configuración de interrupciones en pines GPIO
Debido a la gran cantidad de pines de GPIO (más de 160 en algunos encapsulados),
cada bit de un puerto está asociado a un EXTI particular (o línea), así, todos los Px0 están
asociados a EXTI_0, los Px1 a EXTI_1 y así sucesivamente. Además, solo un Pxy puede
estar asociado a su correspondiente EXT_y pues emplean una configuración asociadas a
un multiplexor como se muestra en la figura 17.

17
Figura 17: Multiplexor de los Px0 asociados a la interrupción EXTI_0

8 Sistema anti rebotes (Debouncing)

El rebote es la tendencia de dos contactos metálicos en un dispositivo electrónico a


generar múltiples señales cuando los contactos se cierran o se abren. El anti rebote
(debouncing) es cualquier tipo de dispositivo o software de hardware que garantice que
solo se actuará sobre una sola señal para una sola apertura o cierre de un contacto.
Cuando presiona una tecla en el teclado de su computadora, espera que la
computadora registre un solo contacto. De hecho, sin embargo, hay un contacto inicial,
un ligero rebote o aligeramiento del contacto, luego otro contacto cuando el rebote
termina, otro rebote hacia atrás, y así sucesivamente. Un efecto similar tiene lugar cuando
se abre un interruptor hecho con un contacto metálico. La solución habitual es un
dispositivo o software que garantice que solo se pueda registrar una señal digital en el
espacio de un tiempo determinado (generalmente milisegundos).
La figura 18 de la izquierda muestra un simple interruptor de presión con una
resistencia de pull-up. La figura 18 de la derecha muestra la traza en el terminal de salida,
Vout, cuando se presiona el interruptor. Como se puede ver, presionar el interruptor no
proporciona un borde limpio. Si esta señal se usara como entrada a un contador digital,
por ejemplo, obtendría múltiples conteos en lugar del conteo único esperado.

Figura 18: Switch y rebotes resultantes

Tenga en cuenta que lo mismo puede ocurrir en la liberación de un interruptor.

18
El problema es que los contactos dentro del interruptor no hacen contacto limpio,
sino que en realidad son ligeramente "rebotar". El rebote es bastante lento, por lo que
puede recrear la traza y el problema con bastante facilidad.

Hay muchos enfoques diferentes para limpiar el rebote del interruptor. A


continuación, se muestra un circuito anti rebote. La idea básica es utilizar un condensador
para filtrar los cambios rápidos en la señal del interruptor.

Figura 19: Sistema antirebotes con capacitor

El funcionamiento del circuito se puede explicar mirando los circuitos equivalentes


formados en los dos estados de interruptor, abierto y cerrado.

Figura 20: Sistema anti rebotes con capacitor en funcionamiento

Comenzando con el interruptor abierto.

El condensador C1 se cargará a través de R1 y D1. Con el tiempo, C1 se cargará y


Vb alcanzará dentro de Vcc - 0.7V. Por lo tanto, la salida del disparador de Schmitt
inversor será un 0 lógico.

Ahora se cierra el interruptor

El condensador se descargará a través de R2. Con el tiempo, C1 se descargará y Vb


alcanzará los 0V. Por lo tanto, la salida del disparador de Schmitt inversor será un 1
lógico.
Pero ¿qué pasa con las condiciones de rebote? Si se produce un rebote y hay cortos
períodos de cierre o apertura del interruptor, el capacitor detendrá el voltaje en Vb que
alcanza Vcc o GND inmediatamente. Aunque el rebote provocará una ligera carga y
descarga del capacitor, la histéresis de la entrada del disparador Schmitt detendrá la la
conmutación.

19
¿Qué función cumple el diodo? Bueno, la resistencia R2 se requiere como una ruta
de descarga para el condensador, sin ella, C1 se cortocircuitará cuando el interruptor esté
cerrado. Sin el diodo, D1, tanto R1 como R2 formarían la ruta de carga del capacitor
cuando el interruptor esté abierto. La combinación de R1 y R2 aumentaría el tiempo de
carga del condensador, ralentizando el circuito. Entonces, ¿no puedes simplemente hacer
R1 más pequeño? Prácticamente, no, porque cuando el interruptor está cerrado, R1 está
conectado a través de los rieles de suministro, por lo que un valor de resistencia
demasiado pequeño daría lugar a una corriente desperdiciada muy grande.
Calculo de los valores de resistencias
El truco consiste en seleccionar valores que aseguren que la tensión del capacitor
se mantenga por encima de Vth, el umbral en el que la puerta cambia, hasta que el
interruptor deja de rebotar. Es sorprendente la cantidad de personas abandonadas en los
bares frente al mar que escogen una constante de tiempo casi aleatoria. "Los muchachos
y yo, nosotros pensamos que se suman como 50 ms".

“Shortchanging a real analysis starts even a clean-cut engineer down the slippery
slope to the wastrel vagabond’s life.”

La mayoría de los interruptores que examinamos tuvieron tiempos de rebote muy


por debajo de 10 ms. Usa 20 para ser conservador. En clase veremos como calcular los
valores de R fijando previamente los valores de C suponiendo un tiempo de
establecimiento de al menos 20ms.
Software Debounce
Evitar los rebotes de un interruptor en el software es muy simple. La idea básica es
muestrear la señal del interruptor en un intervalo regular y filtrar las fallas. Hay un par de
enfoques para lograr esto enumerados a continuación. Ambos enfoques asumen un
circuito de interruptor como el que se muestra en la figura 18: un simple interruptor con
una resistencia de pull-up.

8.2.1 Enfoque 1
El primer enfoque usa un contador para medir el tiempo durante el cual la señal de
conmutación ha estado baja. Si la señal ha estado baja continuamente durante un tiempo
determinado, entonces se considera presionada y estable.

1 Setup a counter variable, initialise to zero.


2 Setup a regular sampling event, perhaps using a timer. Use a period of about 1ms.

3 On a sample event:
4 if switch signal is high then
5 Reset the counter varaible to zero
6 Set internal switch state to released
7 else
8 Increment the counter variable to a maximum of 10
9 end if
10 if counter=10 then
11 Set internal switch state to pressed
12 end if

20
8.2.2 Enfoque 2
El segundo enfoque es similar al primero, pero utiliza un registro de desplazamiento
en lugar de un contador. El algoritmo asume un valor de registro de 8 bits sin signo, como
el que se encuentra en los microcontroladores de 8 bits.

1 Setup a variable to act as a shift register, initialise it to 0xFF.


2 Setup a regular sampling event, perhaps using a timer. Use a period of about 1ms.

3 On a sample event:
4 Shift the variable towards the most significant bit
5 Set the least significant bit to the current switch value
6 if shift register val=0 then
7 Set internal switch state to pressed
8 else
9 Set internal switch state to released
10 end if

9 Bibliografía

 STM32F446-ARM Nucleo Board User's Manual D.K. Blandford August, 2017.


 STM32F446xx advanced Arm®-based 32-bit MCUs - Reference manual.
 STM32F446xC/E - DocID027107 Rev 6.
 A Guide to Debouncing - Rev 3: June, 2008 - Jack G. Ganssle - 2004 The Ganssle Group.

21

También podría gustarte