Comparaison d'interruptions GPIO pour trois microcontrôleurs populaires de TI, Microchip et STMicro

Comparaison d'interruptions GPIO pour trois microcontrôleurs populaires de TI, Microchip et STMicro


Comparez les interruptions GPIO de trois microcontrôleurs populaires: le Texas Instruments CC2544, le Microchip ATmega328P et le STMicroelectronics STM32L151C6.

Cet article est le quatrième et dernier article de ma série sur la concurrence et les interruptions avec interruptions GPIO à titre d'exemple. Nous avons d’abord abordé les concepts de base de concurrence et d’interruption, d’interruption GPIO et d’interruption pour les périphériques de microcontrôleur.

Ici, nous allons comparer les interruptions de trois MCU:

J'ai choisi les microcontrôleurs ci-dessus parce que je pouvais montrer les produits familiers dans lesquels ils sont utilisés et leur donner une pertinence réelle.

N'oubliez pas que toutes les déclarations que je fais sur le fonctionnement des microcontrôleurs en général ou sur le fonctionnement d'un microcontrôleur particulier ne sont pas des faits immuables. Bien que, dans le cas des déclarations générales, je parlerai de ce qui est devenu une pratique courante, bon nombre de ces décisions sont des décisions de conception que des personnes spécifiques ont prises pour leur produit particulier en fonction de divers facteurs. Ils ne doivent pas nécessairement exister de cette façon et ils pourraient changer ultérieurement si un groupe différent de personnes ayant une influence similaire prend différentes décisions de conception. Donc, quand je dis qu'un microcontrôleur spécifique a 10 broches GPIO, ce que je veux vraiment dire, c'est que l'équipe qui a conçu le microcontrôleur a décidé de fournir 10 broches GPIO pour la version actuelle à laquelle je fais référence. Une future version peut avoir plus ou moins de broches GPIO.

Pour aider à concrétiser certaines des idées que j'ai présentées tout au long de cette série, je montrerai comment chacun des trois exemples de microcontrôleurs implémentent des interruptions GPIO et comment activer une interruption sur une broche particulière pour chacune d'entre elles.

Texas Instruments CC2544

Le premier microcontrôleur que nous examinerons est le SoC CC2544 de Texas Instruments.

Texas Instruments CC2544 SoC

Image de Texas Instruments

Broches GPIO avec fonctions d'interruption

Le CC2544 dispose de 8 broches GPIO divisées en deux ports (PORT0 et PORT1) avec quatre broches chacune. Toutes les broches ont des capacités d’interruption et chaque broche a un indicateur d’interruption distinct.

Configuration d'interruption

Les 8 broches peuvent être configurées indépendamment. Chaque broche peut être configurée pour détecter uniquement un front montant (passage de 0 à 1) ou seulement un front descendant (passage de 1 à 0). Chaque interruption de broche peut être activée ou désactivée indépendamment. L'indicateur d'interruption pour une broche est toujours défini lorsque l'événement pour lequel elle est configurée se produit, que l'interruption soit activée ou non.

Vecteur d'interruption, routine de service et priorités

Chaque port a un vecteur d'interruption par port (PORT0 est P0INT et PORT1 est P1INT). Chaque vecteur d'interruption peut être activé ou désactivé individuellement. Chaque vecteur a également un indicateur d’interruption dans le contrôleur d’interruption qui est défini lorsque la condition d’interruption est activée. La documentation n'indique pas clairement si les indicateurs P0INT et P1INT sont définis uniquement si l'interruption de broche dans le GPIO est activée. Je suppose que c'est le cas. Les indicateurs P0INT et P1INT dans le contrôleur d'interruption sont toutefois définis, qu'ils soient activés ou non à l'intérieur du contrôleur d'interruption. la CPU ne répondra à l'interruption que si elles sont activées.

Étant donné que les vecteurs d'interruption existent pour le port, vous devez vérifier les drapeaux des broches dans votre ISR pour déterminer quelle broche de ce port a généré l'interruption. Vous devez également effacer les drapeaux de broche et le drapeau de vecteur d'interruption dans votre ISR. Les indicateurs de broche doivent être effacés avant les indicateurs de vecteur d'interruption.

Pour le CC2544 (en général), chaque vecteur d'interruption n'a pas nécessairement une priorité distincte pouvant être définie directement. Chaque vecteur d'interruption fait partie d'un groupe comprenant au plus deux autres vecteurs d'interruption. La priorité est attribuée au groupe et vous pouvez définir la priorité du groupe. Cependant, il existe un ordre prédéfini de traitement des interruptions s’ils ont la même priorité. P0INT et P1INT appartiennent à des groupes de priorité d'interruption différents. Vous pouvez donc vous concentrer sur ces deux éléments pour contrôler leur ordre de traitement.

