Dela via


Använda externa avbrott i program som kan användas i realtid

Azure Sphere stöder användning av externa avbrott i RTApps för MT3620. På MT3620 realtid kärnor, sådana avbrott inte använda GPIO direkt; i stället är de kabelanslutna 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.

I användarhandboken för MT3620 M4 finns information om kärnorna i realtid på MT3620. Om du vill ha mer information om registerbasadresser, avbrottsnummer och liknande information kan du begära databladet "MT3620 M4" från Avnet via e-post Azure.Sphere@avnet.com.

Krav på externa avbrott

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

  • Begär avbrott i filen app_manifest.json.
  • 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 annan kringutrustning, och samma regler gäller för multiplexering. Din RTApp kan använda valfri EINT-enhet, förutsatt att inget annat program (hög nivå eller RTApp) på enheten använder en kringutrustning som mappas till samma block. Mer information om hur kringutrustningsgränssnitt är multiplexerade finns i I/O Peripherals .

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 mappas till EINT5) i en app på hög nivå och därmed reserverar alla andra stift i blocket.

Avbrottshanterare

Din avbrottshanterare 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 stift 0 i block 3:

[INT(28)] = gpio_g2_irq0,

Motsvarande avbrottshanterare i provet ä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 namnge avbrottshanteraren vad du vill.

Initiera, konfigurera och aktivera avbrott

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

Exempel på codethink-drivrutiner definierar en VectorTableInit() funktion. Du kan anpassa initieringsfunktionen efter dina behov.

Om du vill 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 debouncing och active-low interrupts.

#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 NVIC_Enable här exemplet används funktionen från exempel på codethink-drivrutinen:

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.