Comment et pourquoi lire des fiches techniques si les microcontrôleurs sont votre hobby

Comment et pourquoi lire des fiches techniques si les microcontrôleurs sont votre hobby

La microélectronique est une passion tendance ces dernières années grâce à la magie d'Arduino. Mais voilà le problème : avec un intérêt suffisant, il est facile de dépasser DigitalWrite(), mais que faire ensuite ? Ce n'est pas tout à fait clair. Les développeurs d'Arduino ont mis en œuvre de nombreux efforts pour abaisser le seuil d'entrée dans leur écosystème, mais au-delà se trouve encore la forêt sombre de la rude électronique, difficile d'accès pour l'amateur.

Prenons par exemple les fiches techniques. En théorie, elles contiennent tout ce qu'il faut, il suffit de les utiliser. Mais leurs auteurs ne semblent pas vraiment chercher à populariser les microcontrôleurs ; parfois, on a l'impression, qu'ils abusent délibérément de termes et d'abréviations obscures pour décrire des choses simples, afin de troubler au maximum le néophyte. Mais tout n'est pas si mauvais, avec un peu de bonne volonté, on peut s'y retrouver.

Dans cet article, je partagerai mon expérience de l'interaction d'un non-initié avec les fiches techniques pour des objectifs de loisirs. Le texte est destiné aux amateurs ayant dépassé le stade des premiers pas avec Arduino, et suppose une certaine connaissance des principes de fonctionnement des microcontrôleurs.

Je commencerai par un classique

Faire clignoter une LED sur Arduino

Et voici le code :

void setup() {
DDRB |= (1<<5);
}

void loop() {
PINB = (1<<5);
for (volatile uint32_t k=0; k<100000; k++);
}

« Qu'est-ce que c'est ? – demandera un lecteur averti. – Pourquoi écris-tu quelque chose dans le registre d'entrée PINB ? Il est supposé être en lecture seule ! » Effectivement, la documentation Arduino, comme la plupart des articles pédagogiques sur Internet, affirme que ce registre est en lecture seule. Je le pensais moi-même jusqu'à ce que je relise la fiche technique du Atmega328p en préparant cet article. Et là :

Comment et pourquoi lire des fiches techniques si les microcontrôleurs sont votre hobby

C'est une fonctionnalité relativement nouvelle, elle n'existait pas sur le Atmega8, et tout le monde n'est pas au courant ou ne la mentionne pas pour des raisons de rétrocompatibilité. Pourtant, elle est parfaitement adéquate pour démontrer que les fiches techniques doivent être lues pour utiliser toutes les capacités de la puce, y compris celles peu connues. Et ce n'est pas la seule raison.

Pourquoi lire les fiches techniques

En général, les utilisateurs d'Arduino, après avoir joué avec des LEDs et des AnalogWrite, commencent à connecter divers modules et puces à leur carte, pour lesquels des bibliothèques sont déjà écrites. Tôt ou tard, une bibliothèque apparaît qui ne fonctionne pas comme prévu. Alors, l'amateur commence à l'explorer pour la corriger, et là…

Il se passe quelque chose de totalement incompréhensible, donc il faut aller sur Google, lire de nombreux tutoriels, arracher par morceaux le code de quelqu'un d'autre qui convient et enfin parvenir à ses fins. Cela donne un puissant sentiment d'accomplissement, mais en réalité, le processus ressemble à l'invention du vélo par le reverse engineering d'une moto. Cela dit, on ne comprend pas mieux comment fonctionne ce vélo. Je sais, car j'y ai consacré pas mal de temps.

Si au lieu de cette occupation passionnante, j'avais passé quelques jours à étudier la documentation de l'Atmega328, j'aurais économisé énormément de temps. Après tout, c'est un microcontrôleur assez simple.

