Partilhar via


Usar GPIOs em aplicativos de alto nível

Importante

Esta é a documentação do Azure Sphere (Legado). O Azure Sphere (Legado) será desativado em 27 de setembro de 2027 e os usuários devem migrar para o Azure Sphere (Integrado) até esse momento. Use o seletor de versão localizado acima do sumário para exibir a documentação do Azure Sphere (Integrado).

O Azure Sphere suporta 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 de dispositivos de hardware, LEDs de controle e ler o estado de switches.

Nota

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

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

As seguintes operações são suportadas para GPIO:

  • Ler entrada
  • Definir a saída como alta ou baixa
  • Sondagem / interrupções de software

Requisitos do 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 seu hardware.

Configurações de manifesto do aplicativo

As configurações de GPIO no manifesto do aplicativo listam os GPIOs que são acessados pelo aplicativo. Apenas um aplicativo pode usar um GPIO de cada vez. Para definir essas configurações, adicione o Gpio recurso ao manifesto do aplicativo e, em seguida, adicione cada GPIO ao recurso. O manifesto do aplicativo Azure Sphere tem mais detalhes.

No código, use as constantes definidas para o hardware para identificar os GPIOs. O compilador traduzirá esses valores em valores brutos quando você criar o aplicativo.

Por exemplo, aqui está um trecho de um manifesto de aplicativo para um aplicativo que tem como alvo uma placa de desenvolvimento de referência (RDB) 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 destinado ao Avnet MT3620 Starter Kit:

"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, você pode abri-lo como uma entrada. Chame GPIO_OpenAsInput para abrir um GPIO e defini-lo como entrada. Isso recuperará um descritor de arquivo para operações no GPIO. Você pode ler a partir de um GPIO enquanto ele está definido para entrada, mas não pode gravar nele. Se um GPIO estiver definido como entrada, você deverá fechá-lo antes de poder 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 defini-lo 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 nele e ler a partir dele. Se um GPIO estiver definido como saída, você deverá fechá-lo antes de poder defini-lo como entrada.

Sondar um GPIO

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

Ler a partir de um GPIO

Para ler a partir do GPIO, chame GPIO_GetValue.

Escrever para um GPIO

Para gravar em um GPIO, chame GPIO_SetValue.

Definir a força da unidade de um GPIO

A intensidade da unidade de um pino GPIO refere-se à quantidade de corrente usada para acioná-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 dos sensores, exigem o ajuste da força da unidade para determinados pinos GPIO.

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

O trecho 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 close().

Suporte MT3620

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

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

O repositório Azure Sphere Samples no GitHub contém arquivos de cabeçalho e JSON que definem interfaces mestras SPI para o chip MT3620 e RDB MT3620, juntamente com outro hardware MT3620.-->