Une petite digression ...
Dans la dernière leçon, nous avons examiné par où commencer si vous décidiez d'étudier les microcontrôleurs STM32: comment configurer un IDE, comment créer un projet simple, comment compiler un programme et comment exécuter un programme. Après avoir admiré les LED clignotantes sur la carte Discovery)
En commençant un nouvel article, je prévoyais de passer immédiatement à une analyse détaillée de la liste des programmes, ce qui a fait clignoter nos LED alternativement, mais quand j'ai commencé à écrire, je me suis soudain rendu compte qu'il y avait un grand nombre de questions sans réponse auxquelles il serait nécessaire de procéder à l'examen du programme prématurément. Et pour moi, j'ai identifié toute une liste de ces problèmes :
- Quelles sont les opérations au niveau du bit ? Comment les utiliser?
- Que sont les registres et comment sont-ils liés aux opérations sur les bits?
- En quoi consistent les microcontrôleurs de la série STM32F0xx, comment s'effectue le cadencement et qu'est-ce qui assure la vie à l'intérieur du MK?
- Comment se déroule l'initialisation de MK , pourquoi ai-je besoin d'un fichier de démarrage , que fait la fonction SystemInit ? Explication sur les doigts.
- En quoi consiste la bibliothèque CMSIS ? Comment y naviguer? Que peut-on en tirer et comment l'utiliser?
C'est à partir de l'examen de ces questions que je voudrais continuer l'histoire de la programmation de STM32.
Liste d'articles:
- Mise en route Étudier STM32 ou gérer la lumière intelligemment
- Mise en route STM32: opérations sur les bits
- Mise en route STM32: Que sont les registres? Comment travailler avec eux?
Opérations logiques de base
Commençant à peine à étudier les microcontrôleurs, les mots «enregistrer» et «opérations de bits» me semblaient mystérieusement mystérieux et pendant longtemps je n'ai pas voulu passer à ce sujet. Mais quand j'ai plus ou moins compris ce que c'était, j'ai réalisé que je mettais en vain l'étude d'un sujet aussi important dans une boîte éloignée. Les opérations sur les bits sont probablement les opérations les plus courantes dans un microcontrôleur et savoir comment et pourquoi elles peuvent être utilisées dans notre travail nous ouvrira un énorme potentiel pour contrôler tout et tout dans notre MK!
Nous tous, lors des cours d'informatique à l'école, nous sommes familiarisés avec ce qu'est la technologie numérique, pourquoi elle s'appelle ainsi, quelles sont les opérations logiques de base. Toutes les technologies numériques modernes sont basées sur des mathématiques binaires et des circuits logiques.
Un microcontrôleur fonctionne toujours avec seulement deux états: «zéro» - pas de tension, «un» - tension. Rafraîchissons un peu notre connaissance des opérations logiques de base. ils constituent la base de toute technologie numérique.
- Conjonction - est désignée comme "ET logique" ou "Multiplication logique" . En fait, le résultat de cette opération logique de deux pour les expressions A et B est similaire à leur multiplication. Autrement dit, l'expression prendra la valeur «1» uniquement si A et B ont tous deux la valeur «1». Dans tous les autres cas, la valeur sera "0". Peut être désigné par AND, &&, AND, &
- Disjonction - est désigné comme «OU logique» ou «Addition logique» . Le résultat de l'exécution de ces deux opérations logiques pour les expressions A et B est similaire à leur ajout. C'est-à-dire que l'expression prendra la valeur "1" si au moins une des expressions A et B a la valeur "1". Peut être désigné par OR, ||, OR, |.
- Inversion - est désigné comme «NON logique» ou «déni» . Le résultat de cette opération logique de deux pour l'expression A est le contraire. Autrement dit, l'expression prendra la valeur 1 si l'expression A est 0 et vice versa. Peut être désigné comme NON,!, PAS, ~.
- Disjonction stricte - Désigné comme «OU exclusif» ou «OU exclusif exclusif logique» . Le résultat de l'exécution de cette opération logique de deux pour les expressions A et B prendra la valeur 1 si A et B ont des valeurs différentes. Peut être désigné comme excl. OU, XOR, ^.
Opérations sur les bits
Les opérations sur les bits sont presque les mêmes que les opérations logiques, à la seule différence qu'elles s'appliquent aux bits et aux nombres binaires.
Soit dit en passant, pour simplifier l'étude des opérations sur les bits, j'ai utilisé le programme de calcul ASM 32 bits de ManHunter . En utilisant ce programme, vous pouvez vérifier les résultats des opérations sur les bits, transférer des numéros d'un système numérique à un autre. Le programme a une interface intuitive et après avoir rencontré le programme est devenu l'un des principaux outils dans mon travail avec les microcontrôleurs. Une petite explication de l'interface du programme est donnée dans l'image ci-dessous:
Opération de bit "NOT" - "~"
Si le bit est «1», après avoir effectué l'opération «NON», il sera égal à «0» et vice versa. L'opération est immédiatement effectuée sur tous les bits du nombre binaire. Par exemple, inversez le numéro FF:
Opération sur les bits "ET" - "&"
Si les deux bits du bit sont égaux à «1», après l'opération «ET», le résultat dans le bit sera égal à «1», mais si au moins l'un des bits est «0», le résultat sera égal à «0». L'opération est également effectuée au niveau du bit. Par exemple, «multipliez» deux nombres 0xFF0 et 0xF0F:
En conséquence, nous verrons que dans les catégories où il y avait des unités dans les deux nombres, le résultat était des unités, dans tous les autres cas - des zéros.
Considérez les options d'application pratique:
- Dans une situation où nous devons remettre à zéro un bit ou un groupe de bits spécifique, nous pouvons utiliser un masque. Je pense qu'il sera plus clair de le montrer avec un exemple. Supposons que nous prenons un nombre et 0xF8F et que nous ayons besoin que le 7e bit devienne zéro au lieu de l'unité. Pas de problème, mettez un masque et décochez le bit souhaité. Multipliez les nombres et obtenez le résultat:
- Si nous devons vérifier un bit spécifique dans un nombre pour 0 ou 1 - nous utilisons également le masque pour multiplier. Dans le masque, nous définissons le bit que nous aimerions vérifier. Si le bit requis est "0", alors le résultat du calcul sera "0", si "1" alors, respectivement, "1". Si nous voulons savoir si le 7e bit est égal à un, nous faisons le masque correspondant et multiplions notre nombre par le masque. Tout est simple:
Si nous devons vérifier la parité d'un nombre (c'est-à-dire la capacité d'un nombre à être divisé par deux), alors nous vérifions le 1er bit de la même manière, s'il est "1", alors le nombre est impair, s'il y a "0" alors le nombre est pair. Essayez-le vous-même, afin de former et de développer des compétences, faites ce test.
L'opération au niveau du bit "OR" - "|"
Si un ou les deux de la paire de bits est "1" alors le résultat sera "1", sinon si les deux bits sont égaux à "0" alors le résultat sera "0". Autrement dit, l'addition de toutes les unités dans les chiffres est effectuée. Par exemple, si nous ajoutons deux nombres 0xF8F et 0x7F, nous obtenons le résultat suivant:
Considérons une application pratique:
- Si nous devons définir un bit spécifique dans un nombre à 1 , nous utilisons également le masque pour effectuer l'addition. Par exemple, pour définir le 15e bit dans le nombre 0xFF0, vous devez effectuer une opération d'addition logique et nous obtiendrons le résultat souhaité:
Essayez de jouer avec différents numéros par vous-même et regardez les résultats.
L'opération bit à bit EXCLUSIVE OR est "^"
Si les bits du bit sont différents et différents, le résultat sera «1», sinon «0». Par exemple, si nous faisons des nombres XOR 0xF8F et 0x7F, alors nous verrons que dans les bits dans lesquels il y a d'excellents bits, alors le résultat est «1» et aux endroits où les bits sont les mêmes, que ce soit «0» ou «1», il s'avère «0 ", Au final on obtient le résultat suivant:
Considérez les options d'application pratique:
- Si nous avions besoin d' inverser des bits dans un nombre , nous pouvons utiliser le masque pour le faire facilement en utilisant l'opération XOR. Faisons l'inversion des 6e et 7e chiffres du nombre 0xF8 en utilisant le masque 0xC0. Vous pouvez voir le résultat dans l'image:
- Il existe des situations où il est nécessaire de comparer deux registres et de déterminer s'ils sont égaux ou non . Dans ce cas, nous devons enregistrer des valeurs dans les opérations XOR. Si le résultat est «0», alors les registres sont égaux, sinon ils ne sont pas égaux:
Opérations de décalage de bits
Il existe un certain nombre d'opérations binaires intéressantes et parfois extrêmement utiles appelées opérations de décalage . Vous pouvez déplacer les décharges à droite et à gauche. Au cours de cette opération, tous les bits du nombre binaire sont décalés du nombre de positions spécifié, dans ce cas, si le décalage va vers la gauche , le bit le plus significatif (le plus à gauche) est perdu et «0» est écrit au moins significatif (le plus à droite). Avec un décalage logique vers la droite, la situation inverse se produit - le bit le moins significatif (le plus à droite) est perdu et "0" est écrit sur le plus élevé. De plus, je voudrais noter que dans le cas des mots de 32 bits, tous les 32 bits sont décalés dans leur ensemble. Examinez l'opération de décalage plus en détail.
Maj gauche - "<<"
Vous pouvez voir comment le décalage se produit dans l'image ci-dessous. Je pense que tout est assez évident:
Avec un décalage binaire, vous pouvez remarquer une fonctionnalité intéressante. Un décalage d'un chiffre multiplie notre nombre par 2. Si nous décalons notre nombre x de n chiffres, alors nous obtenons x * (2 * n). Essayez de suivre indépendamment ce modèle via notre utilitaire de comptage. =)
Déplacer vers la droite - ">>"
Ce qui résulte d'un décalage vers la droite se reflète assez clairement dans l'image:
Avec un décalage binaire vers la droite, vous pouvez remarquer que la situation est l'opposé d'un décalage vers la gauche - le nombre est divisé par 2 s à un décalage de 1 chiffre et après par 2 * n, où n est le nombre de bits par lesquels le décalage a été effectué. Essayez également de jouer avec les chiffres vous-même, qui sont évidemment divisés en 2 complètement. Et la question du remblayage - quel sera le résultat si vous divisez le nombre impair de cette façon?
Remarque importante . Si vous modifiez une variable avec un signe négatif (signé), les postes vacants seront remplis de postes.
En conclusion ...
Pour de nombreux débutants, ce sujet peut sembler extrêmement ennuyeux et il peut sembler que ce ne soit pas clair du tout où et comment appliquer ces connaissances. Je m'empresse de vous rassurer, dans les situations où vous devez soulever l'un ou l'autre pied du MK ou écrire un paramètre sur un thread dans un bloc ou module périphérique - là, la connaissance des opérations sur les bits sera requise tout autour. Étant donné que l'article s'est révélé assez volumineux, nous transférerons l'examen des registres à la prochaine leçon. Eh bien, à l'avenir, vous pouvez utiliser cet article comme une feuille de triche.
Pour vos devoirs, essayez d'analyser vous-même notre code de programme dans le bloc while (1) {...} et comprenez comment nous allumons et éteignons nos LED avec des opérations au niveau du bit . Eh bien, dans la prochaine leçon, je vais vous expliquer comment cela se passe vraiment!
Liste d'articles:
- Mise en route Étudier STM32 ou gérer la lumière intelligemment
- Mise en route STM32: opérations sur les bits
- Mise en route STM32: Que sont les registres? Comment travailler avec eux?