Condividi tramite


Uso di GPIO in applicazioni di alto livello

Importante

Questa è la documentazione di Azure Sphere (legacy). Azure Sphere (legacy) viene ritirato il 27 settembre 2027 e gli utenti devono eseguire la migrazione ad Azure Sphere (integrato) entro questo periodo. Usare il selettore di versione posizionato sopra il sommario per visualizzare la documentazione di Azure Sphere (integrata).

Azure Sphere supporta i GPIO (General-Purpose Input/Output). Un GPIO è un tipo di pin digitale programmabile su un circuito integrato. I GPIO non hanno funzionalità predefinite e il loro comportamento può essere personalizzato da un'applicazione. I GPIO vengono comunemente usati, ad esempio, per cambiare lo stato dei dispositivi hardware, controllare i LED e leggere lo stato degli switch.

Nota

Questo argomento descrive come usare i GPIO in un'applicazione di alto livello. Per informazioni sull'uso di GPIO in RTApps, vedere Usare periferiche in un'applicazione con funzionalità in tempo reale.

Le applicazioni Azure Sphere di alto livello possono comunicare con i GPIO chiamando le API GPIO di Applibs. L'esempio GPIO_HighLevelApp illustra come comunicare con i GPIO in un dispositivo MT3620.

Per GPIO sono supportate le operazioni seguenti:

  • Leggere input
  • Impostare l'output su alto o basso
  • Eseguire polling/interrupt software

Requisiti di GPIO

Le applicazioni che comunicano con GPIO devono includere i file di intestazione appropriati per GPIO e aggiungere le impostazioni di GPIO al manifesto dell'applicazione.

Tutte le applicazioni devono impostare il relativo hardware di destinazione e includere il corrispondente file di intestazione di definizione dell'hardware.

File di intestazione

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

Sostituire "path-to-your-target-hardware.h" con il percorso del file di intestazione dell'hardware in uso.

Impostazioni del manifesto dell'applicazione

Le impostazioni di GPIO nel manifesto dell'applicazione includono i GPIO accessibili dall'applicazione. Ogni GPIO può essere usato da una sola applicazione alla volta. Per configurare queste impostazioni, aggiungere la funzionalità Gpio al manifesto dell'applicazione e quindi aggiungere ogni GPIO a tale funzionalità. Il manifesto dell'applicazione Azure Sphere include altri dettagli.

Nel codice usare le costanti definite per l'hardware in uso per identificare i GPIO. Il compilatore convertirà questi valori in valori non elaborati quando si compila l'app.

Ad esempio, di seguito è riportato un estratto di un manifesto dell'applicazione che ha come destinazione una scheda di sviluppo di riferimento (Reference Development Board, RDB) MT3620 e acquisisce tre dei relativi GPIO (1, 8 e 12):

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

Nell'estratto seguente viene illustrato come specificare gli stessi GPIO in un'applicazione che ha come destinazione Avnet MT3620 Starter Kit:

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

Aprire un GPIO come input

Se è necessario eseguire solo operazioni di lettura, ma non di scrittura, sul GPIO, è possibile aprirlo come input. Chiamare GPIO_OpenAsInput per aprire un GPIO e impostarlo su input. Verrà recuperato un descrittore di file per le operazioni sul GPIO. Quando un GPIO è impostato su input, è possibile eseguire operazioni di lettura, ma non di scrittura. Se un GPIO è impostato su input, è necessario chiuderlo prima di poterlo impostare su output.

Aprire un GPIO come output

Se è necessario eseguire operazioni di scrittura in un GPIO, aprirlo come output. Chiamare GPIO_OpenAsOutput per aprire un GPIO e impostarlo su output. Verrà recuperato un descrittore di file per le operazioni sul GPIO e verrà impostata la modalità di output con il valore iniziale. Quando un GPIO è impostato su output, è possibile eseguire operazioni di scrittura e di lettura. Se un GPIO è impostato su output, è necessario chiuderlo prima di poterlo impostare su input.

Eseguire il polling di un GPIO

Quando il GPIO è aperto, è possibile monitorarlo per rilevare eventi, ad esempio la pressione di un pulsante. A questo scopo, è necessario configurare un timer per eseguire il polling del GPIO. Gli interrupt hardware per i GPIO non sono supportati in Azure Sphere, quindi è necessario usare il polling. L'esempio di GPIO dimostra come eseguire il polling di un GPIO.

Leggere da un GPIO

Per leggere dal GPIO, chiamare GPIO_GetValue.

Scrivere in un GPIO

Per scrivere in un GPIO, chiamare GPIO_GetValue.

Impostare la forza dell'unità di un GPIO

Il livello di forza dell'unità di un pin GPIO si riferisce alla quantità di corrente usata per guidarla. In genere, questa quantità di corrente è impostata su un valore predefinito. Tuttavia, alcuni scenari, ad esempio LED più luminosi o maggiore potenza ai sensori, richiedono l'ottimizzazione della forza dell'unità a determinati pin GPIO.

Per impostare il livello di forza dell'unità, usare prima di tutto la struttura gpiopin_request per specificare la configurazione della forza dell'unità per uno o più pin GPIO. gpiopin_request Passare quindi e GPIO_SET_PIN_CONFIG_IOCTL in una chiamata IOCTL.

Il frammento di codice seguente illustra come impostare il livello di forza dell'unità di due pin GPIO, specificati nella lineoffsets matrice della gpiopin_request struttura.

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

Chiudere un GPIO

Per chiudere il GPIO, chiamare la funzione POSIX close().

Supporto di MT3620

Le funzionalità di GPIO supportate per il chip MT3620 sono elencate in MT3620: stato del supporto. Il manuale utente della scheda di sviluppo MT3620 descrive il layout e le funzioni dei pin sulla scheda di sviluppo di riferimento MT3620.

La cartella HardwareDefinitions nella directory di installazione di Microsoft Azure Sphere SDK contiene definizioni per schede di sviluppo, moduli e chip di Azure Sphere comuni. Contiene file di intestazione e JSON che definiscono le interfacce master per MT3620, MT3620 RDB, insieme ad altri hardware MT3620. Il percorso predefinito per la cartella HardwareDefinitions si trova C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions in Windows e /opt/azurespheresdk/HardwareDefinitions in Linux.

Il repository di esempi di Azure Sphere in GitHub contiene file di intestazione e JSON che definiscono interfacce master SPI per il chip MT3620 e MT3620 RDB, insieme ad altri hardware MT3620.>