Freigeben über


Verwenden externer Interrupts in Echtzeitanwendungen

Azure Sphere unterstützt die Verwendung externer Interrupts in RTApps für mt3620. Auf den MT3620-Echtzeitkernen verwenden solche Interrupts gpio nicht direkt; stattdessen werden sie unabhängig von GPIO verkabelt. Eine RTApp kann einen externen Interrupt so konfigurieren, dass sie ein Signal an einem externen Pin erkennen und darauf reagieren kann.

Informationen zu den Echtzeitkernen auf dem MT3620 finden Sie im MT3620 M4-Benutzerhandbuch . Weitere Informationen zu Registrierungsbasisadressen, Interruptnummern und ähnlichen Details erhalten Sie, indem Sie das "MT3620 M4 Datenblatt" von Avnet per E-Mail anfordern Azure.Sphere@avnet.com.

Anforderungen an externe Unterbrechungen

So verwenden Sie einen externen Interrupt in einer RTApp auf dem MT3620:

  • Fordern Sie den Interrupt in der Datei app_manifest.json an.
  • Schreiben Sie einen Interrupthandler, der auf das Signal reagiert.
  • Initialisieren, konfigurieren und aktivieren Sie die Interruptfunktion.

Anwendungsmanifesteinstellungen

Um einen externen Interrupt verwenden zu können, muss eine RTApp diesen im Feld "ExternalInterrupt" des Abschnitts Funktionen des Anwendungsmanifests auflisten. Identifizieren Sie den Interrupt durch eine Zeichenfolge von EINT0 bis EINT23. Die folgende Zeile gibt beispielsweise den externen Interrupt 8 an:

   "Capabilities": {
    "ExternalInterrupt": [ "EINT8"]
  }

Externe Interrupts werden auf die gleiche Weise wie andere Peripheriegeräte mit GPIO gemultixt, und es gelten die gleichen Regeln für Multiplexing. Ihre RTApp kann ein beliebiges EINT verwenden, vorausgesetzt, dass keine andere Anwendung (entweder allgemeine Anwendung oder RTApp) auf dem Gerät ein Peripheriegerät verwendet, das demselben Block zugeordnet ist. Informationen zum Multiplexen von Peripherieschnittstellen finden Sie unter E/A-Peripheriegeräte .

Wenn Ihr Azure Sphere-Anwendungsszenario auch einen Ethernet-Schutz umfasst, ist EINT4-EINT7 für die RTApp nicht verfügbar, da der Schutz GPIO 5 (das EINT5 zugeordnet ist) in einer allgemeinen App verwendet und somit alle anderen Pins innerhalb dieses Blocks reserviert werden.

Interrupthandler

Ihr Interrupthandler muss den gleichen Namen wie der angeforderte Interrupt in der Vektortabelle für den M4 haben. In den Codethink Labs MT3620 M4-Treiberbeispielen auf GitHub finden Sie Beispieldateien für VectorTable.h und VectorTable.c.

In der Beispieldatei VectorTable.c stellt der folgende Eintrag in der Vektortabelle EINT8 dar, d. h. Pin 0 in Block 3:

[INT(28)] = gpio_g2_irq0,

Der entsprechende Interrupthandler im Beispiel ist gpio_g2_irq0:

void gpio_g2_irq0(void)
{
    UART_Print(debug, "Interrupt handled.\r\n");
}

In der Vektortabelle für Ihre eigene Anwendung können Sie den Interrupthandler beliebig benennen.

Initialisieren, Konfigurieren und Aktivieren des Interrupts

Fügen Sie in der Standard()-Funktion Ihrer RTApp Code zum Initialisieren der Vektortabelle ein, konfigurieren Sie das EINT-Steuerelementregister für den Interrupt, und aktivieren Sie den Interrupthandler.

Die Codethink-Treiberbeispiele definieren eine VectorTableInit() Funktion. Sie können diese Initialisierungsfunktion an Ihre Anforderungen anpassen.

Zum Konfigurieren des EINT-Steuerelementregisters müssen Sie es gemäß der Definition im M4-Datenblatt initialisieren. Die folgende Funktion initialisiert z. B. den -Block, der eine angegebene pinenthält. Die Funktion definiert alle externen Interrupts mit dem Registerwert 0x300, der das Debouncing und Aktiv/Niedrig-Interrupts ermöglicht.

#define MT3620_CM4_IRQ_DBNC_CNTRL_DEF 0x300

int32_t EINT_ConfigurePin(uint32_t pin)
{
    mt3620_gpio_block_e block = pinToBlock(pin);

    if ((block < MT3620_GPIO_BLOCK_0) || (block > MT3620_GPIO_BLOCK_5)) {
        return ERROR_EINT_NOT_A_PIN;
    }

    uint32_t pinMask  = getPinMask(pin, block);
    uint32_t eintBlock = block - MT3620_GPIO_BLOCK_0;

    switch(pinMask) {
        case 1:
            mt3620_cm4_irq[eintBlock]->cm4_dbnc_con0 = MT3620_CM4_IRQ_DBNC_CNTRL_DEF;
            break;
        case 2:
            mt3620_cm4_irq[eintBlock]->cm4_dbnc_con1 = MT3620_CM4_IRQ_DBNC_CNTRL_DEF;
            break;
        case 4:
            mt3620_cm4_irq[eintBlock]->cm4_dbnc_con2 = MT3620_CM4_IRQ_DBNC_CNTRL_DEF;
            break;
        case 8:
            mt3620_cm4_irq[eintBlock]->cm4_dbnc_con3 = MT3620_CM4_IRQ_DBNC_CNTRL_DEF;
            break;
        default:
            break;
    }

    return ERROR_NONE;
}

Eine App kann diese Funktion wie folgt aufrufen:

if (EINT_ConfigurePin(8) != ERROR_NONE) {
    UART_Print(debug, "ERROR: EINT initialization failed\r\n");
}

Schließlich muss die App den Interrupt aktivieren. In diesem Beispiel wird die NVIC_Enable Funktion aus den Codethink-Treiberbeispielen verwendet:

NVIC_EnableIRQ(28, 2);

Externe Interrupt-API und Beispielcode

Zusätzlich zum allgemeinen Beispielcode aus Codethink Labs finden Sie eine Treiber-API und die entsprechende Dokumentation von MediaTek.