Ainsi, il faut lire les datasheets ne serait-ce que pour avoir une idée de la façon dont un microcontrôleur est structuré et de ce qu'il peut faire. Et aussi :

  • pour vérifier et optimiser les bibliothèques des autres. Elles sont souvent écrites par des amateurs qui réinventent la roue ; ou, au contraire, les auteurs ajoutent intentionnellement une protection excessive contre la bêtise. Qu'il y ait trois fois plus de lignes et que ce soit plus lent, tant que cela fonctionne.

  • pour avoir la possibilité d'utiliser dans le projet des puces pour lesquelles personne n'a écrit de bibliothèque ;

  • pour se faciliter la tâche de migration d'une gamme de microcontrôleurs à une autre ;

  • pour enfin optimiser mon ancien code qui ne rentrait pas dans l'Arduino ;

  • pour apprendre à contrôler n'importe quelle puce directement via ses registres, sans se soucier d'étudier le fonctionnement de ses bibliothèques, s'il y en a.

Pourquoi écrire directement dans les registres alors qu'il existe des HAL et des LL ?

Glossaire
HAL, High Abstraction Layer – bibliothèque pour gérer un microcontrôleur à un niveau d'abstraction élevé. Si vous devez utiliser l'interface SPI1, vous configurez et activez simplement SPI1, sans vous soucier des registres et de leurs fonctions.
LL, Low Level API – bibliothèque contenant des macros ou des structures avec les adresses des registres, permettant d'y accéder par leur nom. DDRx, PORTx, PINx sur l'Atmega – c'est du LL.

Des débats sur le thème « HAL, LL ou registres » se produisent régulièrement dans les commentaires sur Habré. Sans prétendre avoir accès à un savoir astral, je vais simplement partager mon expérience et mes réflexions d'amateur.

Après m'être à peu près familiarisé avec l'Atmega et avoir lu des articles sur les merveilles du STM32, j'ai acheté une demi-douzaine de cartes différentes – tant des Discovery que des « Tablettes Bleues », et même des puces pour mes propres créations. Elles sont restées deux ans dans une boîte. Parfois, je me disais : « c'est bon, ce week-end j'apprends le STM », je lançais CubeMX, générer un setup pour SPI, regardais ce mur de texte, abondamment agrémenté des copyright de STM, et décidais que c'était un peu trop.

Comment et pourquoi lire des fiches techniques si les microcontrôleurs sont votre hobby

Il est bien sûr possible de comprendre ce que CubeMX a écrit ici. Mais il est également clair qu'il est irréaliste de mémoriser toutes les formulations pour les réécrire manuellement par la suite. Et déboguer cela, si je oublie par hasard de cocher une case dans Cube, c'est une tout autre histoire.

Deux ans ont passé, et je reste toujours fasciné par ST MCU Finder des puces délicieuses mais incompréhensibles pour moi, et je suis tombé par hasard sur un excellent article, bien qu'il s'agisse de STM8. Et soudainement j'ai compris que pendant tout ce temps, je frappais à une porte ouverte : les registres des STM sont agencés comme ceux de n'importe quel autre microcontrôleur, et leur gestion ne nécessite pas Cube. Quoi, c'était possible comme ça ?

HAL et spécifiquement STM32CubeMX sont des outils pour les ingénieurs professionnels qui travaillent étroitement avec les puces STM32. Leur caractéristique principale est un haut niveau d'abstraction, permettant de migrer rapidement d'un microcontrôleur à un autre, voire d'un cœur à un autre, tout en restant dans la gamme STM32. Les amateurs rencontrent rarement de telles tâches – notre sélection de microcontrôleurs est généralement limitée à l'assortiment d'AliExpress, et nous migrons plus souvent entre des puces radicalement différentes – passant d'Atmega à STM, de STM à ESP, ou quoi que nos amis chinois nous proposent de nouveau.

Il reste LL – mais il n'y a qu'un pas à faire pour arriver aux registres. Personnellement, je trouve utile d'écrire mes propres macros avec les adresses des registres : cela m'oblige à étudier attentivement la fiche technique, à réfléchir à ce dont j'aurai besoin à l'avenir, à structurer mieux mes programmes, et en général, cela contribue à la mémorisation.

