Usar GPIOs en aplicaciones de alto nivel

Azure Sphere admite GPIOs (entrada/salida de uso general). Un GPIO es un tipo de pin digital programable en un circuito integrado. Los GPI No tienen funcionalidad predefinida y su comportamiento puede personalizarse mediante una aplicación. Algunos usos comunes de los GPI Son cambiar el estado de los dispositivos hardware, controlar los LED y leer el estado de los conmutadores.

Nota

En este tema se describe cómo usar los GPIOs en una aplicación de alto nivel. Consulta Usar periféricos en una aplicación compatible con tiempo real para obtener información sobre el uso de GPIO en RTApps.

Las aplicaciones de alto nivel de Azure Sphere pueden comunicarse con GPIOs llamando a las API de Applibs GPIO. La GPIO_HighLevelApp muestra cómo comunicarse con los OPI en un dispositivo MT3620.

Las siguientes operaciones son compatibles con GPIO:

  • Leer entrada
  • Establecer la salida en alta o baja
  • Interrupciones de sondeo o software

Requisitos de GPIO

Las aplicaciones que se comunican con GPIOs deben incluir los archivos de encabezado adecuados para GPIO y agregar la configuración de GPIO al manifiesto de la aplicación.

Todas las aplicaciones deben establecer su hardware de destino e incluir el archivo de encabezado de definición de hardware correspondiente.

Archivos de encabezado

 #include <applibs/gpio.h>
 #include "path-to-your-target-hardware.h"

Reemplace "path-to-your-target-hardware.h" por la ruta de acceso al archivo de encabezado del hardware.

Configuración de manifiesto de la aplicación

La configuración de GPIO en el manifiesto de la aplicación enumera los GPIOs a los que accede la aplicación. Solo una aplicación puede usar GPIO a la vez. Para configurar estas opciones, agregue la Gpio funcionalidad al manifiesto de la aplicación y, a continuación, agregue cada GPIO a la funcionalidad. El manifiesto de la aplicación Azure Sphere tiene más detalles.

En el código, usa las constantes que están definidas para el hardware para identificar los GPI. El compilador traducirá estos valores a valores RAW al crear la aplicación.

Por ejemplo, he aquí un extracto de un manifiesto de aplicación para una aplicación que se centra en un panel de desarrollo de referencia de MT3620 (RDB) y adquiere tres de sus GPIOs (1, 8 y 12):

"Gpio": [ "$MT3620_RDB_HEADER1_PIN6_GPIO", "$MT3620_RDB_LED1_RED", "$MT3620_RDB_BUTTON_A" ]

El siguiente extracto muestra cómo especificar los mismos GPIOs en una aplicación que tiene como destino el kit de inicio Avnet MT3620:

"Gpio": [ "$AVNET_MT3620_SK_GPIO1", "$AVNET_MT3620_SK_USER_LED_RED", "$AVNET_MT3620_SK_USER_BUTTON_A" ]

Abrir una GPIO como entrada

Si necesita leer desde un GPIO pero no escribir en él, puede abrirlo como entrada. Llama a GPIO_OpenAsInput para abrir un GPIO y configurarlo como entrada. Se recuperará un descriptor de archivo para las operaciones en GPIO. Puede leer desde un GPIO mientras está configurado como entrada, pero no puede escribir en él. Si un GPIO se establece en entrada, debe cerrarlo antes de poder establecerlo en salida.

Abrir un GPIO como salida

Si necesita escribir en un GPIO, debe abrirlo como salida. Llama a GPIO_OpenAsOutput para abrir un GPIO y configurarlo como de salida. Esto recuperará un descriptor de archivo para las operaciones en GPIO, establecerá el modo de salida y el valor inicial. Cuando un GPIO se establece en salida, puede escribir en él y leer desde él. Si un GPIO se establece en salida, debe cerrarlo antes de poder establecerlo en entrada.

Sondear una GPIO

Cuando GPIO está abierto, puede supervisarlo en busca de eventos, como presionar un botón. Para ello, debe configurar un temporizador para sondear el GPIO. Las interrupciones de hardware para los GPIOs no son compatibles con Azure Sphere, por lo que debe usar el sondeo. La muestra de GPIO muestra cómo sondear un GPIO.

Leer desde un GPIO

Para leer desde GPIO, llame a GPIO_GetValue.

Escribir en un GPIO

Para escribir en un GPIO, llama a GPIO_SetValue.

Establecer la potencia de conducción de un GPIO

La resistencia de la unidad de un pin de GPIO hace referencia a la cantidad de corriente usada para conducirlo. Normalmente, esta cantidad de corriente se establece en un valor predeterminado. Sin embargo, algunos escenarios, como ledes más brillantes o aumento de la potencia de los sensores, requieren el ajuste de la intensidad de la unidad a determinados pin de GPIO.

Para establecer la potencia de la unidad, usa primero la estructura de gpiopin_request para especificar la configuración de la potencia de la unidad para uno o más pin de GPIO. Después, pase gpiopin_request y GPIO_SET_PIN_CONFIG_IOCTL en una llamada IOCTL.

El siguiente fragmento de código muestra cómo establecer la potencia de la unidad de dos pines GPIO, que se especifican en la lineoffsets matriz de la gpiopin_request estructura.

//get chip file descriptor
int chipfd = __z_azsp_open("/dev/gpiochip0", O_CLOEXEC);

//set drive strength for the requested pins
struct gpiopin_request pinreq;
memset(&pinreq, 0, sizeof(pinreq));
pinreq.linecount = 2;
pinreq.lineoffsets[0] = SAMPLE_RGBLED_BLUE;
pinreq.lineoffsets[1] = SAMPLE_RGBLED_RED;
pinreq.config_type = PIN_CONFIG_DRIVE_STRENGTH;
pinreq.config_arg = 16;

result = ioctl(chipfd, GPIO_SET_PIN_CONFIG_IOCTL, &pinreq);
if (result < 0) {
    close(chipfd);
    return -1;
}

//do other work like setting pins as output
struct gpiohandle_request request;
memset(&request, 0, sizeof(request));
request.flags = GPIOHANDLE_REQUEST_OUTPUT;
request.lines = 2;
request.lineoffsets[0] = SAMPLE_RGBLED_BLUE;
request.lineoffsets[1] = SAMPLE_RGBLED_RED;
request.default_values[0] = 1;
request.default_values[1] = 1;

result = ioctl(chipfd, GPIO_GET_LINEHANDLE_IOCTL, &request);
if (result < 0) {
    close(chipfd);
    return -1;
}

Cerrar una GPIO

Para cerrar el GPIO, llame a la función POSIX close().

Compatibilidad con MT3620

Las características de GPIO compatibles con el chip MT3620 se enumeran en el estado de soporte técnico de MT3620. La guía de usuario del panel de desarrollo MT3620 describe las funciones de diseño y alfiler en el MT3620 RDB.

La carpeta HardwareDefinitions del directorio de instalación del SDK de Sphere de Microsoft Azure contiene definiciones para placas de desarrollo, módulos y chips comunes de Azure Sphere. Contiene archivos de encabezado y JSON que definen las interfaces maestras para el MT3620, MT3620 RDB, junto con otro hardware MT3620. La ubicación predeterminada para la carpeta HardwareDefinitions se encuentra C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions en Windows y /opt/azurespheresdk/HardwareDefinitions en Linux.