Stm8 Entrées-sorties générales
Pile
18/09/2019
Les entrées-sorties générales
Les ports d'entrées-sorties généraux ("General Purpose Input Output") permettent de transférer des données entre le micro-contrôleur et le monde extérieur.
Un port peut gérer jusqu'à 8 lignes de données (patte du chip). Chaque ligne peut être programmées individuellement comme une entrée binaire ou une sortie binaire.
Alternativement quelques ports peuvent être programmés dans des fonctions alternatives comme des entrées analogiques, des entrées d'interruption.
Une patte ne peut être affectée qu'à une seule fonction alternative.
Chaque port dispose d'un registre de sortie de donnée, un registre d'entrée de donnée, un registre de sens de donnée et deux registres de configuration.
On dispose de nombreuses options
- Chaque bit peut être programmé individuellement
- Une entrée pourra être configurée en entrée flottante ou entrée avec tirage
- Une sortie pourra être configurée en push-pull ou (pseudo) collecteur ouvert
- Les registres de lecture et d'écriture sont séparés
- Choix alternatifs des fonctions de chaque patte
- Possibilité de lire, modifier et écrire un registre de sortie
- Entrées tolérante au +5V Le STM8S105C6 dispose de 38 lignes d’entrées-sorties regroupées en 6 ports :
- Port A : 6 lignes
- Port B : 8 lignes
- Port C : 7 lignes
- Port D : 8 lignes
- Port E : 7 lignes
- Port G : 2 lignes Certains ports ne gèrent pas les 8 lignes disponibles, cela résulte d'un choix économique d'adoption d'un boîtier de 48 broches. =Principe de fonctionnement= Pour le processeur, le port se présente comme un ensemble de 5 registres accessibles par une adresse spécifique dans l'espace d'adressage. On distingue les 2 registres destinés aux échanges de données : soit en entrée soit en sortie, et les 3 registres de configuration permettant de préciser les fonctions des lignes du port en question. ==Technologie de support== Étant donné que chaque ligne peut-être soit une entrée soit une sortie, le fabriquant du micro-contrôleur inclut dans son masque pour chaque ligne les deux circuits électroniques permettant de réaliser la fonction d'entrée d'une part et la fonction de sortie d'autre part.
- Lorsque la ligne est exploitée en sortie l’élément physique mis en œuvre est une bascule. Le contenu de cette bascule n’est modifiable que par le processeur qui utilise alors le bus de données lors de l’exécution de l’instruction d’écriture. Les contenus de toutes les bascules d’un port sont modifiés en même temps. Il est aussi possible de relire la valeur écrite.
- Lorsque la ligne est exploitée en entrée l’élément physique mis en œuvre est une interface haute impédance ou 3 états ou tristate. Lors de l’exécution de l’instruction de lecture le processeur active cette interface haute impédance, ce qui permet à l’état logique de l’environnement de se trouver sur le bus de données pour parvenir au processeur dans l’accumulateur A.

