Utiliser des interruptions externes dans des applications compatibles en temps réel

Azure Sphere prend en charge l’utilisation d’interruptions externes dans les applications en temps réel pour le MT3620. Sur les cœurs en temps réel MT3620, ces interruptions n’utilisent pas gpIO directement ; au lieu de cela, ils sont câblés indépendamment de GPIO. Une application rtapp peut configurer une interruption externe afin qu’elle puisse détecter et répondre à un signal sur une broche externe.

Consultez le manuel de l’utilisateur MT3620 M4 pour plus d’informations sur les cœurs en temps réel sur le MT3620. Pour plus d’informations sur les adresses de base d’inscription, les numéros d’interruption et des détails similaires, demandez la « feuille de données MT3620 M4 » à Avnet en envoyant Azure.Sphere@avnet.comun e-mail à .

Exigences d’interruption externe

Pour utiliser une interruption externe dans une rtapp sur le MT3620 :

  • Demandez l’interruption dans le fichier app_manifest.json.
  • Écrivez un gestionnaire d’interruption qui répond au signal.
  • Initialisez, configurez et activez la fonctionnalité d’interruption.

Paramètres du manifeste d’application

Pour utiliser une interruption externe, une application en temps réel doit la répertorier dans le champ « ExternalInterrupt » de la section Fonctionnalités du manifeste de l’application. Identifiez l’interruption par une chaîne d’EINT0 à EINT23. Par exemple, la ligne suivante spécifie l’interruption externe 8 :

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

Les interruptions externes sont multiplexées avec GPIO de la même façon que d’autres périphériques, et les mêmes règles s’appliquent en ce qui concerne le multiplexage. Votre rtapp peut utiliser n’importe quel EINT de votre choix, à condition qu’aucune autre application (de haut niveau ou RTApp) sur l’appareil utilise un périphérique qui correspond au même bloc. Pour plus d’informations sur la façon dont les interfaces périphériques sont multiplexées, consultez Périphériques d’E/S.

Si votre scénario d’application Azure Sphere inclut également une protection Ethernet, EINT4-EINT7 n’est pas disponible pour l’application RTApp, car le bouclier utilise GPIO 5 (qui correspond à EINT5) dans une application de haut niveau, réservant ainsi toutes les autres broches au sein de ce bloc.

Gestionnaire d’interruptions

Votre gestionnaire d’interruptions doit avoir le même nom que l’interruption demandée dans la table de vecteurs pour le M4. Consultez les exemples de pilotes Codethink Labs MT3620 M4 sur GitHub pour obtenir des exemples de fichiers VectorTable.h et VectorTable.c.

Dans l’exemple de fichier VectorTable.c, l’entrée suivante dans la table de vecteurs représente EINT8, qui est la broche 0 dans le bloc 3 :

[INT(28)] = gpio_g2_irq0,

Le gestionnaire d’interruption correspondant dans l’exemple est gpio_g2_irq0:

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

Dans la table de vecteurs de votre propre application, vous pouvez nommer le gestionnaire d’interruptions comme vous le souhaitez.

Initialiser, configurer et activer l’interruption

Dans la fonction main() de votre application RTApp, incluez du code pour initialiser la table de vecteurs, configurez le registre de contrôle EINT pour l’interruption et activez le gestionnaire d’interruption.

Les exemples de pilotes Codethink définissent une VectorTableInit() fonction. Vous pouvez adapter cette fonction d’initialisation à vos besoins.

Pour configurer le registre de contrôle EINT, vous devez l’initialiser comme défini dans la feuille de données M4. Par exemple, la fonction suivante initialise le bloc qui contient un spécifié pin. La fonction définit toutes les interruptions externes avec la valeur de registre 0x300, ce qui permet le débouchage et les interruptions actives/basses.

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

Une application peut appeler cette fonction comme suit :

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

Enfin, l’application doit activer l’interruption ; cet exemple utilise la NVIC_Enable fonction des exemples de pilotes Codethink :

NVIC_EnableIRQ(28, 2);

API d’interruption externe et exemple de code

En plus de l’exemple de code général de Codethink Labs, vous trouverez une API de pilote et la documentation correspondante à partir de MediaTek.