Utiliser des interruptions externes dans des applications compatibles en temps réel
Important
Il s’agit de la documentation Azure Sphere (héritée). Azure Sphere (hérité) prend sa retraite le 27 septembre 2027 et les utilisateurs doivent migrer vers Azure Sphere (intégré) pour l’instant. Utilisez le sélecteur de version situé au-dessus du TOC pour afficher la documentation Azure Sphere (intégrée).
Azure Sphere prend en charge l’utilisation d’interruptions externes dans RTApps pour le MT3620. Sur les cœurs MT3620 en temps réel, 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 utilisateur MT3620 M4 pour plus d’informations sur les cœurs en temps réel sur le MT3620. Pour plus d’informations sur l’inscription des adresses de base, des numéros d’interruption et des détails similaires, demandez la « feuille de données MT3620 M4 » d’Avnet par e-mail Azure.Sphere@avnet.com
.
Exigences d’interruption externe
Pour utiliser une interruption externe dans une application RTApp sur le MT3620 :
- Demandez l’interruption dans le fichier app_manifest.json.
- Écrivez un gestionnaire d’interruptions qui répond au signal.
- Initialisez, configurez et activez la fonctionnalité d’interruption.
Paramètres de manifeste de l’application
Pour utiliser une interruption externe, une application RTApp 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 vers 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 au multiplexage. Votre application RTApp peut utiliser n’importe quel EINT que vous préférez, à condition qu’aucune autre application (de haut niveau ou RTApp) sur l’appareil utilise un périphérique mappé au même bloc. Consultez les périphériques d’E/S pour plus d’informations sur la façon dont les interfaces périphériques sont multiplexées.
Si votre scénario d’application Azure Sphere inclut également un bouclier 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 dans ce bloc.
Gestionnaire d’interruptions
Votre gestionnaire d’interruptions doit avoir le même nom que l’interruption demandée dans la table vectorielle 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 vectorielle représente EINT8, qui est l’épingle 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 vectorielle de votre propre application, vous pouvez nommer le gestionnaire d’interruptions de votre choix.
Initialiser, configurer et activer l’interruption
Dans la fonction main() de votre application RTApp, incluez du code pour initialiser la table vectorielle, configurez le registre de contrôle EINT pour l’interruption et activez le gestionnaire d’interruptions.
Les exemples de pilotes Codethink définissent une VectorTableInit()
fonction. Vous pouvez adapter cette fonction d’initialisation à vos besoins.
Pour configurer le registre du 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 .pin
La fonction définit toutes les interruptions externes avec la valeur de registre 0x300, ce qui permet de débouchage et d’interruptions actives-faibles.
#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 à partir des exemples de pilotes Codethink :
NVIC_EnableIRQ(28, 2);
API d’interruption externe et exemple de code
Outre l’exemple de code général de Codethink Labs, vous trouverez une API de pilote et une documentation correspondante de MediaTek.