De plus, il y a un détail avec le populaire STM32F103 – il existe deux versions incompatibles de LL, l'une officielle de STM, l'autre de Leaf Labs, utilisée dans le projet STM32duino. Si l'on doit écrire une bibliothèque open-source (et c'était précisément mon objectif), il faut soit créer deux versions, soit accéder directement aux registres.

Enfin, abandonner le LL simplifie, à mon avis, la migration, surtout si l'on se prépare dès le début du projet. Un exemple exagéré : écrivons un blink Arduino dans Atmel Studio sans LL :

#include <stdint.h>

#define _REG(addr) (*(volatile uint8_t*)(addr))

#define DDR_B 0x24
#define OUT_B 0x25

int main(void)
{
    volatile uint32_t k;

    _REG(DDR_B) |= (1<<5);

    while(1)
    {
        _REG(OUT_B) |= (1<<5);
        for (k=0; k<50000; k++);
        _REG(OUT_B) &= ~(1<<5);
        for (k=0; k<50000; k++);
    } 
}

Pour que ce code fasse clignoter la LED sur une carte chinoise avec STM8 (à partir de ST Visual Desktop), il suffit de changer deux adresses :

#define DDR_B 0x5007
#define OUT_B 0x5005

Oui, j'utilise la particularité de connexion de la LED sur cette carte spécifique, elle clignotera très lentement, mais elle clignotera !

Quels types de fiches techniques existent ?

Dans les articles et sur les forums, tant en russe qu'en anglais, les « fiches techniques » désignent toute documentation technique sur des puces, et c'est ainsi que je procède dans ce texte. Techniquement, elles ne sont qu'un des types de cette documentation :

Fiche technique – spécifications techniques, caractéristiques tactiques et techniques. Présent chez tout composant électronique. Informations de référence, il est utile de les avoir à portée de main, mais il n'y a pas grand-chose à y lire attentivement. Cependant, les puces plus simples se contentent souvent d'une fiche technique pour éviter de multiplier les documents ; dans ce cas, Manuel de référence est inclus ici également.

Manuel de référence – la véritable instruction, un gros livre de 1000+ pages. Elle décrit en détail le fonctionnement de tout ce qui est intégré dans la puce. Le principal document pour maîtriser le microcontrôleur. Contrairement à la fiche technique, les instructions sont rédigées pour une large gamme de microcontrôleurs, contenant beaucoup d'informations sur la périphérie absente de votre modèle spécifique.

Manuel de programmation ou Manuel de l'ensemble d'instructions – instructions sur les commandes uniques du microcontrôleur. Destinée à ceux qui programment en Assembleur. Les auteurs de compilateurs l'utilisent activement pour optimiser le code, donc en général, nous n'en aurons pas besoin. Cependant, il est utile d'y jeter un œil pour une compréhension générale, pour certaines commandes spécifiques comme la sortie d'interruption, ainsi que lors d'une utilisation active du débogueur.

Note d'application – conseils utiles pour résoudre des tâches spécifiques, souvent avec des exemples de code.

Feuille d'errata – description des cas de comportement non standard de la puce avec des solutions, s'il y en a.

Que contient les fiches techniques ?

Directement dans Fiche technique nous pourrions avoir besoin des sections suivantes :

Résumé du dispositif – la première page de la fiche technique donne un aperçu de l'appareil. Très utile dans les situations où vous avez trouvé une puce quelque part (vue en magasin, dess soudée, mention rencontrée) et que vous voulez comprendre ce que c'est.

Description générale – une description plus détaillée des capacités des puces de la série.

Pinouts – schémas de brochage pour tous les boîtiers de puce possibles (la pince correspondante sur quelle patte).

Pin Description – description de l'attribution et des capacités de chaque broche.

Memory Map – la carte d'adresses en mémoire ne sera probablement pas nécessaire, mais elle inclut parfois un tableau des adresses des blocs de registres.

