Tema 4 GPIO

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 28

Tema 4 – Manejo de puertos

de E/S - GPIO

1 / 28
Interconexión de periféricos

Cada periférico de un STM32 está interconectado
con el núcleo por varios niveles de buses.
• El bus del sistema (System Bus) conecta el bus
del núcleo Cortex-M a una matriz de buses
(BusMatrix), que administra el arbitraje entre el
núcleo y el DMA (Direct Memory Access). El núcleo
y el DMA actúan como maestros.
• El bus DMA (DMA Bus) conecta el interfaz
maestro del AHB (Advanced High-performance
Bus) del DMA al BusMatrix, que administra el
acceso del CPU y el DMA a la SRAM, memoria
flash y periféricos.
2 / 28
Interconexión de periféricos
• La matriz de buses BusMatrix administra el
arbitraje de acceso entre el núcleo y el bus maestro
DMA.
La matriz de buses está compuesta por dos
maestros (CPU y DMA) y cuatro esclavos: memoria
flash, SRAM, AHB1 con un puente entre AHB y
APB (Advanced Peripheral Bus) y AHB2.
Los periféricos AHB están conectados al BusMatrix
para permitir el acceso del DMA.
• El puente AHB a APB provee conexiones entre el
AHB y el APB, al que están conectados la mayoría
de los periféricos. 3 / 28
Interconexión de periféricos

Fuente: Noviello. Mastering STM32. 4 / 28


Mapa de memoria de periféricos

Fuente: Noviello. Mastering STM32.


Localización de periféricos en la memorial de un
microcontrolador STM32. 5 / 28
Puertos de E/S GPIO

Cada microcontrolador STM32 tiene un número
variable de entradas/ salidas programables GPIO
(General Programmable I/O). El número exacto
depende de:
• El tipo de empaque del dispositivo (LQFP48,
BGA176, etc.).
• La familia del microcontrolador (F0, F1, etc.).
• El uso de cristales externos para HSE y LSE.

6 / 28
Puertos de E/S GPIO

Los GPIOs son la forma en que el microcontrolador
se comunica con el mundo exterior. Cada
dispositivo utiliza un número variable de pines de
E/S para activar periféricos externos (un LED por
ejemplo) o para intercambiar información a través
de varios tipos de periféricos de comunicación
(UART, USB, SPI, etc.).

Si un periférico se conecta mediante pines de E/S,
hay que configurar los GPIOs correspondientes
usando el módulo HAL_GPIO.

7 / 28
Módulo HAL_GPIO

Una de las funciones del módulo HAL es la de
abstraer un periférico de su mapeo de memoria
específico.

También provee una forma general y más amigable
de configurar el periférico, sin forzar al programador
a que conozca en detalle la forma de configurar sus
registros específicos.

Esto se logra definiendo varios manejadores
(handlers) para cada periférico. Un handler no es
más que un estructura en C, cuyas referencias se
utilizan para apuntar a las direcciones reales del
periférico.
8 / 28
Módulo HAL_GPIO

Para configurar un puerto GPIO se utiliza la función
HAL_GPIO_Init(GPIO_TypeDef *GPIOx,
GPIO_InitTypeDef *GPIO_Init).
● GPIO_InitTypeDef es la estructura en C usada
para configurar el, GPIO y se define como:

9 / 28
Estructura GPIO_InitTypeDef
• Pin: Es el número, comenzando desde 0, de los
pines que se van a configurar. Por ejemplo, para el
pin PA5 toma el valor GPIO_PIN_5. Se puede usar
la misma instancia GPIO_InitTypeDef para
configurar varios pines a la vez, usando una
función OR a nivel de bits (GPIO_PIN_1 |
GPIO_PIN_5 | GPIO_PIN_6).
• Mode: Es el modo de operación del pin y puede
asumir varios valores.
• Pull: Especifica la activación del Pull-up o Pull-
down para los pines seleccionados.
10 / 28
Estructura GPIO_InitTypeDef
• Speed: Define la velocidad del pin.
• Alternate: Especifica que periférico se va a
asociar con el pin, redireccionamiento de algunos
periféricos (disponible en los empaquetados de 64-
pin, 100-pin o 144-pin).

11 / 28
Estructura GPIO_InitTypeDef

12 / 28
Estructura GPIO_InitTypeDef

13 / 28
Diagrama de bit E/S

Estructura básica de un bit de E/S.

14 / 28
Modo GPIO_MODE_INPUT

El buffer de salida está deshabilitado.

La entrada de Scmitt trigger está activada.

Las resistencias de pull-up y pull-down se activan
dependiendo del valor del campo Pull.

El dato presente en el pin de E/S se muestrea en el
registro de entrada cada ciclo de reloj del AHB.

Una lectura al registro de entrada muestra el
estado del pin de E/S.

15 / 28
Modo GPIO_MODE_ANALOG

El buffer de salida está deshabilitado.

La entrada de Scmitt trigger está desactivada.

