Verwenden externer Unterbrechungen in Echtzeit-fähigen Anwendungen
Wichtig
Dies ist die Dokumentation zu Azure Sphere (Legacy). Azure Sphere (Legacy) wird am 27. September 2027 eingestellt, und Benutzer müssen bis zu diesem Zeitpunkt zu Azure Sphere (integriert) migrieren. Verwenden Sie die Versionsauswahl oberhalb des Inhaltsverzeichniss, um die Dokumentation zu Azure Sphere (Integriert) anzuzeigen.
Azure Sphere unterstützt die Verwendung externer Unterbrechungen in RTApps für mt3620. Auf den MT3620-Echtzeitkernen verwenden solche Unterbrechungen GPIO nicht direkt; Stattdessen werden sie unabhängig von GPIO verkabelt. Eine RTApp kann einen externen Interrupt so konfigurieren, dass er ein Signal an einem externen Pin erkennen und darauf reagieren kann.
Informationen zu den Echtzeitkernen auf dem MT3620 M4-Benutzerhandbuch finden Sie im MT3620.See the MT3620 User Manual for information about the real-time cores on the MT3620. Für weitere Informationen zum Registrieren von Basisadressen, Interruptnummern und ähnlichen Details fordern Sie das "MT3620 M4 Datenblatt" von Avnet per E-Mail Azure.Sphere@avnet.com
an.
Anforderungen für 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.
Einstellungen für das Anwendungsmanifest
Um einen externen Interrupt zu verwenden, muss eine RTApp sie im Feld "ExternalInterrupt" des Abschnitts "Funktionen " des Anwendungsmanifests auflisten. Identifizieren Sie den Interrupt durch eine Zeichenfolge von EINT0 zu EINT23. Die folgende Zeile gibt z. B. den externen Interrupt 8 an:
"Capabilities": {
"ExternalInterrupt": [ "EINT8"]
}
Externe Unterbrechungen werden mit GPIO auf die gleiche Weise wie andere Peripheriegeräte multixiert, und die gleichen Regeln gelten für Multiplexing. Ihre RTApp kann jedes bevorzugte EINT verwenden, vorausgesetzt, keine andere Anwendung (entweder high-level oder RTApp) auf dem Gerät verwendet ein Peripheriegerät, das demselben Block zugeordnet ist. Informationen dazu, wie Peripheriegeräte multixiert werden, finden Sie unter "E/A-Peripheriegeräte ".
Wenn Ihr Azure Sphere-Anwendungsszenario auch einen Ethernet-Schild enthält, sind EINT4-EINT7 für die RTApp nicht verfügbar, da der Schild GPIO 5 (die EINEMT5 zugeordnet ist) in einer high-level-App verwendet und somit alle anderen Pins innerhalb dieses Blocks reserviert.
Interrupthandler
Der Interrupthandler muss denselben Namen wie der angeforderte Interrupt in der Vektortabelle für 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, der in Block 3 pin 0 ist:
[INT(28)] = gpio_g2_irq0,
Der entsprechende Interrupthandler im Beispiel lautet 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
Schließen Sie in der Hauptfunktion Ihrer RTApp Code zum Initialisieren der Vektortabelle ein, konfigurieren Sie das EINT-Steuerelementregister für den Interrupt, und aktivieren Sie den Interrupthandler.
Die Codethinktreiberbeispiele definieren eine VectorTableInit()
Funktion. Sie können diese Initialisierungsfunktion an Ihre Anforderungen anpassen.
Um das EINT-Steuerelementregister zu konfigurieren, müssen Sie es wie im M4-Datenblatt definiert initialisieren. Die folgende Funktion initialisiert z. B. den Block, der einen angegebenen pin
Wert enthält. Die Funktion definiert alle externen Unterbrechungen mit dem Registerwert 0x300, wodurch Entprellen- und Aktiv-Low-Interrupts ermöglicht werden.
#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 entsprechende Dokumentation von MediaTek.
- Externer Interrupt-Quellcode von MediaTek
- Externe Interruptheaderdatei von MediaTek
- EINT-API-Referenzhandbuch von MediaTek