Register Map – le tableau d'adresses des blocs de registres se trouve généralement dans la fiche technique, tandis que le Ref Manual – ne mentionne que les décalages (address offsets).

Electrical Characteristics – dans cette section, nous nous intéressons d'abord aux absolute maximum ratings, énumérant les charges maximales sur la puce. Contrairement à l'Atmega328p indestructible, la plupart des MC ne permettent pas de connecter des charges importantes aux broches, ce qui devient une surprise désagréable pour les utilisateurs d'Arduino.

Package Information – dessins des boîtiers disponibles, utiles lors de la conception de vos cartes.

Manuel de référence se compose structurellement de sections dédiées à des périphériques spécifiques mentionnés dans leur titre. Chaque chapitre peut être divisé en trois parties :

Vue d'ensemble, Introduction, Features – aperçu des capacités du périphérique;

Functional Description, Usage Guide ou simplement le bloc principal de la section – une description textuelle détaillée des principes de fonctionnement du périphérique et des façons de l'utiliser ;

Registers – description des registres de contrôle. Dans des cas simples type GPIO ou SPI, cela peut suffire pour commencer à utiliser le périphérique, mais il est souvent nécessaire de lire également les parties précédentes.

Comment lire les fiches techniques

Les fiches techniques peuvent effrayer par leur volume et leur jargon. En réalité, tout n'est pas si terrible si l'on connaît quelques astuces.

Installez un bon lecteur PDF. Les fiches techniques sont rédigées dans la grande tradition des manuels papier, il est agréable de les imprimer, de les marquer avec des onglets en plastique et de les relier. Les hyperliens y sont très rares. Heureusement, au moins la structure du document est formalisée par des signets, donc un bon lecteur avec une navigation pratique est essentiel.

Une fiche technique n'est pas un manuel de Stroustrup, vous n'avez pas besoin de tout lire. Si vous avez suivi le conseil précédent, il suffit de trouver la section souhaitée dans le panneau des signets.

Les fiches techniques, en particulier les manuels de référence, peuvent décrire les capacités non d'une puce spécifique, mais de toute la série. Cela signifie que la moitié, voire deux tiers de l'information, n'a rien à voir avec votre puce. Avant d'étudier les registres TIM7, vérifiez si Description générale, vous en avez un.

Savoir l'anglais suffit au niveau de base. Les fiches techniques sont à moitié composées de termes inconnus pour un locuteur moyen de la langue, et à moitié de constructions simples. Il existe également de belles fiches techniques en anglais chinois, où la moitié contient également des termes, et l'autre moitié est un ensemble aléatoire de mots.

Si vous rencontrez un mot inconnu, ne tentez pas de le traduire à l'aide d'un dictionnaire anglais-russe. Si ça vous laisse perplexe, hystérésis, le mot « hystérésis » ne vous apportera pas de chaleur. Utilisez Google, Stack Overflow, Wikipédia, des forums où le concept nécessaire sera expliqué en des termes simples avec des exemples..

La meilleure façon de comprendre ce que vous lisez est de tester en pratique.Donc, gardez à portée de main la carte de développement avec laquelle vous vous familiarisez, voire deux, au cas où vous ne comprendriez pas quelque chose et verriez de la fumée magique.

C'est une bonne habitude de garder une fiche technique à portée de main lorsque vous lisez un tutoriel de quelqu'un ou étudiez une bibliothèque étrangère. Il est tout à fait possible que vous y trouviez une solution plus optimale à votre problème. Et inversement, si vous ne parvenez pas à comprendre comment fonctionne le registre à partir de la fiche technique, faites-en une recherche sur Google : il est probable que quelqu'un ait déjà tout décrit en des termes simples ou a laissé du code compréhensible sur GitHub.

Glossaire

Quelques mots et abréviations utiles pour vous aider à vous familiariser plus rapidement avec les fiches techniques. Ce qui m'est venu à l'esprit ces derniers jours, les ajouts et corrections sont les bienvenus.

