Dela via


Använda externa avbrott i realtidskompatibla program

Viktigt!

Det här är dokumentationen om Azure Sphere (Legacy). Azure Sphere (Legacy) upphör den 27 september 2027 och användarna måste migrera till Azure Sphere (integrerad) vid den här tiden. Använd versionsväljaren ovanför TOC för att visa dokumentationen om Azure Sphere (integrerad).

Azure Sphere stöder användning av externa avbrott i RTApps för MT3620. På MT3620-realtidskärnorna använder sådana avbrott inte GPIO direkt. I stället är de kopplade oberoende av GPIO. En RTApp kan konfigurera ett externt avbrott så att det kan identifiera och svara på en signal på en extern pin-kod.

Se användarhandboken för MT3620 M4 för information om realtidskärnorna på MT3620. För ytterligare information om registerbasadresser, avbrottsnummer och liknande information, begär du "MT3620 M4 Datasheet" från Avnet via e-post Azure.Sphere@avnet.com.

Krav för externa avbrott

Så här använder du ett externt avbrott i en RTApp på MT3620:

  • Begär avbrottet i app_manifest.json-filen.
  • Skriv en avbrottshanterare som svarar på signalen.
  • Initiera, konfigurera och aktivera avbrottsfunktionen.

Inställningar för programmanifest

Om du vill använda ett externt avbrott måste en RTApp visa den i fältet "ExternalInterrupt" i avsnittet Funktioner i programmanifestet. Identifiera avbrottet med en sträng från EINT0 till EINT23. Följande rad anger till exempel externt avbrott 8:

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

Externa avbrott multiplexeras med GPIO på samma sätt som andra kringutrustningar, och samma regler gäller för multiplexering. Din RTApp kan använda valfri EINT som du föredrar, förutsatt att inget annat program (på hög nivå eller RTApp) på enheten använder kringutrustning som mappar till samma block. Se I/O-kringutrustning för information om hur kringutrustningsgränssnitt multiplexeras.

Om ditt Azure Sphere-programscenario även innehåller en Ethernet-sköld är EINT4-EINT7 inte tillgängliga för RTApp eftersom skölden använder GPIO 5 (som mappar till EINT5) i en högnivåapp, vilket reserverar alla andra stift inom blocket.

Avbrottshanterare

Avbrottshanteraren måste ha samma namn som det begärda avbrottet i vektortabellen för M4. Se Codethink Labs MT3620 M4-drivrutinsexempel på GitHub för exempelfilerna VectorTable.h och VectorTable.c.

I exempelfilen VectorTable.c representerar följande post i vektortabellen EINT8, som är fäst 0 i block 3:

[INT(28)] = gpio_g2_irq0,

Motsvarande avbrottshanterare i exemplet är gpio_g2_irq0:

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

I vektortabellen för ditt eget program kan du ge avbrottshanteraren namnet vad du vill.

Initiera, konfigurera och aktivera avbrott

I funktionen main() i din RTApp inkluderar du kod för att initiera vektortabellen, konfigurera EINT-kontrollregistret för avbrottet och aktivera avbrottshanteraren.

Codethink-drivrutinsexemplen definierar en VectorTableInit() funktion. Du kan anpassa den här initieringsfunktionen efter dina behov.

För att konfigurera EINT-kontrollregistret måste du initiera det enligt definitionen i M4-databladet. Följande funktion initierar till exempel blocket som innehåller en angiven pin. Funktionen definierar alla externa avbrott med registervärdet 0x300, vilket möjliggör avbrutna och aktiva-låga avbrott.

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

En app kan anropa den här funktionen på följande sätt:

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

Slutligen måste appen aktivera avbrottet. I det här exemplet används NVIC_Enable funktionen från Codethink-drivrutinsexemplen:

NVIC_EnableIRQ(28, 2);

Externt avbrotts-API och exempelkod

Förutom den allmänna exempelkoden från Codethink Labs kan du hitta ett drivrutins-API och motsvarande dokumentation från MediaTek.