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.>