ARQUITECTURA INTERNA DE UN PIN DE E/S
ARQUITECTURA INTERNA DE UN PIN DE E/S
OPERACIÓN EN ENTRADA DIGITAL
El buffer de la salida queda deshabilitado.
El bus de entrada analógica queda deshabilitado.
El buffer Scmitt trigger es activada y las resistencias de pull-up y pull-down
pueden ser activadas dependiendo del tipo de conexión de la entrada.
El dato entrante en el pin de E/S es muestreado en el registro de entrada de dato cada ciclo
de reloj del AHB y este valor puede ser leído de este registro.
ARQUITECTURA INTERNA DE UN PIN DE E/S
OPERACIÓN EN ENTRADA ANALÓGICA
El buffer de la salida queda deshabilitado.
La entrada Schmitt Trigger es desactivada, y se fuerza un
Nota: En configuración
valor de “0” en su la salida.
analógica el GPIO
Las resistencias de pull-up y pull-down quedan deshabilitadas puede soportar un
La lectura del registro de entrada de dato da el valor cero. máximo de 3.3v.
ARQUITECTURA INTERNA DE UN PIN DE E/S
OPERACIÓN EN SALIDA El bus de entrada analógica queda deshabilitado.
El buffer Scmitt trigger es activada y las
resistencias de pull-up y pull-down pueden ser
activadas.
El ultimo dato escrito en el pin de E/S es
muestreado en el registro de entrada de dato
cada ciclo de reloj del AHB y este valor puede ser
leído de este registro.
ARQUITECTURA INTERNA DE UN PIN DE E/S
OPERACIÓN EN SALIDA PUSH-PULL
1
ARQUITECTURA INTERNA DE UN PIN DE E/S
OPERACIÓN EN SALIDA PUSH-PULL
0
ARQUITECTURA INTERNA DE UN PIN DE E/S
OPERACIÓN EN SALIDA DRENADOR ABIERTO El transistor P-MOS
desaparece
Alta impedancia
1
ARQUITECTURA INTERNA DE UN PIN DE E/S
OPERACIÓN EN SALIDA DRENADOR ABIERTO El transistor P-MOS
desaparece
0
Operaciones GPIO en STM32 usando STM32CubeIDE
Generando el archivo config. archivos de STM32CubeMX.
1. Inicie el STM32CubeIDE y abra un nuevo proyecto.
2. Seleccione el Núcleo
8. Ingrese un nombre de proyecto
4. Configure el RCC (HSE y LSE) en Resonador de cristal / cerámica
Operaciones GPIO en STM32 usando STM32CubeIDE
Se desplegará la ventana para crear el
proyecto
1. Click sobre Pin que se desea
configurar. En este caso
seleccionamos el PC13.
2. Seleccionamos el modo en el cual va a
trabajar el Pin. En este caso seleccionamos
GPIO_Output.
Operaciones GPIO en STM32 usando STM32CubeIDE
1. Desplegamos la ventana de
Modo y Configuración del GPIO
2. Terminamos de configurar el Pin en
función a los requisitos del proyecto
Operaciones GPIO en STM32 usando HAL
Para realizar la configuración del periférico es necesario usar la función:
HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
GPIO_InitTypeDef
Es una estructura en C
typedef struct
{
uint32_t Pin; /*!< Específica los pines GPIO que Deben ser configuradas*/
uint32_t Mode; /*!< Específica el modo de operación de los pines seleccionados*/
uint32_t Pull; /*!< Específica la activación de los Pull-up o Pull-Down de los
/* pines seleccionados.*/
uint32_t Speed; /*!< Específica la velocidad de los pines seleccionados*/
} GPIO_InitTypeDef;
Operaciones GPIO en STM32 usando HAL
La estructura consta de 4 valores que se pueden configurar.
typedef struct
{
• PIN:
uint32_t Pin; Se refiere a los pines que se configuraran:
uint32_t Mode;
uint32_t Pull; [Link]. GPIO_PIN_13
uint32_t Speed;
los números van del 0 al 15 o GPIO_PIN_ALL (para
} GPIO_InitTypeDef; configurar todos los pines de un puerto) .
Se pueden configurar varios pines al mismo tiempo:
[Link]. GPIO_PIN_4 |GPIO_PIN_3 |GPIO_PIN_2
Operaciones GPIO en STM32 usando HAL
• MODE: Se refiere al modo de operación del pin:
typedef struct GPIO_MODE_INPUT Entrada flotante
GPIO_MODE_OUTPUT_PP Modo salida Push Pull
{ GPIO_MODE_OUTPUT_OD Modo salida drenador abierto
uint32_t Pin;
uint32_t Mode; GPIO_MODE_AF_PP Modo función Alterna Push Pull
uint32_t Pull; GPIO_MODE_AF_OD Modo función Alterna Drenador Abierto
uint32_t Speed; GPIO_MODE_AF_INPUT Modo función Alterna de Entrada
GPIO_MODE_ANALOG Modo Análogo
} GPIO_InitTypeDef;
GPIO_MODE_IT_RISING Modo Interrupción Externa con Detección de Flanco de
Subida
GPIO_MODE_IT_FALLING Modo Interrupción Externa con Detección de Flanco de
Bajada
GPIO_MODE_IT_RISING_FALLING Modo Interrupción Externa con Detección de Flanco
de Subida/Bajada
GPIO_MODE_EVT_RISING Modo Evento Externo con Detección de Flanco de Subida
GPIO_MODE_EVT_FALLING Modo Evento Externo con Detección de Flanco de Bajada
GPIO_MODE_EVT_RISING_FALLING Modo Evento Externo con Detección de Flanco
de Subida/bajada
Operaciones GPIO en STM32 usando HAL
• PULL:
typedef struct
Específica la activación de los Pull-up o Pull-Down
{
uint32_t Pin;
de los pines seleccionados:
uint32_t Mode;
uint32_t Pull; GPIO_NOPULL No existe activación Pull-up ni Pull-down
uint32_t Speed;
GPIO_PULLUP Activación Pull-up
} GPIO_InitTypeDef;
GPIO_PULLDOWN Activación Pull-down
Operaciones GPIO en STM32 usando HAL
• SPEED:
Específica la rapidez del cambio de nivel desde un valor igual a
typedef struct
{ 0V hasta VDD, y tiene efecto solamente cuando el pin de E/S
uint32_t Pin;
uint32_t Mode; está configurado como salida.
uint32_t Pull;
uint32_t Speed; GPIO_SPEED_FREQ_LOW Velocidad Lenta
} GPIO_InitTypeDef; GPIO_SPEED_FREQ_MEDIUM Velocidad Media
ideal real GPIO_SPEED_FREQ_HIGH Velocidad Alta
Se recomienda que se mantenga la velocidad de GPIO en
nivel bajo, debido a que la velocidad de subida es
directamente proporcional al ruido electromagnético.
Operaciones GPIO en STM32 usando HAL
La librería HAL brinda cinco rutinas de manipulación para la lectura, escritura, cambio y
bloqueo.
1. FUNCIÓN DE LECTURA
HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
Descripción de la función: Lee el pin del Puerto especificado.
Parametros:
• GPIOx: Donde x puede ser (A..G dependiendo del dispositivo usado) un periferico GPIO Seleccionado
• GPIO_Pin: Especifíca el bit del Puerto leido. Este parametro puede ser el GPIO_PIN_x donde x puede
ser (0..15).
Valores de retorno:
• Valor del Puerto de entrada.
Operaciones GPIO en STM32 usando HAL
2. FUNCIÓN DE LECTURA
Ejemplo:
int valor = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_14);
Leyendo una entrada GPIO dentro del programa
El estado actual de una entrada se puede leer desde su registro GPIOx_IDR (registro de datos
de entrada). Esto funciona mejor con el enmascaramiento de bits.
int valor = GPIOC -> IDR & GPIO_PIN_14;
Operaciones GPIO en STM32 usando HAL
2. FUNCIÓN DE ESCRITURA
HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
Descripción de la Función: Pone 1 o 0 lógicos en el bit seleccionado.
Parametros:
• GPIOx: donde x puede ser (A..G dependiendo del dispositivo usado) el periferico GPIO seleccionado
• GPIO_Pin: especifíca el Puerto a ser escrito. Este parametron puede ser uno de GPIO_PIN_x donde x
puede ser (0..15).
• PinState: especifíca el valor a ser escrito en el bit seleccionado. Este parametro puede ser uno de los
GPIO_PinState valores enumerados:
GPIO_BIT_RESET: pone a 0 el pin del Puerto
GPIO_BIT_SET: pone a 1 el pin del Puerto
Valores de retorno: ninguno.
Operaciones GPIO en STM32 usando HAL
2. FUNCIÓN DE ESCRITURA
Ejemplos:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET);
Usando una salida GPIO dentro del programa
Los cambios del estado de salida de un pin de salida se escriben en el Registro GPIOx_ODR
(Registro de datos de salida). Nuevamente, esto funciona mejor con enmascaramiento.
GPIOB -> ODR |= GPIO_PIN_10;
GPIOC -> ODR &= ~GPIO_PIN_12;
Operaciones GPIO en STM32 usando HAL
3. FUNCIÓN DE CAMBIO
void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
Descripción de la Función: Invierte el valor del pin GPIO seleccionado.
Parametros:
• GPIOx: donde x puede ser (A..G dependiendo del dispsitivo usado) un periférico GPIO seleccionado
• GPIO_Pin: Especifíca el pin a ser invertido.
Valores de retorno: ninguno.
Ejemplo:
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_10);
Usando una salida GPIO dentro del programa
GPIOA -> ODR ^= GPIO_PIN_11;
Operaciones GPIO en STM32 usando HAL
4. FUNCIÓN DE BLOQUEO
HAL_StatusTypeDef HAL_GPIO_LockPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
Descripción de la Función: Bloquea los registros de configuración de los pines GPIO.
Parametros
• GPIOx: donde x puede ser(A..G dependiendo al dispositivo usado) el periférico de GPIO seleccionado.
• GPIO_Pin: especifíca el pin del Puerto ser bloqueado. Este parametro puede ser cualquier combinacion
de los pines GPIO_Pin_x donde x puede ser (0..15).
Valores de retorno: ninguno.
Ejemplo:
HAL_GPIO_LockPin(GPIOA, GPIO_PIN_11);
Operaciones GPIO en STM32 usando HAL
5. FUNCIÓN PARA CONFIGURACIÓN POR DEFECTO
HAL_GPIO_DeInt (GPIO_TypeDef * GPIOx, uint32_t GPIO_Pin)
Descripción de la Función: Deshabilita cualquier configuracion previa del modulo GPIO.
Parametros
• GPIOx: donde x puede ser(A..G dependiendo al dispositivo usado) el periférico de GPIO seleccionado.
• GPIO_Pin: especifíca el pin del Puerto ser bloqueado. Este parametro puede ser cualquier combinacion
de los pines GPIO_Pin_x donde x puede ser (0..15).
Valores de retorno: ningunoó
Ejemplo:
HAL_GPIO_DeInt(GPIOC, GPIO_PIN_11);
Operaciones GPIO en STM32 usando HAL
Para comprender la configuración de este periférico, desarrollaremos el
siguiente programa:
Escribir un programa en el cual dos leds conectados a dos pines intercambian el
parpadeo cada 0,5 segundos. Pero, si se mantiene presionado un pulsador conectado a
un tercer pin, el intercambio del parpadeo será cada 0,1segundos.
Operaciones GPIO en STM32 usando HAL
Solución: void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
Configuración de los __HAL_RCC_GPIOB_CLK_ENABLE();
pines: Se usará el puerto GPIO_InitStruct.Pin = GPIO_PIN_12;
B. El pin12 será configurado GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
como entrada con pull-up HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
habilitado, y los pines 13 y GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
14 como salidas. GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13|GPIO_PIN_14, GPIO_PIN_RESET);
}
Operaciones GPIO en STM32 usando HAL
while (1)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)==0)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_Delay(100);
}
else {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_Delay(500);
}
}