Compartir a través de


Uso de interrupciones externas en aplicaciones compatibles en tiempo real

Importante

Esta es la documentación de Azure Sphere (heredado). Azure Sphere (heredado) se retira el 27 de septiembre de 2027 y los usuarios deben migrar a Azure Sphere (integrado) en este momento. Use el selector de versiones situado encima de la TOC para ver la documentación de Azure Sphere (integrado).

Azure Sphere admite el uso de interrupciones externas en RTApps para MT3620. En los núcleos en tiempo real MT3620, estas interrupciones no usan GPIO directamente; en su lugar, se conectan independientemente de GPIO. Una RTApp puede configurar una interrupción externa para que pueda detectar y responder a una señal en un pin externo.

Consulta el Manual de instrucciones de MT3620 M4 para obtener información sobre los núcleos en tiempo real en MT3620. Para obtener información adicional sobre el registro de direcciones base, números de interrupción y detalles similares, solicite la "Hoja de datos MT3620 M4" de Avnet enviando un correo electrónico Azure.Sphere@avnet.coma .

Requisitos de interrupción externa

Para usar una interrupción externa en una RTApp en mt3620:

  • Solicite la interrupción en el archivo app_manifest.json.
  • Escriba un controlador de interrupción que responda a la señal.
  • Inicialice, configure y habilite la funcionalidad de interrupción.

Configuración del manifiesto de aplicación

Para usar una interrupción externa, una RTApp debe enumerarla en el campo "ExternalInterrupt" de la sección Funcionalidades del manifiesto de aplicación. Identifique la interrupción por una cadena de EINT0 a EINT23. Por ejemplo, la línea siguiente especifica la interrupción externa 8:

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

Las interrupciones externas se multiplexan con GPIO de la misma manera que otros periféricos y se aplican las mismas reglas con respecto a la multiplexación. La RTApp puede usar cualquier EINT que prefiera, siempre que ninguna otra aplicación (ya sea de alto nivel o RTApp) en el dispositivo use un periférico que se asigne al mismo bloque. Consulte Periféricos de E/S para obtener información sobre cómo se multiplexan las interfaces periféricas.

Si el escenario de aplicación de Azure Sphere también incluye un escudo Ethernet, EINT4-EINT7 no está disponible para la RTApp, ya que el escudo usa GPIO 5 (que se asigna a EINT5) en una aplicación de alto nivel, reservando así todos los demás pines dentro de ese bloque.

Controlador de interrupciones

El controlador de interrupción debe tener el mismo nombre que la interrupción solicitada en la tabla vectorial de M4. Consulte los ejemplos de controladores de Codethink Labs MT3620 M4 en GitHub para ver los archivos VectorTable.h y VectorTable.c de ejemplo.

En el archivo VectorTable.c de ejemplo, la siguiente entrada de la tabla vectorial representa EINT8, que es el pin 0 en el bloque 3:

[INT(28)] = gpio_g2_irq0,

El controlador de interrupción correspondiente en el ejemplo es gpio_g2_irq0:

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

En la tabla de vectores de su propia aplicación, puede asignar un nombre al controlador de interrupciones lo que quiera.

Inicialización, configuración y habilitación de la interrupción

En la función main() de la RTApp, incluya código para inicializar la tabla vectorial, configurar el registro de control EINT para la interrupción y habilitar el controlador de interrupciones.

Los ejemplos del controlador Codethink definen una VectorTableInit() función. Puede adaptar esta función de inicialización a sus requisitos.

Para configurar el registro de controles EINT, deberá inicializarlo tal como se define en la hoja de datos M4. Por ejemplo, la siguiente función inicializa el bloque que contiene un especificado pin. La función define todas las interrupciones externas con el valor de registro 0x300, lo que permite la desbouncing y las interrupciones activas y bajas.

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

Una aplicación puede llamar a esta función de la siguiente manera:

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

Por último, la aplicación debe habilitar la interrupción; en este ejemplo se usa la NVIC_Enable función de los ejemplos del controlador Codethink:

NVIC_EnableIRQ(28, 2);

API de interrupción externa y código de ejemplo

Además del código de ejemplo general de Codethink Labs, puede encontrar una API de controlador y la documentación correspondiente de MediaTek.