Les ISR dans le CC2544 peuvent être préemptés par des interruptions de priorité plus élevée.

Micro puce ATmega328P

Le deuxième sur notre liste est le microcontrôleur AVR 8 bits ATmega328P.

Microcontrôleur ATmega328P de Microchip

Image de Microchip

Broches GPIO avec fonctions d'interruption

L'ATmega328P dispose de 23 broches GPIO divisées en trois ports: PORTB (huit broches), PORTC (sept broches) et PORTD (huit broches). Toutes les broches ont des capacités d’interruption via une interruption de changement de broche. Cependant, il n’existe pas d’indicateur d’épingle d’interruption individuel. À la place, chaque port a un indicateur d’interruption, à l’exception de deux broches sur PORTD, qui peuvent être configurées en tant qu’interruptions externes. Ils ont des drapeaux d'interruption séparés.

Configuration d'interruption

Les interruptions de changement de 23 broches sont préréglées pour détecter un changement logique de la valeur des broches (0 à 1 ou 1 à 0). Les deux interruptions externes peuvent toutefois être configurées pour détecter une valeur logique, uniquement un front montant (passage de 0 à 1), qu'un front descendant (passage de 1 à 0) ou une valeur constante 0. Chaque interruption de changement de broche peut être activée ou désactivée indépendamment. De plus, chaque interruption de port peut être activée ou désactivée.

L'indicateur d'interruption du port ou de l'une des broches externes est toujours défini lorsque l'événement pour lequel il est configuré se produit, que l'interruption soit activée ou non. De plus, l'indicateur sera défini, que la broche soit configurée en tant que sortie ou entrée.

Vecteur d'interruption, routine de service et priorités

Chaque port a un vecteur d'interruption par port (PORTB est PCINT0, PORTC est PCINT1, PORTD est PCINT2). De plus, chaque broche d’interruption externe possède son propre vecteur (la broche 2 dans PORTD est INT0 et la broche 3 dans PORTD est INT1). Chaque vecteur d'interruption peut être activé ou désactivé individuellement, mais cela se fait dans le périphérique GPIO et non dans le contrôleur d'interruptions (c'est-à-dire que le contrôleur d'interruptions ne dispose pas de capacités d'activation de vecteur d'interruption distinctes et que toutes les activations de vecteur d'interruption sont effectuées dans les périphériques).

Étant donné que les vecteurs d'interruption existent pour le port, pour les interruptions de changement de broche, vous devez déterminer quelle broche et quel événement ont déclenché l'interruption dans votre ISR. Cela nécessiterait de lire le masque d’interruption du port (pour savoir quelles interruptions des broches sont activées) et la valeur actuelle de la broche pour déterminer le changement logique survenu. Pour les deux interruptions externes, cependant, vous saurez déjà quelle broche a provoqué l’interruption, car chaque broche a un vecteur distinct. Le matériel supprime automatiquement l'indicateur d'interruption pour les interruptions externes, bien que vous puissiez toujours les effacer par le biais de votre code pour des raisons de sécurité.

Pour l'ATmega328P, les priorités d'interruption sont fixes et ne peuvent pas être modifiées. Après l'interruption de réinitialisation, les interruptions des broches ont la priorité la plus élevée parmi toutes les interruptions dans l'ordre INT0, INT1, PCINT0, PCINT1, PCINT2.

Les ISR de l'ATmega328P peuvent être préemptés par des interruptions de priorité supérieure, mais cela ne se produit pas automatiquement. Quand un ISR démarre, la CPU désactive toutes les interruptions. Vous devez activer manuellement les interruptions dans votre code ISR pour permettre la préemption. De plus, il existe un registre appelé registre d'état de l'AVR, qui fait partie de la CPU et dont la valeur n'est pas automatiquement stockée avant l'entrée d'une interruption ou restaurée après la sortie de l'interruption. Vous devez stocker et restaurer la valeur dans votre ISR. Cela est dû au fait que le processeur doit reprendre l'état dans lequel il se trouvait avant l'interruption. Il est possible que les actions que vous effectuez dans votre ISR modifient ce registre. Par conséquent, si vous ne conservez pas la valeur qu'il avait avant le début de vos actions et ne le restaurez pas, la CPU reviendra à un état différent après votre interruption et pourrait créer une trouver des bugs dans votre système.

STMicroelectronics STM32L151C6

Le dernier MCU que nous allons examiner est le MCU 32 bits STM32L151C6.

MCU 32 bits STMicroelectronics STM32L151C6

Image de STMicroelectronics via Digi-Key

