Pourquoi dois-je d'abord définir une valeur puis la direction du GPIO dans un processeur intégré?

16

J'ai un emploi à plein temps en tant qu'ingénieur firmware. On m'a récemment confié la tâche d'examiner les configurations GPIO et de modifier les paramètres selon les besoins. J'ai trouvé quelques broches mal configurées, donc naturellement je les ai reconfigurées, mais on m'a dit que je l'avais fait dans le mauvais ordre. Voici de quoi je parle:

Avant:
GPIO1.direction = INPUT;

Après:
GPIO1.direction = OUTPUT;
GPIO1.value = 0;

Cependant, lors de la révision du code, on m'a dit que je devais changer l'ordre d'initialisation comme suit:

GPIO1.value = 0;
GPIO1.direction = OUTPUT;

En d'autres termes, définissez d'abord la valeur, puis définissez la direction de la broche. On m'a également dit que c'est ainsi que cela doit être sur les processeurs modernes car ils utilisent deux registres, un pour l'entrée et un pour la sortie, mais les anciens processeurs n'utilisent qu'un seul registre, donc l'ordre des opérations n'a pas d'importance.
(Remarque: moderne = ARM Cortex M3 et supérieur, ancien = Intel 8051)

J'ai demandé une meilleure explication au travail, mais je n'ai pas pu obtenir une bonne réponse. C'est pourquoi j'ai décidé de demander ici.

Donc, voici mes questions:

  1. Pourquoi l'ordre d'initialisation est-il important sur les nouveaux processeurs?
  2. Pourquoi l'ordre d'initialisation n'a-t-il pas d'importance sur les anciens processeurs?
  3. De quels registres parlent-ils dans les processeurs modernes?
  4. De quel registre unique parlent-ils sur les anciens processeurs?

Si quelqu'un pouvait fournir une sorte de diagramme, ce serait encore mieux.

flashburn
la source
1
Les processeurs "modernes" et "anciens" sont beaucoup trop vagues pour donner une réponse utile. Différentes architectures ont des paramètres de registre différents; sans savoir de qui vous parlez, il n'y a aucun moyen de les commenter intelligemment.
Nick Johnson
@ IgnacioVazquez-Abrams Non, pas vraiment. Il y avait des ingénieurs très expérimentés dans la salle qui ont dit que vous auriez des problèmes sur la ligne si cela se faisait à ma façon.
flashburn
@NickJohnson Modern = ARM Cortex M4 et supérieur, Old = Intel 8051.
flashburn
@BrianDrummond LOL. Très belle explication. Mais qu'en est-il des anciens processeurs, 8051 par exemple. Pourquoi cela n'a pas d'importance pour eux?
flashburn
2
Il serait plus facile de répondre au Q4 avec un lien de fiche technique.
pjc50

Réponses:

22

Le 8051 d'origine utilisait des ports de sortie dits pseudo-bidirectionnels (drain ouvert avec pullups), il n'y avait donc vraiment aucun paramètre de direction de port.

Bien sûr, pour les vrais ports de sortie bidirectionnels modernes, il est préférable d'avoir une valeur connue définie avant d'activer la broche du port pour la sortie, car sinon vous pourriez avoir un transitoire sur la sortie qui pourrait faire quelque chose d'indésirable.

Voir ma réponse ici , par exemple.

Edit: Voici la structure des broches d'E / S pour un microcontrôleur CMOS (relativement) moderne :

entrez la description de l'image ici

TRIS (TRIState) est appelé DDR (Data Direction Register) dans de nombreux autres micros. Dans ce cas, si la sortie du verrou TRIS est élevée, les deux transistors sont bloqués, mais le port peut toujours être lu.

Voici une structure de broches d'E / S légèrement plus complexe pour un micro Microchip plus récent .

entrez la description de l'image ici

Encore une fois, le verrou TRIS désactive la sortie. Celui-ci comprend un verrou LAT qui permet d'éviter les problèmes de lecture-modification-écriture . Sur la série PIC, vous devez écrire dans le registre LAT uniquement (et lire dans le registre PORT).

Voici le circuit interne des broches du port d'E / S classique 8051 et CMOS 8051 d'origine (de cette source ):

entrez la description de l'image ici

Il y a un peu de complexité supplémentaire en ce qu'il y a un transistor d'accélération en parallèle avec le pull-up qui est brièvement activé pour surmonter la capacité externe. Comme vous pouvez le voir, il n'y a aucun contrôle TRIS / DDR. Les MOSFET de rappel utilisés en fonctionnement normal sont «faibles» - ils sont suffisamment petits (Idss faible) pour qu'une sortie externe connectée à la broche puisse tirer la ligne de port pseudo-bidirectionnelle à un niveau bas.

Spehro Pefhany
la source
Merci pour l'explication. Je n'ai pas travaillé avec du matériel depuis un moment donc j'ai du mal à comprendre l'explication d'une description. Pourriez-vous fournir des images? Dites à quoi ressemblerait un matériel de configuration de broches sur un processeur moderne par rapport à quoi il ressemble sur 8051? J'apprécierai vraiment cela.
flashburn
Qu'entendez-vous par matériel? Le circuit GPIO interne de la puce?
Spehro Pefhany
C'est correct. Une sorte de diagramme serait vraiment utile.
flashburn
16

Si vous définissez d'abord la direction, la broche sera brièvement configurée pour sortir quelle que soit sa valeur de sortie actuelle. Si vous définissez d'abord la valeur, cela ne se produira pas.

Ainsi, le faire de la manière qui vous a été recommandée évite les problèmes de sortie, qui peuvent aller d'inoffensifs à catastrophiques, selon ce à quoi la broche est connectée.

Nick Johnson
la source
Merci. Alors qu'en est-il des anciens processeurs, pourquoi cela n'a-t-il pas d'importance pour eux? Ancien = Intel 8051
flashburn
Je ne connais pas le 8051. D'après ce que vos collègues ont dit, si le même registre configure à la fois la direction et la valeur, cela n'aura pas d'importance car le compilateur optimisera les deux écritures en une seule.
Nick Johnson
2
ce serait probablement encore une bonne habitude de le faire de cette "nouvelle" façon pour les anciens processeurs aussi pour la raison ci-dessus. Différents processeurs peuvent avoir des exigences différentes, différents fournisseurs peuvent donner de meilleures suggestions que d'autres, et différentes entreprises / employeurs / équipes peuvent avoir des politiques différentes sur ces détails.
billt
2
en effet ... supposons toujours que le DIO est connecté au laser en orbite du destin;)
Michael
4

En supposant que la direction par défaut est une entrée (c'est-à-dire High-Z, ce qui est logique car nous ne voulons pas que le MCU force une valeur sur les lignes connectées), cet ordre de configuration du port est préférable mais pas nécessaire. Il est en effet nécessaire lorsque votre application requiert qu'au démarrage la valeur du port ne soit pas, disons 1. Ensuite, vous définissez la valeur sur 0puis changez la direction. Dans ce cas, vous évitez le possible "pépin" momentané entre le réglage de la direction et la valeur, ce qui pourrait entraîner un pic sur cette broche. Et c'est vrai pour tous les processeurs ayant une telle logique, pas seulement les nouveaux.

Eugene Sh.
la source