Ce sont les bits d'un registre de contrôle qui activent soit un circuit, soit l'autre.
Les lignes sont regroupées par ensemble de 8 ou autre pour constituer un port, ce qui permet au processeur de faire, en une fois, des échanges de 8 bits comme le permet la taille du bus de données.
Fonctions alternatives
Les périphériques du microcontrôleur ont très souvent besoin d’échanger des données avec l’environnement, c’est notamment le cas pour les échanges en série ou certaines fonctions des temporisateurs.
Dans ce cas certaines lignes d’entrées-sorties sont dédiées à cet usage exclusif, elles ne peuvent plus être utilisées comme entrée-sortie générale.
Par exemple pour les échanges en série gérés par l’UART 2 les données sortantes passent par la ligne 5 du port D et les données entrantes passent par la ligne 6 du port D.
Structure physique et constituants des lignes GPIO
Chaque ligne devant pouvoir être exploitée soit en entrée soit en sortie elle comportera tous les constituants nécessaires pour chaque fonction, ceux-ci seront raccordés à la broche [ pin ] correspondante du boîtier.
De façon globale il y a d’une part une partie logique en relation directe avec le bus de données et les signaux de contrôle du processeur et d’autre part une partie analogique qui assure l’interface avec l’environnement extérieur.
Constituants de la sortie
La partie logique d’une ligne est constituée d’une bascule de type D et d’une logique combinatoire de 5 portes permettant de piloter les 2 transistors MOSFET. La bascule est intégrée dans le registre ODR qui en contient au maximum 8.
L’entrée DATA de la bascule est directement raccordée à un des 8 conducteurs du bus de données, l’entrée CLOCK est raccordée à la sortie d’un système logique qui génère un signal logique actif lorsque le processeur fournit l’adresse du port (précédemment configuré en sortie) ET le signal d’écriture WR. Le système logique est donc un décodeur d’adresses.
Cette adresse est $ 5000 pour le port A, c’est celle du registre ODR ; pour le port B c’est $ 5005
La partie analogique est constituée de 2 transistors MOSFET, un avec canal N relié à la masse et un avec canal P relié à l’alimentation VDD. Ces 2 transistors font partie de la zone PAD.
Dans un fonctionnement en mode Push Pull ces 2 transistors seront alternativement conducteurs ou bloqués suivant l’état logique imposé par la bascule sur leur grille et les options définies par les registres de configuration DDR et CR1.
État logique 1
Il faut que la tension disponible au niveau de la broche de sortie soit la plus proche possible de la tension d’alimentation. Le courant circule donc de VDD vers la broche à travers le transistor MOSFET canal P. La valeur de ce courant IOH est limitée par la valeur de la charge extérieure appliquée à la ligne et la résistance interne RDSON du transistor MOSFET canal P : courant de type source car il sort de la ligne.
État logique 0
Il faut que la tension disponible au niveau de la broche de sortie soit la plus proche possible de la masse. Le courant circule donc de la charge extérieure vers la broche puis à travers le transistor MOSFET canal N vers la masse. La valeur de ce courant IOL est limitée par la valeur de la charge et la résistance interne RDSON du transistor MOSFET canal N, c’est un courant de type sink car il entre dans la ligne.
Ce type de fonctionnement, caractérisé par le fait que pour l’état logique 1 le courant sort de la ligne et que pour l’état logique 0 il entre dans la ligne, est appelé mode Push Pull.
| État logique de la bascule | Tension de sortie au niveau de la broche | Transistor canal P | Transistor NMOS | Etat de sortie de la porte 4 | Etat de sortie de la porte 5 |
|---|---|---|---|---|---|
| 1 | VDD | conducteur | bloqué | 0 | 0 |
| 0 | VSS | bloqué | conducteur | 1 | 1 |
Constituants de l’entrée
La partie logique est réduite à une interface haute impédance. Elle est intégrée dans le registre IDR qui en contient au maximum 8.La sortie de cette interface est directement raccordée à un des 8 conducteurs du bus de données.
Le signal de commande qui rend passante cette interface est généré par un système logique généré lorsque le processeur fournit l’adresse du port (précédemment configuré en entrée) ET le signal de lecture RD. Le système logique est donc un décodeur d’adresses.
Cette adresse est $ 5001 pour le port A, c’est celle du registre IDR ; pour le port C c’est $ 500A.
La partie analogique est limitée à une résistance optionnelle de 50 KOhm utilisable sur demande (voir le registre CR1). Cette résistance est appelée résistance de PULL UP, elle permet d’exploiter des signaux logiques qui ne sont définis que pour l’état logique 0. C’est le cas par exemple d’un bouton-poussoir.
| Registre | Adresse relative | Description |
|---|---|---|
| ODR | 0x00 | Output data register (Px_ODR) |
| IDR | 0x01 | Input Data Register |
| DDR | 0x02 | Data Direction Register (Px_DDR): 0 input mode, 1 output mode |
| CR1 | 0x03 | Control Register 1 (Px_CR1): input mode 0 floating input 1 w pull-up |
| output mode 0 pseudo open drain, 1 Push-pull | ||
| CR2 | 0x04 | Control Register 2 (Px_CR2): input mode 0 w/o ext.interrupt, 1 < ext.interrupt |
| output mode 0 speed up to 2MHz, 1 speed up to 10MHz |
Initialisation des lignes GPIO
Pendant la phase d'initialisation on définit le rôle de chacune des lignes d'un port.
| Mode | DDRx | CR1x | CR2x | Function | Pull-up | P-buffer | Diodes | |
|---|---|---|---|---|---|---|---|---|
| to VDD | to VSS | |||||||
| Input | 0 | 0 | 0 | Floating without interrupt | Off | Off | On | On |
| 0 | 1 | 0 | Pull-up without interrupt | On | ||||
| 0 | 0 | 1 | Floating with interrupt | Off | ||||
| 0 | 1 | 1 | Pull-up with interrupt | On | ||||
| Output | 1 | 0 | 0 | Open drain output Off | Off | |||
| 1 | 1 | 0 | Push-pull output | On | ||||
| 1 | 0 | 1 | Open drain output, fast mode | Off | ||||
| 1 | 1 | 1 | Push-pull, fast mode | Off | On | |||
| 1 | x | x | True open drain (on specific pins) | Not implemented | Not im-plemented |
Exploitation des lignes GPIO
L’exploitation des lignes GPIO nécessite de connaître un certain nombre de règles.
La configuration des lignes à utiliser est la 1re chose à faire et ne se fait qu’une fois. Celle-ci se fait par logiciel. Les 2 registres concernés sont DDR et CR1.
Cette configuration dépend des éléments physiques de l’environnement raccordés aux différentes lignes de chaque port et de leur technologie. Par défaut toutes les lignes sont configurées en entrée.
Les actions concernant les sorties peuvent être faites à tout moment. C’est l’exécution de l’instruction qui conduira au changement d’état au niveau de la broche associée à la ligne concernée.
Certaines actions peuvent ne concerner que certaines lignes d’un port, il importe alors de ne pas modifier l’état des lignes du port non concernées par l’action. Pour cela il est indispensable de faire des actions limitées à un ou plusieurs bits [ bit wise ]. La technique à appliquer est la suivante :
- lire les états logiques présents dans un registre (DDR par exemple),
- faire une opération de masquage ( fonction ET ou bien OU suivant l’état à imposer ) avec une constante,
- copier le résultat obtenu dans ce même registre (DDR).
Par exemple
LD A,P2_DDR ; Data Direction Register du Port 2 AND A,#$06 ; Lignes 1 et 2 en sortie LD P2_DDR,A ; Les autres lignes sont inchangées
Les actions concernant les entrées sont à faire lorsque l’on est sûr que les états logiques à acquérir sont stables.
Ceci peut conduire à devoir mettre en œuvre un signal supplémentaire qui informera le processeur de la stabilité des états logiques : c’est le cas lorsque ces états correspondent à des valeurs exprimées sur n bits.
La lecture du registre IDR fournit les états logiques de toutes les lignes du port. Seuls les états logiques correspondant aux lignes configurées en entrées sont intéressantes, il faut donc masquer (fonction ET) les valeurs des bits des lignes configurées en sortie.