Partilhar via


Utilizar GPIOs em aplicações de alto nível

O Azure Sphere suporta GPIOs (entrada/saída para fins gerais). Um GPIO é um tipo de pin digital programável num circuito integrado. Os GPIOs não têm uma funcionalidade predefinida e o respetivo comportamento pode ser personalizado por uma aplicação. Algumas utilizações comuns para GPIOs são para alterar o estado dos dispositivos de hardware, controlar os LEDs e ler o estado dos comutadores.

Nota

Este tópico descreve como utilizar GPIOs numa aplicação de alto nível. Veja Utilizar periféricos numa aplicação com capacidade em tempo real para obter informações sobre a utilização do GPIO no RTApps.

As aplicações de alto nível do Azure Sphere podem comunicar com GPIOs ao chamar APIs GPIO do Applibs. O exemplo de GPIO_HighLevelApp demonstra como comunicar com GPIOs num dispositivo MT3620.

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

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

Requisitos de GPIO

As aplicações que comunicam com GPIOs têm de incluir os ficheiros de cabeçalho adequados para GPIO e adicionar definições GPIO ao manifesto da aplicação.

Todas as aplicações têm de definir o hardware de destino e incluir o ficheiro de cabeçalho de definição de hardware correspondente.

Ficheiros 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 ficheiro de cabeçalho do hardware.

Definições do manifesto da aplicação

As definições de GPIO no manifesto da aplicação listam os GPIOs que são acedidos pela aplicação. Apenas uma aplicação pode utilizar um GPIO de cada vez. Para configurar estas definições, adicione a Gpio capacidade ao manifesto da aplicação e, em seguida, adicione cada GPIO à capacidade. O manifesto da aplicação do Azure Sphere tem mais detalhes.

No código, utilize as constantes definidas para o hardware para identificar os GPIOs. O compilador irá traduzir estes valores para valores não processados quando criar a aplicação.

Por exemplo, eis um excerto de um manifesto de aplicação para uma aplicação que visa um quadro de desenvolvimento de referência (RDB) MT3620 e adquire três dos seus GPIOs (1, 8 e 12):

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

O seguinte excerto mostra como especificar os mesmos GPIOs numa aplicação que tem como destino o 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 precisar de ler a partir de um GPIO, mas não escrever, pode abri-lo como uma entrada. Chame GPIO_OpenAsInput para abrir um GPIO e defina-o como entrada. Esta ação irá obter um descritor de ficheiros para operações no GPIO. Pode ler a partir de um GPIO enquanto está definido como entrada, mas não pode escrever no mesmo. Se um GPIO estiver definido como entrada, tem de fechá-lo antes de poder defini-lo como saída.

Abrir um GPIO como saída

Se precisar de escrever num GPIO, tem de abri-lo como uma saída. Chame GPIO_OpenAsOutput para abrir um GPIO e defina-o como saída. Esta ação irá obter um descritor de ficheiros para operações no GPIO, definir o modo de saída e o valor inicial. Quando um GPIO está definido como saída, pode escrever no mesmo e ler a partir do mesmo. Se um GPIO estiver definido como saída, tem de fechá-lo antes de o poder definir como entrada.

Consultar um GPIO

Quando o GPIO estiver aberto, pode monitorizá-lo para eventos, como premir um botão. Para tal, tem de configurar um temporizador para consultar o GPIO. As interrupções de hardware para GPIOs não são suportadas no Azure Sphere, pelo que tem de utilizar a consulta. O exemplo gpIO demonstra como consultar um GPIO.

Ler a partir de um GPIO

Para ler a partir do GPIO, chame GPIO_GetValue.

Escrever num GPIO

Para escrever num 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 utilizada para o conduzir. Normalmente, esta quantidade de atual está definida para um valor predefinido. No entanto, alguns cenários, como LEDs mais brilhantes ou maior potência para sensores, requerem a otimização da força da unidade para determinados pinos GPIO.

Para definir a força da unidade, utilize primeiro 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 numa chamada IOCTL.

O fragmento de código seguinte 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 de MT3620

As funcionalidades de GPIO suportadas para o chip MT3620 estão listadas no Estado de Suporte do MT3620. O guia do utilizador do quadro de desenvolvimento MT3620 descreve as funções de esquema de afixar e afixar no RDB MT3620.

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