Share via


Verwenden von GPIOs in allgemeinen Anwendungen

Azure Sphere unterstützt GPIOs (allgemeine Eingabe/Ausgabe). Eine GPIO ist eine Art programmierbarer digitaler Pin an einer integrierten Schaltung. GPIOs verfügen nicht über vordefinierte Funktionen, und ihr Verhalten kann von einer Anwendung angepasst werden. GPIOs werden häufig verwendet, um den Zustand von Hardwaregeräten zu ändern, LEDs zu steuern und den Zustand von Switches zu lesen.

Hinweis

In diesem Thema wird beschrieben, wie GPIOs in einer allgemeinen Anwendung verwendet werden. Informationen zur Verwendung von GPIO in RTApps finden Sie unter Verwenden von Peripheriegeräten in einer Echtzeitanwendung .

Allgemeine Azure Sphere-Anwendungen können mit GPIOs kommunizieren, indem sie Applibs-GPIO-APIs aufrufen. Das GPIO_HighLevelApp Beispiel veranschaulicht die Kommunikation mit GPIOs auf einem MT3620-Gerät.

Die folgenden Vorgänge werden für GPIO unterstützt:

  • Eingabe lesen
  • Festlegen der Ausgabe auf "Hoch" oder "Niedrig"
  • Abrufe/Softwareunterbrechungen

GPIO-Anforderungen

Anwendungen, die mit GPIOs kommunizieren, müssen die entsprechenden Headerdateien für GPIO enthalten und dem Anwendungsmanifest GPIO-Einstellungen hinzufügen.

Alle Anwendungen müssen ihre Zielhardware festlegen und die entsprechende Hardwaredefinitionsheaderdatei enthalten.

Headerdateien

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

Ersetzen Sie "path-to-your-target-hardware.h" durch den Pfad zur Headerdatei für Ihre Hardware.

Anwendungsmanifesteinstellungen

Die GPIO-Einstellungen im Anwendungsmanifest listen die GPIOs auf, auf die die Anwendung zugreift. Eine GPIO kann jeweils nur von einer Anwendung verwendet werden. Um diese Einstellungen zu konfigurieren, fügen Sie die Gpio Funktion dem Anwendungsmanifest hinzu, und fügen Sie dann jede GPIO der Funktion hinzu. Das Azure Sphere-Anwendungsmanifest enthält weitere Details.

Verwenden Sie in Ihrem Code die Konstanten, die für Ihre Hardware definiert sind, um die GPIOs zu identifizieren. Der Compiler übersetzt diese Werte beim Erstellen der App in Rohwerte.

Hier ist beispielsweise ein Auszug aus einem Anwendungsmanifest für eine Anwendung, die auf ein MT3620 Reference Development Board (RDB) ausgerichtet ist und drei seiner GPIOs (1, 8 und 12) abruft:

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

Der folgende Auszug zeigt, wie Sie die gleichen GPIOs in einer Anwendung angeben, die auf das Avnet MT3620 Starter Kit ausgerichtet ist:

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

Öffnen einer GPIO als Eingabe

Wenn Sie aus einer GPIO lesen, aber nicht schreiben müssen, können Sie sie als Eingabe öffnen. Rufen Sie GPIO_OpenAsInput auf, um eine GPIO zu öffnen und auf eingabe festzulegen. Dadurch wird ein Dateideskriptor für Vorgänge in der GPIO abgerufen. Sie können aus einer GPIO lesen, während sie auf Eingabe festgelegt ist, aber Sie können nicht in sie schreiben. Wenn eine GPIO auf eingabe festgelegt ist, müssen Sie sie schließen , bevor Sie die Ausgabe festlegen können.

Öffnen einer GPIO als Ausgabe

Wenn Sie in eine GPIO schreiben müssen, müssen Sie sie als Ausgabe öffnen. Rufen Sie GPIO_OpenAsOutput auf, um eine GPIO zu öffnen und auf ausgabe festzulegen. Dadurch wird ein Dateideskriptor für Vorgänge auf der GPIO abgerufen, der Ausgabemodus und der Anfangswert festgelegt. Wenn eine GPIO auf ausgabe festgelegt ist, können Sie darin schreiben und daraus lesen. Wenn eine GPIO auf ausgabe festgelegt ist, müssen Sie sie schließen , bevor Sie sie auf eingabe festlegen können.

Abfragen einer GPIO

Wenn die GPIO geöffnet ist, können Sie sie auf Ereignisse überwachen, z. B. ein Drücken einer Schaltfläche. Dazu müssen Sie einen Timer einrichten, um die GPIO abzufragen. Hardwareunterbrechungen für GPIOs werden in Azure Sphere nicht unterstützt, daher müssen Sie Abrufe verwenden. Im GPIO-Beispiel wird veranschaulicht, wie eine GPIO abgerufen wird.

Lesen aus einer GPIO

Um aus der GPIO zu lesen, rufen Sie GPIO_GetValue auf.

Schreiben in eine GPIO

Um in eine GPIO zu schreiben, rufen Sie GPIO_SetValue auf.

Festlegen der Laufwerkstärke einer GPIO

Die Laufwerkstärke eines GPIO-Pins bezieht sich auf die Strommenge, die zum Steuern des Pins verwendet wird. In der Regel wird diese aktuelle Menge auf einen Standardwert festgelegt. Einige Szenarien, z. B. hellere LEDs oder eine höhere Leistung von Sensoren, erfordern jedoch die Optimierung der Laufwerkstärke auf bestimmte GPIO-Pins.

Um die Laufwerkstärke festzulegen, verwenden Sie zunächst die gpiopin_request-Struktur , um die Konfiguration der Laufwerkstärke für einen oder mehrere GPIO-Pins anzugeben. Übergeben gpiopin_request Sie als Nächstes einen IOCTL-Aufruf und GPIO_SET_PIN_CONFIG_IOCTL .

Der folgende Codeausschnitt veranschaulicht, wie die Laufwerkstärke von zwei GPIO-Pins festgelegt wird, die lineoffsets im Array der gpiopin_request -Struktur angegeben sind.

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

Schließen einer GPIO

Rufen Sie zum Schließen der GPIO die POSIX-Funktion close() auf.

MT3620-Unterstützung

Die unterstützten GPIO-Features für den MT3620-Chip sind im MT3620-Supportstatus aufgeführt. Im Benutzerhandbuch des MT3620-Entwicklungsboards werden das Pinlayout und die Pinfunktionen des MT3620 RDB beschrieben.

Der Ordner HardwareDefinitions im Installationsverzeichnis des Microsoft Azure Sphere SDK enthält Definitionen für allgemeine Azure Sphere-Entwicklungsboards, -Module und -Chips. Sie enthält Header- und JSON-Dateien, die die master Schnittstellen für mt3620, MT3620 RDB und andere MT3620-Hardware definieren. Der Standardspeicherort für den Ordner HardwareDefinitions ist C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions unter Windows und /opt/azurespheresdk/HardwareDefinitions unter Linux.

Das Repository mit den Azure Sphere-Beispielen auf GitHub enthält Header- und JSON-Dateien, die SPI master Schnittstellen für den MT3620-Chip und MT3620 RDB sowie andere MT3620-Hardware definieren.>