Électricité
Vcc, Vdd – « plus », alimentation
Vss, Vee – « moins », terre
courant – courant
tension – tension
à la terre du courant – travailler comme « terre » pour une charge externe
pour alimenter le courant – alimenter une charge externe
broche à forte capacité d'absorption/fourniture – broche avec une haute « tolérance » à la charge

IO
H, Haut – sur la broche Vcc
L, Bas – sur la broche Vss
Haute Impédance, Hi-Z, flottant – sur la broche, il n'y a rien, « haute résistance », il est en fait invisible au monde extérieur.
faible tirage vers le haut, faible tirage vers le bas – résistance de tirage/stigmatique intégrée, équivalent approximatif de 50 kΩ (voir la fiche technique). Utilisé par exemple pour empêcher la broche d'entrée de flotter dans l'air, provoquant des déclenchements indésirables. Faible – car il est facile à « écraser ».
push pull – mode de sortie de la broche, dans lequel elle commute entre Couverture d'ombre du soleil et Faible – sortie normale avec Arduino.
drain ouvert – désignation du mode de sortie où la broche peut être soit Faible, ou bien haute impédance / flottante. Dans ce cas, ce n'est presque jamais un véritable drain ouvert, il y a des diodes de protection, des résistances, etc. C'est simplement une désignation du mode terre / rien.
vrai drain ouvert – et voici le vrai drain ouvert : la broche conduit directement à la terre si elle est ouverte, ou reste en suspension si elle est fermée. Cela signifie qu'il est possible de faire passer une tension supérieure à Vcc, mais le maximum est tout de même stipulé dans la fiche technique au chapitre Données maximales absolues / Tension.

Interfaces
en série – connectés en série
pour chaîner – assembler des puces en chaîne par connexion série, augmentant le nombre de sorties.
décalage – décalage, désigne généralement un décalage de bits. Par conséquent, pour décaler à l'intérieur et pour décaler à l'extérieur – recevoir et transmettre des données bit à bit.
verrou – un verrou qui couvre le tampon lorsque des bits sont décalés à travers lui. Une fois la transmission terminée, le verrou s'ouvre et les bits commencent à travailler.
pour chronométrer l'entrée – effectuer une transmission bit à bit, décaler tous les bits aux emplacements requis.
double tampon, registre d'ombre, registre de préchargement – désignations qui indiquent qu'un registre doit pouvoir accepter de nouvelles données, mais les retenir jusqu'à un certain moment. Par exemple, pour un fonctionnement correct du PWM, ses paramètres (cycle de travail, fréquence) ne doivent pas changer tant que le cycle actuel n'est pas terminé, mais de nouveaux paramètres peuvent déjà être transmis. Ainsi, les paramètres actuels sont maintenus dans registre d'ombre, tandis que les nouveaux vont dans registre de préchargement, étant enregistrés dans le registre correspondant de la puce.

Divers
diviseur de fréquence – prédiviseur de fréquence
pour définir un bit – mettre un bit à 1
pour effacer / réinitialiser un bit – réinitialiser un bit à 0 (réinitialisation – fonctionnalité des fiches techniques STM)

Que faire ensuite

En réalité, une partie pratique était prévue avec la démonstration de trois projets sur STM32 et STM8, spécialement réalisés pour cet article à l'aide des fiches techniques, avec des ampoules, SPI, minuteries, PWM et interruptions :

Comment et pourquoi lire des fiches techniques si les microcontrôleurs sont votre hobby

Mais le texte est trop long, donc les projets seront envoyés dans une deuxième partie.

La compétence en lecture des fiches techniques vous aidera avec votre hobby, mais elle ne remplacera guère les échanges en direct avec des collègues passionnés sur des forums et des chats. Il est nécessaire, en premier lieu, d'améliorer son anglais. Donc, pour ceux qui ont lu jusqu'au bout – un prix spécial : deux leçons gratuites sur Skyeng lors du premier paiement avec le code HABR2.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster