Compartir a través de


Usar interrupciones externas en aplicaciones compatibles con tiempo real

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

Consulte el Manual de usuario de MT3620 M4 para obtener información sobre los núcleos en tiempo real del MT3620. Para obtener información adicional sobre las direcciones base del registro, los números de interrupción y detalles similares, solicite la "Hoja de datos MT3620 M4" de Avnet por correo electrónico Azure.Sphere@avnet.com.

Requisitos de interrupción externa

Para utilizar una interrupción externa en una RTApp en el MT3620:

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

Configuración de manifiesto de la aplicación

Para usar una interrupción externa, una RTApp debe incluirla en el campo "ExternalInterrupt" de la sección Capacidades del manifiesto de la 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 multiplexa con GPIO de la misma manera que otros periféricos, y se aplican las mismas reglas con respecto a la multiplexación. Tu RTApp puede usar cualquier EINT que prefieras, siempre que ninguna otra aplicación (de alto nivel o RTApp) del dispositivo use un periférico que se asigne al mismo bloque. Consulta Periféricos de E/S para obtener información sobre cómo se multiplexa la interfaz de periféricos.

Si el escenario de la aplicación Azure Sphere también incluye un escudo Ethernet, EINT4-EINT7 no está disponible para 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 pin dentro de ese bloque.

Controlador de interrupción

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

En el archivo VectorTable.c de muestra, la siguiente entrada en la tabla vectorial representa EINT8, que está anclado 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 vectorial de su propia aplicación, puede nombrar el controlador de interrupciones lo que desee.

Inicializar, configurar y habilitar la interrupción

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

Las muestras 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, tendrá que inicializarlo según se define en la hoja de datos M4. Por ejemplo, la siguiente función inicializa el bloque que contiene un valor especificado pin. La función define todas las interrupciones externas con el valor de registro 0x300, lo que permite la desbocar e interrupciones activas-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; Este ejemplo usa la NVIC_Enable función de las muestras del controlador Codethink:

NVIC_EnableIRQ(28, 2);

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

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