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:
- Pourquoi l'ordre d'initialisation est-il important sur les nouveaux processeurs?
- Pourquoi l'ordre d'initialisation n'a-t-il pas d'importance sur les anciens processeurs?
- De quels registres parlent-ils dans les processeurs modernes?
- De quel registre unique parlent-ils sur les anciens processeurs?
Si quelqu'un pouvait fournir une sorte de diagramme, ce serait encore mieux.
Réponses:
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 :
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 .
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 ):
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.
la source
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.
la source
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 sur0
puis 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.la source