Usare interruzioni esterne in applicazioni in grado di supportare in tempo realeUse external interrupts in real-time capable applications

Azure Sphere supporta l'utilizzo di interrupt esterni in RTApps per MT3620.Azure Sphere supports the use of external interrupts in RTApps for the MT3620. Nei core in tempo reale di MT3620, tali interrupt non usano direttamente GPIO; sono invece cablati indipendentemente da GPIO.On the MT3620 real-time cores, such interrupts do not use GPIO directly; instead, they are wired independently of GPIO. Un RTApp può configurare un interrupt esterno, in modo che possa rilevare e rispondere a un segnale su un pin esterno.An RTApp can configure an external interrupt so that it can detect and respond to a signal on an external pin.

Per informazioni sui core in tempo reale in MT3620, vedere il manuale dell'utente di MT3620 M4 .See the MT3620 M4 User Manual for information about the real-time cores on the MT3620. Per ulteriori informazioni su come registrare gli indirizzi di base, i numeri di interrupt e informazioni simili, richiedere il "foglio dati MT3620 M4" da Avnet tramite posta elettronica Azure.Sphere@avnet.com .For additional information about register base addresses, interrupt numbers, and similar details, request the "MT3620 M4 Datasheet" from Avnet by emailing Azure.Sphere@avnet.com.

Requisiti di interrupt esterniExternal interrupt requirements

Per usare un interrupt esterno in un RTApp in MT3620:To use an external interrupt in an RTApp on the MT3620:

  • Richiedere l'interrupt nell'app_manifest.jssul file.Request the interrupt in the app_manifest.json file.
  • Scrivere un gestore di interrupt che risponde al segnale.Write an interrupt handler that responds to the signal.
  • Inizializzare, configurare e abilitare la funzionalità di interrupt.Initialize, configure, and enable the interrupt functionality.

Impostazioni del manifesto dell'applicazioneApplication manifest settings

Per usare un interrupt esterno, un RTApp deve elencarlo nel campo "ExternalInterrupt" della sezione funzionalità del manifesto dell'applicazione.To use an external interrupt, an RTApp must list it in the "ExternalInterrupt" field of the Capabilities section of the application manifest. Identificare l'interrupt da una stringa da EINT0 a EINT23.Identify the interrupt by a string from EINT0 to EINT23. La riga seguente, ad esempio, specifica l'interrupt esterno 8:For example, the following line specifies external interrupt 8:

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

Gli interrupt esterni vengono multiplexati con GPIO in modo analogo alle altre periferiche e si applicano le stesse regole relative al multiplexing.External interrupts are multiplexed with GPIO in the same way as other peripherals, and the same rules apply regarding multiplexing. Il RTApp può usare qualsiasi EINT preferibile, purché nessun'altra applicazione (ad alto livello o RTApp) sul dispositivo usi una periferica che esegue il mapping allo stesso blocco.Your RTApp can use any EINT you prefer, provided that no other application (either high-level or RTApp) on the device uses a peripheral that maps to the same block. Vedere le periferiche I/O per informazioni sulla modalità di multiplexing delle interfacce periferiche.See I/O Peripherals for information about how peripheral interfaces are multiplexed.

Se lo scenario dell'applicazione Azure Sphere include anche uno scudo Ethernet, EINT4-EINT7 non è disponibile per il RTApp, perché lo scudo USA GPIO 5 (che esegue il mapping a EINT5) in un'app di alto livello, in modo da riservare tutti gli altri pin all'interno del blocco.If your Azure Sphere application scenario also includes an Ethernet shield, EINT4-EINT7 are unavailable to the RTApp, because the shield uses GPIO 5 (which maps to EINT5) in a high-level app, thus reserving all other pins within that block.

Gestore di interruptInterrupt handler

Il gestore di interrupt deve avere lo stesso nome dell'interrupt richiesto nella tabella Vector per la M4.Your interrupt handler must have the same name as the requested interrupt in the vector table for the M4. Per i file di esempio VectorTable. h e VectorTable. c, vedere la pagina relativa agli esempi di driver MT3620 M4 di codethink in GitHub.See the Codethink Labs MT3620 M4 driver samples on GitHub for sample VectorTable.h and VectorTable.c files.

Nel file VectorTable. c di esempio, la voce seguente nella tabella Vector rappresenta EINT8, che è il pin 0 nel blocco 3:In the sample VectorTable.c file, the following entry in the vector table represents EINT8, which is pin 0 in block 3:

[INT(28)] = gpio_g2_irq0,

Il gestore di interrupt corrispondente nell'esempio è gpio_g2_irq0 :The corresponding interrupt handler in the sample is gpio_g2_irq0:

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

Nella tabella Vector per la propria applicazione, è possibile assegnare al gestore di interrupt il nome desiderato.In the vector table for your own application, you can name the interrupt handler whatever you want.

Inizializzare, configurare e abilitare l'interruptInitialize, configure, and enable the interrupt

Nella funzione Main () del RTApp, includere il codice per inizializzare la tabella Vector, configurare il registro di controllo di EINT per l'interrupt e abilitare il gestore di interrupt.In the main() function of your RTApp, include code to initialize the vector table, configure the EINT control register for the interrupt, and enable the interrupt handler.

Gli esempi del driver codethink definiscono una VectorTableInit() funzione.The Codethink driver samples define a VectorTableInit() function. È possibile adattare questa funzione di inizializzazione ai propri requisiti.You can adapt this initialization function to your requirements.

Per configurare il registro di controllo di EINT, è necessario inizializzarlo come definito nel foglio dati M4.To configure the EINT control register, you'll need to initialize it as defined in the M4 Datasheet. La funzione seguente, ad esempio, Inizializza il blocco che contiene un oggetto specificato pin .For example, the following function initializes the block that contains a specified pin. La funzione definisce tutti gli interrupt esterni con il valore di registro 0x300, che Abilita gli interrupt di debounce e di livello attivo-basso.The function defines all external interrupts with the register value 0x300, which enables debouncing and 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;
}

Un'app può chiamare questa funzione come indicato di seguito:An app can call this function as follows:

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

Infine, l'app deve abilitare l'interrupt; in questo esempio viene utilizzata la NVIC_Enable funzione dagli esempi di driver codethink:Finally, the app must enable the interrupt; this example uses the NVIC_Enable function from the Codethink driver samples:

NVIC_EnableIRQ(28, 2);

API di interrupt esterno e codice di esempioExternal interrupt API and sample code

Oltre al codice di esempio generale di codethink Labs, è possibile trovare un'API driver e la documentazione corrispondente di MediaTek.In addition to the general example code from Codethink Labs, you can find a driver API and corresponding documentation from MediaTek.