Compartilhar via


Usar GPIOs em aplicativos de alto nível

O Azure Sphere dá suporte a GPIOs (entrada/saída de uso geral). Um GPIO é um tipo de pino digital programável em um circuito integrado. Os GPIOs não têm funcionalidade predefinida e seu comportamento pode ser personalizado por um aplicativo. Alguns usos comuns para GPIOs são alterar o estado dos dispositivos de hardware, controlar LEDs e ler o estado dos comutadores.

Nota

Este tópico descreve como usar GPIOs em um aplicativo de alto nível. Consulte Usar periféricos em um aplicativo com capacidade em tempo real para obter informações sobre o uso de GPIO em RTApps.

Aplicativos de alto nível do Azure Sphere podem se comunicar com GPIOs chamando APIs de GPIO do Applibs. O exemplo GPIO_HighLevelApp demonstra como se comunicar com GPIOs em um dispositivo MT3620.

As seguintes operações têm suporte para GPIO:

  • Leitura de entrada
  • Definir a saída como alta ou baixa
  • Interrupções de sondagem/software

Requisitos de GPIO

Os aplicativos que se comunicam com GPIOs devem incluir os arquivos de cabeçalho apropriados para GPIO e adicionar configurações de GPIO ao manifesto do aplicativo.

Todos os aplicativos devem definir seu hardware de destino e incluir o arquivo de cabeçalho de definição de hardware correspondente.

Arquivos de Cabeçalho

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

Substitua "path-to-your-target-hardware.h" pelo caminho para o arquivo de cabeçalho do hardware.

Configurações do manifesto do aplicativo

As configurações de GPIO no manifesto do aplicativo listam os GPIOs acessados pelo aplicativo. Somente um aplicativo pode usar um GPIO por vez. Para configurar essas configurações, adicione o Gpio recurso ao manifesto do aplicativo e adicione cada GPIO ao recurso. O manifesto do aplicativo Azure Sphere tem mais detalhes.

Em seu código, use as constantes definidas para seu hardware para identificar os GPIOs. O compilador traduzirá esses valores em valores brutos ao compilar o aplicativo.

Por exemplo, aqui está um trecho de um manifesto de aplicativo para um aplicativo que tem como destino um RDB (placa de desenvolvimento de referência) MT3620 e adquire três de seus GPIOs (1, 8 e 12):

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

O trecho a seguir mostra como especificar os mesmos GPIOs em um aplicativo que tem como destino o Kit inicial do Avnet MT3620:

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

Abrir um GPIO como entrada

Se você precisar ler de um GPIO, mas não gravar nele, poderá abri-lo como uma entrada. Chame GPIO_OpenAsInput para abrir um GPIO e defina-o como entrada. Isso recuperará um descritor de arquivo para operações no GPIO. Você pode ler de um GPIO enquanto ele está definido como entrada, mas não é possível gravar nele. Se um GPIO estiver definido como entrada, você deverá fechá-lo antes de defini-lo como saída.

Abrir um GPIO como saída

Se você precisar gravar em um GPIO, deverá abri-lo como uma saída. Chame GPIO_OpenAsOutput para abrir um GPIO e defina-o como saída. Isso recuperará um descritor de arquivo para operações no GPIO, definirá o modo de saída e o valor inicial. Quando um GPIO é definido como saída, você pode gravar e ler nele. Se um GPIO estiver definido como saída, você deverá fechá-lo antes de defini-lo como entrada.

Sondar um GPIO

Quando o GPIO estiver aberto, você pode monitorá-lo para eventos, como um botão pressionar. Para fazer isso, você precisa configurar um temporizador para sondar o GPIO. Interrupções de hardware para GPIOs não têm suporte no Azure Sphere, portanto, você precisa usar a sondagem. O exemplo de GPIO demonstra como sondar um GPIO.

Leitura de um GPIO

Para ler no GPIO, chame GPIO_GetValue.

Gravar em um GPIO

Para gravar em um GPIO, chame GPIO_SetValue.

Definir a força da unidade de um GPIO

A força da unidade de um pino GPIO refere-se à quantidade de corrente usada para conduzi-lo. Normalmente, essa quantidade de corrente é definida como um valor padrão. No entanto, alguns cenários, como LEDs mais brilhantes ou maior potência para sensores, exigem ajustar a força da unidade a determinados pinos GPIO.

Para definir a força da unidade, primeiro use a estrutura gpiopin_request para especificar a configuração de força da unidade para um ou mais pinos GPIO. Em seguida, passe gpiopin_request e GPIO_SET_PIN_CONFIG_IOCTL em uma chamada IOCTL.

O snippet de código a seguir demonstra como definir a força da unidade de dois pinos GPIO, que são especificados na lineoffsets matriz da gpiopin_request estrutura.

//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;
}

Fechar um GPIO

Para fechar o GPIO, chame a função POSIX de fechar().

Suporte a MT3620

Os recursos de GPIO com suporte para o chip MT3620 estão listados no Status de Suporte do MT3620. O guia de usuário do painel de desenvolvimento MT3620 descreve o layout do pino e as funções de fixação no RDB MT3620.

A pasta HardwareDefinitions no diretório de instalação do SDK do Microsoft Azure Sphere contém definições para placas de desenvolvimento comuns do Azure Sphere, módulos e chips. Ele contém arquivos de cabeçalho e JSON que definem as interfaces master para o MT3620, MT3620 RDB, juntamente com outros hardwares MT3620. O local padrão da pasta HardwareDefinitions está C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions no Windows e /opt/azurespheresdk/HardwareDefinitions no Linux.