Las resistencias de pull-up y pull-down están
deshabilitadas por hardware.

La lectura del registro de entrada da el valor 0.

16 / 28
Modo GPIO_MODE_OUTPUT_xx

El buffer de salida se habilita como sigue:
- si el modo es GPIO_MODE_OUTPUT_OD: Un 0 en el
registro de salida (ODR) activa el transistor N-MOS
mientras que un 1 deja el puerto en alta impedancia
(el transistor P-MOS nunca se activa).
- si el modo es GPIO_MODE_OUTPUT_PP: Un 0 en el
ODR activa el transistor N-MOS mientras que un 1
activa el transistor P-MOS.

17 / 28
Modo GPIO_MODE_OUTPUT_xx

La entrada de Scmitt trigger está activada.

Las resistencias de pull-up y pull-down están
habilitadas dependiendo del valor del campo Pull.

El dato presente en el pin de E/S se muestrea en el
registro de entrada cada ciclo de reloj del AHB.

La lectura del registro de entrada muestra el valor
del pin de E/S.

La lectura del registro de salida muestra el último
valor escrito.

18 / 28
Otros modos
● Los modos GPIO_MODE_EVT_* están relacionados a
los modos de bajo consumo o reposo (sleep).
Cuando el procesador está configurado para
trabajar en uno de éstos modos, el procesador
despertará (si se ha puesto en algún modo sleep) si
el correspondiente pin de E/S se activa, sin generar
la interrupción correspondiente.
● Los modos GPIO_MODE_IT_* se relacionan al
manejo de interrupciones (externas).

19 / 28

Configurar el modo
de un pin en
STM32CubeMX

20 / 28
Parámetro velocidad de GPIO
● El parámetro GPIO_InitTypeDef.Speed tiene
efecto solamente cuando el pin de E/S está
configurado como salida.

Este parámetro define el slew rate (velocidad de
subida) del GPIO, es decir, que tan rápido pasa de
un nivel de 0 a 1 (voltaje VDD), y vice versa.


Rojo – ideal

Verde - real

21 / 28
Parámetro velocidad de GPIO

Se debe tener en cuenta que mientras mayor la
velocidad de subida, mayor impacto en las
emisiones electromagnéticas (EMI) del sistema.
Normalmente se trata de mantener éstas emisiones
en valores lo más bajos posibles.

A menos que sea estrictamente necesario, se
recomienda que se mantenga la velocidad de GPIO
en su valor por defecto que es el nivel bajo.

22 / 28
Manejando el GPIO
La librería HAL provee cuatro rutinas para leer,
cambiar y bloquear el estado de un pin de E/S.
● GPIO_PinState
HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx,
uint16_t GPIO_Pin)
● void HAL_GPIO_WritePin(GPIO_TypeDef*
GPIOx, uint16_t GPIO_Pin, GPIO_PinState
PinState)
● void HAL_GPIO_TogglePin(GPIO_TypeDef*
GPIOx, uint16_t GPIO_Pin)
● HAL_StatusTypeDef
HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx,
uint16_t GPIO_Pin) 23 / 28
Manejando el GPIO

Ejemplo:
● int estado = HAL_GPIO_ReadPin(GPIOB,
GPIO_PIN_10);
● HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,
GPIO_PIN_SET);
● HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,
GPIO_PIN_RESET);
● HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
● HAL_GPIO_LockPin(GPIOC, GPIO_PIN_13);

24 / 28
Ejemplo

Leer el pin 10 del puerto B (PB10). Si es 1, poner la
salida (pin 11 del puerto B - PB11) en 0, y si la
lectura es 0, poner la salida en 1.

while (1)
{
int boton = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_10);
if (boton == 1)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET);
}

25 / 28
Ejemplo

Leer el pin PB10 y si tiene un valor de 1, parpadear
un LED en PB11 con un tiempo de 300 ms. Si la
entrada es 0, parpadear el LED a 100 ms.

while (1)
{
int boton = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_10);
if (boton == 1)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_11);
HAL_Delay(300);
}
else
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_11);
HAL_Delay(100);
}
26 / 28
De-inicialización de GPIO

Es posible poner el pin de E/S (GPIO) en su estado
inicial y por defecto (estado luego de reset). Para
eso se utiliza la función:
● void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx,
uint32_t GPIO_Pin)

El estado inicial es Input Floating Mode (entrada
flotante).

Se puede usar si ya no se necesita el periférico, o
para evitar una pérdida de energía cuando el
procesador se coloca en un estado de reposo
(sleep).
27 / 28
Práctica 1

Configurar el árbol de reloj para trabajar primero
con el HSI y luego con el HSE.

Configurar velocidades del sistema de 8 MHz y 16
MHz.

Leer el estado de un pin, si es 1, encender un LED
conectado a una salida, y si es 0, apagar el LED.

Conectar un LCD de 2x16 al microcontrolador y
mostrar dos mensajes, uno en cada fila.

28 / 28

También podría gustarte