Delen via


Externe interrupts gebruiken in toepassingen die geschikt zijn voor realtime

Azure Sphere ondersteunt het gebruik van externe interrupts in RTApps voor de MT3620. Op de MT3620 realtime kernen maken dergelijke interrupts niet rechtstreeks gebruik van GPIO; In plaats daarvan zijn ze onafhankelijk van GPIO bekabeld. Een RTApp kan een externe interrupt configureren, zodat deze een signaal op een externe pin kan detecteren en erop kan reageren.

Zie de gebruikershandleiding van MT3620 M4 voor informatie over de realtime kernen op de MT3620. Voor meer informatie over het registreren van basisadressen, interruptnummers en vergelijkbare details, kunt u het 'MT3620 M4-gegevensblad' van Avnet aanvragen door een e-mail te sturen naar Azure.Sphere@avnet.com.

Vereisten voor externe interrupt

Een externe interrupt gebruiken in een RTApp op de MT3620:

  • Vraag de interrupt aan in het bestand app_manifest.json.
  • Schrijf een interrupt-handler die op het signaal reageert.
  • Initialiseer, configureer en schakel de onderbrekingsfunctionaliteit in.

Toepassingsmanifestinstellingen

Als u een externe interrupt wilt gebruiken, moet een RTApp deze vermelden in het veld ExternalInterrupt van de sectie Capabilities van het toepassingsmanifest. Identificeer de interrupt door een tekenreeks van EINT0 naar EINT23. De volgende regel geeft bijvoorbeeld externe interrupt 8 op:

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

Externe interrupts worden op dezelfde manier met GPIO gemultiplexeerd als andere randapparatuur en dezelfde regels zijn van toepassing met betrekking tot multiplexing. Uw RTApp kan elke EINT gebruiken die u wilt, op voorwaarde dat geen andere toepassing (op hoog niveau of RTApp) op het apparaat een randapparaat gebruikt dat aan hetzelfde blok wordt toegewezen. Zie I/O-randapparatuur voor informatie over hoe randapparatuurinterfaces worden gemultiplexeerd.

Als uw Azure Sphere-toepassingsscenario ook een Ethernet-schild bevat, is EINT4-EINT7 niet beschikbaar voor de RTApp, omdat het schild gebruikmaakt van GPIO 5 (dat wordt toegewezen aan EINT5) in een app op hoog niveau, waardoor alle andere pinnen binnen dat blok worden reserveren.

Interrupt-handler

Uw interrupt-handler moet dezelfde naam hebben als de aangevraagde interrupt in de vectortabel voor de M4. Zie de Codethink Labs MT3620 M4-stuurprogrammavoorbeelden op GitHub voor voorbeeldbestanden VectorTable.h en VectorTable.c.

In het voorbeeldbestand VectorTable.c vertegenwoordigt de volgende vermelding in de vectortabel EINT8. Dit is pin 0 in blok 3:

[INT(28)] = gpio_g2_irq0,

De bijbehorende interrupt-handler in het voorbeeld is gpio_g2_irq0:

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

In de vectortabel voor uw eigen toepassing kunt u de interrupt-handler een naam noemen zoals u wilt.

De interrupt initialiseren, configureren en inschakelen

Neem in de functie main() van uw RTApp code op om de vectortabel te initialiseren, het EINT-besturingselementregister voor de interrupt te configureren en de interrupt-handler in te schakelen.

In de voorbeelden van codethink-stuurprogramma's wordt een VectorTableInit() functie gedefinieerd. U kunt deze initialisatiefunctie aanpassen aan uw vereisten.

Als u het EINT-besturingsregister wilt configureren, moet u het initialiseren zoals gedefinieerd in het M4-gegevensblad. Met de volgende functie wordt bijvoorbeeld het blok geïnitialiseerd dat een opgegeven pinbevat. De functie definieert alle externe interrupts met de registerwaarde 0x300, waardoor debouncing en actief-lage interrupts mogelijk zijn.

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

Een app kan deze functie als volgt aanroepen:

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

Ten slotte moet de app de interrupt inschakelen; in dit voorbeeld wordt de NVIC_Enable functie uit de voorbeelden van het Codethink-stuurprogramma gebruikt:

NVIC_EnableIRQ(28, 2);

Externe interrupt-API en voorbeeldcode

Naast de algemene voorbeeldcode van Codethink Labs vindt u een stuurprogramma-API en bijbehorende documentatie in MediaTek.