Dela via


Använda GPIOs i program på hög nivå

Azure Sphere har stöd för GPIOs (allmänna indata/utdata). EN GPIO är en typ av programmerbar digital stift på en integrerad krets. GPIOs har inte fördefinierade funktioner och deras beteende kan anpassas av ett program. Några vanliga användningsområden för GPIOs är att ändra tillståndet för maskinvaruenheter, kontrollera lysdioder och läsa status för växlar.

Observera

I det här avsnittet beskrivs hur du använder GPIOs i ett program på hög nivå. Mer information om GPIO-användning i RTApps finns i Använda kringutrustning i ett program som kan användas i realtid .

Azure Sphere-program på hög nivå kan kommunicera med GPIOs genom att anropa Applibs GPIO-API:er. Det GPIO_HighLevelApp exemplet visar hur du kommunicerar med GPIOs på en MT3620-enhet.

Följande åtgärder stöds för GPIO:

  • Läsa indata
  • Ange hög eller låg utdata
  • Omröstningar/programvaruavbrott

GPIO-krav

Program som kommunicerar med GPIOs måste innehålla lämpliga huvudfiler för GPIO och lägga till GPIO-inställningar i programmanifestet.

Alla program måste ange målmaskinvara och inkludera motsvarande rubrikfil för maskinvarudefinition.

Rubrikfiler

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

Ersätt "path-to-your-target-hardware.h" med sökvägen till huvudfilen för maskinvaran.

Inställningar för programmanifest

GPIO-inställningarna i programmanifestet listar de GPIOs som programmet använder. Endast ett program kan använda en GPIO i taget. Om du vill konfigurera de här inställningarna lägger du till Gpio funktionen i programmanifestet och lägger sedan till varje GPIO i funktionen. Azure Sphere-programmanifestet innehåller mer information.

Använd konstanterna som har definierats för maskinvaran i koden för att identifiera GPIOs. Kompilatorn översätter dessa värden till raw-värden när du skapar appen.

Här är till exempel ett utdrag från ett programmanifest för ett program som riktar in sig på en MT3620-referensutvecklingstavla (RDB) och förvärvar tre av sina GPIOs (1, 8 och 12):

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

Följande utdrag visar hur du anger samma GPIOs i ett program som riktar sig till Avnet MT3620 Starter Kit:

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

Öppna en GPIO som indata

Om du behöver läsa från en GPIO men inte skriva till den kan du öppna den som en inmatning. Ring GPIO_OpenAsInput för att öppna en GPIO och ange att den ska matas in. Då hämtas en filbeskrivning för åtgärder på GPIO. Du kan läsa från en GPIO när den är inställd på indata, men du kan inte skriva till den. Om en GPIO är inställd på indata måste du stänga den innan du kan ställa in den på utdata.

Öppna en GPIO som utdata

Om du behöver skriva till en GPIO måste du öppna den som ett utdata. Ring GPIO_OpenAsOutput för att öppna en GPIO och ställa in den på utdata. Då hämtas en filbeskrivning för åtgärder på GPIO, ange utdataläge och det ursprungliga värdet. När en GPIO är inställd på utdata kan du skriva till den och läsa från den. Om en GPIO är inställd på utdata måste du stänga den innan du kan ställa in den på indata.

Omröstning med en GPIO

När GPIO är öppen kan du övervaka den för händelser, till exempel en knapptryckning. Om du vill göra det måste du ställa in en timer för att avsöka GPIO. Maskinvaruavbrott för GPIOs stöds inte på Azure Sphere, så du måste använda omröstningar. GPIO-exemplet visar hur du avsöker en GPIO.

Läsa från en GPIO

Ring GPIO_GetValue om du vill läsa från GPIO.

Skriva till en GPIO

Om du vill skriva till en GPIO ringer du GPIO_SetValue.

Ange enhetsstyrkan för en GPIO

Enhetsstyrkan för en GPIO-pin refererar till mängden ström som används för att köra den. Vanligtvis är den här mängden aktuell inställd på ett standardvärde. Vissa scenarier, till exempel ljusare lysdioder eller ökad ström till sensorer, kräver dock justering av enhetens styrka till vissa GPIO-stift.

Om du vill ange enhetens hållfasthet använder du först gpiopin_request-strukturen för att ange enhetens hållfasthetskonfiguration för en eller flera GPIO-stift. Vidare skickar gpiopin_request du och GPIO_SET_PIN_CONFIG_IOCTL i ett IOCTL-samtal.

Följande kodavsnitt visar hur du anger enhetsstyrkan för två GPIO-stift, som anges i lineoffsets strukturens gpiopin_request matris.

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

Stänga en GPIO

Stäng GPIO genom att anropa POSIX-funktionen close().

MT3620-support

GPIO-funktioner som stöds för MT3620-kretsen visas i MT3620-supportstatus. Användarhandboken för utvecklingstavlan för MT3620 beskriver pin-layouten och fästfunktionerna på MT3620 RDB.

Mappen HardwareDefinitions i installationskatalogen Microsoft Azure Sphere SDK innehåller definitioner för vanliga azure sphere-utvecklingstavlor, moduler och kretsar. Den innehåller rubrik- och JSON-filer som definierar huvudgränssnitten för MT3620, MT3620 RDB, tillsammans med annan MT3620-maskinvara. Standardplatsen för mappen HardwareDefinitions är C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions i Windows och /opt/azurespheresdk/HardwareDefinitions linux.