Broches GPIO avec fonctions d'interruption

Le STM32L151C6 comporte 37 broches GPIO, mais seules 16 d’entre elles peuvent être configurées pour générer des interruptions (appelées interruptions externes) à tout moment. Il existe également certaines restrictions sur les broches pouvant être configurées pour être des interruptions en même temps.

Les 37 broches sont réparties sur quatre ports:

  • PA (16 pins)
  • PB (16 broches)
  • PC (3 broches)
  • PH (2 broches)

Les broches sont étiquetées de 0 à 15 pour PA et PB. Les broches 13 à 15 sont associées au PC, tandis que les broches 0 et 1 sont associées à PH. Toutes les broches portant le même numéro (par exemple, PA0, PB0 et PH0) partagent une ligne d’interruption externe ( interruption externe 0), de sorte qu'un seul d'entre eux peut être configuré pour être l'interruption à tout moment.

Contrairement aux unités ATmege328P et CC2544, il existe un périphérique de traitement des alarmes externe distinct, indépendant du périphérique GPIO qui gère les interruptions des broches. Ce dispositif est également différent du contrôleur d’interruption global du microcontrôleur. Chaque interruption externe a son propre drapeau.

Configuration d'interruption

Chaque ligne d'interruption externe doit être configurée sur la broche GPIO qui génère l'interruption sur cette ligne. Chaque interruption externe peut être configurée pour détecter un changement logique (0 à 1 ou 1 à 0), uniquement un front montant (passage de 0 à 1) ou seulement un front descendant (passage de 1 à 0). En effet, le périphérique est conçu pour vous permettre d'activer ou de désactiver indépendamment la détection des fronts montant et descendant. Chaque interruption peut être activée et désactivée indépendamment. Contrairement aux modèles CC2544 et ATmege328P, l'indicateur d'interruption pour une interruption externe n'est défini que si l'interruption est activée.

Vecteur d'interruption, routine de service et priorités

Les interruptions externes 0 à 4 ont chacune leur propre vecteur d'interruption distinct. Les interruptions externes 5 à 9 partagent un vecteur d'interruption et les interruptions 10 à 15 partagent également un vecteur d'interruption. Cela signifie qu'il y a sept vecteurs d'interruption totaux liés aux interruptions GPIO. Chacun de ces vecteurs peut être activé ou désactivé indépendamment. Chaque vecteur a également son propre drapeau dans le contrôleur d'interruption.

L'ISR doit effacer l'indicateur d'interruption dans le module des interruptions externes (GPIO) ainsi que dans le contrôleur d'interruption. La documentation ne précise pas l'ordre dans lequel cela doit être fait, mais il est plus logique de suivre l'approche CC2544 consistant à effacer les indicateurs GPIO en premier, avant les indicateurs de vecteur d'interruption.

Les priorités dans le STML151C6 sont un peu plus compliquées dans leur configuration et dans leur manière de permettre la préemption. Il existe deux façons de configurer les priorités. Le moyen le plus simple consiste à utiliser les niveaux de priorité. Il existe 16 niveaux de priorité différents. Seul le niveau de priorité est utilisé pour déterminer la préemption. Ainsi, une interruption avec un niveau de priorité supérieur peut préempter une interruption actuellement traitée par la CPU. Chaque vecteur d'interruption a un numéro d'interruption unique. Si deux interruptions avec les mêmes niveaux de priorité attendent la CPU, celle-ci sélectionne celle qui a le numéro d'interruption le plus bas une fois qu'elle est capable. Toutefois, une interruption avec un numéro d'interruption inférieur ne peut pas préempter une autre interruption avec un numéro de priorité supérieur, même si elles ont le même niveau de priorité.

La seconde approche pour interrompre la configuration consiste à utiliser les priorités et les sous-priorités de groupe. Le nombre de groupes et de sous-priorités différents est également configurable. Quelle que soit la configuration, la priorité du groupe fonctionne comme le niveau de priorité. Les interruptions avec une priorité de groupe plus élevée peuvent préempter les interruptions avec une priorité de groupe plus basse. La sous-priorité et le numéro d'interruption sont utilisés pour déterminer quelle interruption doit s'exécuter si deux interruptions ou plus avec la même priorité de groupe attendent sur la CPU. La sous-priorité est utilisée en premier. Celui avec la sous-priorité la plus élevée est traité avant celui avec la sous-priorité la plus basse. Si les deux partagent la même sous-priorité, celle dont le nombre d'interruptions est inférieur est traitée en premier.


Ceci conclut notre série sur les interruptions de simultanéité et GPIO. Si vous avez des questions sur les informations présentées ici, merci de nous le faire savoir dans les commentaires ci-dessous.



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *