Erste Schritte STM32: Bitoperationen

Ein kleiner Exkurs ...


In der letzten Lektion haben wir uns angesehen, wo Sie anfangen sollen, wenn Sie sich für die STM32-Mikrocontroller entschieden haben: Einrichten einer IDE, Erstellen eines einfachen Projekts, Kompilieren eines Programms und Ausführen eines Programms. Nach dem Bewundern der blinkenden LEDs auf der Discovery-Karte)


Als ich einen neuen Artikel startete, plante ich, sofort mit einer detaillierten Analyse der Programmliste fortzufahren, bei der unsere LEDs abwechselnd blinkten. Als ich jedoch anfing zu schreiben, wurde mir plötzlich klar, dass es eine große Anzahl unbeantworteter Fragen gibt, die zur Programmüberprüfung führen würden vorzeitig. Und für mich selbst habe ich eine ganze Liste solcher Probleme identifiziert ::


  1. Was sind bitweise Operationen ? Wie benutzt man sie?
  2. Was sind Register und in welcher Beziehung stehen sie zu Bitoperationen?
  3. Woraus bestehen Mikrocontroller der STM32F0xx-Serie, wie wird getaktet und was sorgt für Leben im MK?
  4. Wie erfolgt die Initialisierung von MK , warum benötige ich eine Startdatei , was macht die SystemInit- Funktion? Erklärung an den Fingern.
  5. Woraus besteht die CMSIS-Bibliothek ? Wie navigiere ich? Was kann man daraus lernen und wie man es benutzt?

Aus der Betrachtung dieser Probleme möchte ich die Geschichte über die Programmierung von STM32 fortsetzen.


Liste der Artikel:
  1. Erste Schritte STM32 studieren oder Licht intelligent verwalten
  2. Erste Schritte STM32: Bitoperationen
  3. Erste Schritte STM32: Was sind Register? Wie arbeite ich mit ihnen?


Grundlegende logische Operationen


Gerade als ich anfing, Mikrocontroller zu studieren, erschienen mir die Wörter „Register“ und „Bitoperationen“ auf mysteriöse Weise mysteriös, und ich wollte mich lange Zeit nicht mit diesem Thema befassen. Aber als ich mehr oder weniger verstand, was es war, wurde mir klar, dass ich vergeblich das Studium eines so wichtigen Themas in einer entfernten Box aufschob. Bitoperationen sind wahrscheinlich die häufigsten Operationen in einem Mikrocontroller. Wenn wir wissen, wie und warum sie in unserer Arbeit verwendet werden können, eröffnen sich uns enorme Möglichkeiten, alles und jeden in unserem MK zu steuern!


Wir alle haben im Informatikunterricht in der Schule gelernt, was digitale Technologie ist, warum sie so genannt wird, welche grundlegenden Logikoperationen existieren. Alle modernen digitalen Technologien basieren auf binärer Mathematik und Logikschaltungen.

Ein Mikrocontroller arbeitet immer nur mit zwei Zuständen: "Null" - keine Spannung, "Eins" - Spannung. Lassen Sie uns unser Wissen über grundlegende logische Operationen ein wenig auffrischen. Sie bilden die Basis aller digitalen Technologien.


  • Konjunktion - wird als "logisches UND" oder "logische Multiplikation" bezeichnet . Tatsächlich ähnelt das Ergebnis der Ausführung dieser logischen Operation von zwei für die Ausdrücke A und B ihrer Multiplikation. Das heißt, der Ausdruck nimmt nur dann den Wert "1" an, wenn sowohl A als auch B den Wert "1" haben. In allen anderen Fällen ist der Wert "0". Kann mit AND, &&, AND, & bezeichnet werden
  • Disjunktion - wird als "logisches ODER" oder "logische Addition" bezeichnet . Das Ergebnis der Ausführung dieser logischen Zwei-Operation für die Ausdrücke A und B ähnelt ihrer Addition. Das heißt, der Ausdruck nimmt den Wert "1" an, wenn mindestens einer der Ausdrücke A und B den Wert "1" hat. Kann als OR, ||, OR, | bezeichnet werden.
  • Inversion - wird als "Logisches NICHT" oder "Verweigern" bezeichnet . Das Ergebnis der Ausführung dieser logischen Zweieroperation für Ausdruck A ist das Gegenteil. Das heißt, der Ausdruck nimmt den Wert 1 an, wenn Ausdruck A 0 ist und umgekehrt. Kann als NOT ,!, NOT, ~ bezeichnet werden.

  • Strikte Disjunktion - Bezeichnet als "Exklusiver ODER" oder "Logische Addition Exklusiver ODER" . Das Ergebnis der Ausführung dieser logischen Operation von zwei für die Ausdrücke A und B nimmt den Wert 1 an, wenn A und B unterschiedliche Werte haben. Kann als Exkl. Bezeichnet werden . ODER XOR, ^.

Bitoperationen


Bitoperationen sind fast identisch mit logischen Operationen, mit dem einzigen Unterschied, dass sie für Bits und Binärzahlen gelten.


Übrigens habe ich zur Vereinfachung des Studiums von Bitoperationen das 32-Bit-ASM-Rechnerprogramm von ManHunter verwendet . Mit diesem Programm können Sie die Ergebnisse von Bitoperationen überprüfen und Nummern von einem Zahlensystem zu einem anderen übertragen. Das Programm hat eine intuitive Benutzeroberfläche und nach dem Treffen ist das Programm eines der Hauptwerkzeuge in meiner Arbeit mit Mikrocontrollern geworden. Eine kleine Erklärung der Programmoberfläche finden Sie in der folgenden Abbildung:


Bitoperation "NICHT" - "~"

Wenn das Bit "1" ist, ist es nach dem Ausführen der Operation "NICHT" gleich "0" und umgekehrt. Die Operation wird sofort an allen Bits der Binärzahl ausgeführt. Invertieren Sie beispielsweise die FF-Nummer:



Bitoperation "UND" - "&"

Wenn beide Bits im Bit gleich "1" sind, ist nach Ausführung der Operation "UND" das Ergebnis im Bit gleich "1". Wenn jedoch mindestens eines der Bits "0" ist, ist das Ergebnis gleich "0". Die Operation wird auch bitweise ausgeführt. Beispiel: Multiplizieren Sie zwei Zahlen 0xFF0 und 0xF0F:


Als Ergebnis werden wir sehen, dass in den Kategorien, in denen es Einheiten in beiden Zahlen gab, das Ergebnis Einheiten war, in allen anderen Fällen - Nullen.

Betrachten Sie die Optionen für die praktische Anwendung:

  • In einer Situation, in der wir ein bestimmtes Bit oder eine bestimmte Bitgruppe auf Null zurücksetzen müssen , können wir eine Maske verwenden. Ich denke, es wird klarer sein, dies anhand eines Beispiels zu zeigen. Angenommen, wir nehmen eine Zahl und 0xF8F und brauchen das 7. Bit, um Null statt Einheit zu werden. Kein Problem, setzen Sie eine Maske auf und deaktivieren Sie das gewünschte Bit. Multiplizieren Sie die Zahlen und erhalten Sie das Ergebnis:

  • Wenn wir ein bestimmtes Bit in einer Zahl auf 0 oder 1 prüfen müssen , verwenden wir die Maske auch zum Multiplizieren. In der Maske setzen wir das Bit, das wir überprüfen möchten. Wenn das erforderliche Bit "0" ist, ist das Ergebnis der Berechnung "0", wenn "1", dann "1". Wenn wir herausfinden wollen, ob das 7. Bit gleich eins ist, erstellen wir die entsprechende Maske und multiplizieren unsere Zahl mit der Maske. Alles ist einfach:

    Wenn wir die Parität einer Zahl überprüfen müssen (dh die Fähigkeit einer Zahl, durch zwei teilbar zu sein), überprüfen wir das 1. Bit auf die gleiche Weise. Wenn es "1" ist, ist die Zahl ungerade, wenn es "0" gibt, ist die Zahl gerade. Probieren Sie es selbst aus, um Fähigkeiten zu trainieren und aufzubauen. Führen Sie diesen Test durch.

Die bitweise Operation "ODER" - "|"

Wenn eines oder beide der Bitpaare "1" ist, ist das Ergebnis "1". Wenn beide Bits gleich "0" sind, ist das Ergebnis "0". Das heißt, grob gesagt wird die Addition aller Einheiten in den Ziffern durchgeführt. Wenn wir beispielsweise zwei Zahlen 0xF8F und 0x7F hinzufügen, erhalten wir das folgende Ergebnis:



Betrachten Sie eine praktische Anwendung:
  • Wenn wir ein bestimmtes Bit in einer Zahl auf 1 setzen müssen , verwenden wir auch die Maske, um eine Addition durchzuführen. Um beispielsweise das 15. Bit in der Zahl 0xFF0 zu setzen, müssen Sie eine logische Additionsoperation ausführen, und wir erhalten das gewünschte Ergebnis:


Versuchen Sie, alleine mit verschiedenen Zahlen zu spielen und sehen Sie sich die Ergebnisse an.

Die EXKLUSIVE ODER bitweise Operation ist "^"

Wenn die Bits im Bit unterschiedlich und nicht gleich sind, ist das Ergebnis "1", andernfalls "0". Wenn wir zum Beispiel die XOR-Nummern 0xF8F und 0x7F verwenden, werden wir sehen, dass in den Bits, in denen es ausgezeichnete Bits gibt, das Ergebnis "1" ist und an Stellen, an denen die Bits gleich sind, ob es "0" oder "1" ist, "0" ", Am Ende erhalten wir folgendes Ergebnis:


Betrachten Sie die Optionen für die praktische Anwendung:

  • Wenn wir irgendwelche Bits in einer Zahl invertieren mussten , können wir die Maske verwenden, um dies einfach mit der XOR-Operation zu tun. Lassen Sie uns die 6. und 7. Stelle der Zahl 0xF8 mit der Maske 0xC0 invertieren. Sie können das Ergebnis im Bild sehen:

  • Es gibt Situationen, in denen es notwendig ist, zwei Register zu vergleichen und festzustellen, ob sie gleich sind oder nicht . In diesem Fall müssen wir Werte für XOR-Operationen registrieren. Wenn das Ergebnis "0" ist, sind die Register gleich, andernfalls sind sie nicht gleich:



Bitverschiebungsoperationen
Es gibt eine Reihe interessanter und manchmal äußerst nützlicher Bitoperationen, die als Verschiebungsoperationen bezeichnet werden . Sie können die Entladungen sowohl nach rechts als auch nach links verschieben. Während dieser Operation werden alle Bits der Binärzahl um die angegebene Anzahl von Positionen verschoben. In diesem Fall geht das höchstwertige Bit (ganz links) verloren, wenn die Verschiebung nach links geht, und "0" wird auf die niedrigstwertige (ganz rechts) geschrieben. Bei einer logischen Verschiebung nach rechts tritt die entgegengesetzte Situation ein: Das niederwertige Bit (ganz rechts) geht verloren und „0“ wird in das höherwertige Bit geschrieben. Darüber hinaus möchte ich darauf hinweisen, dass bei 32-Bit-Wörtern alle 32 Bit insgesamt verschoben sind. Betrachten Sie den Schaltvorgang genauer.


Linksverschiebung - "<<"

Wie die Verschiebung erfolgt, sehen Sie im Bild unten. Ich denke, dass alles ganz offensichtlich ist:


Bei einer binären Verschiebung können Sie eine interessante Funktion feststellen. Eine Verschiebung um eine Ziffer multipliziert unsere Zahl mit 2. Wenn wir unsere Zahl x um n Ziffern verschieben, erhalten wir x * (2 * n). Versuchen Sie, dieses Muster unabhängig über unser Dienstprogramm zum Zählen zu verfolgen. =)

Nach rechts verschieben - ">>"

Was sich aus einer Verschiebung nach rechts ergibt, spiegelt sich ganz deutlich im Bild wider:


Bei einer binären Verschiebung nach rechts können Sie feststellen, dass die Situation der Verschiebung nach links entgegengesetzt ist - die Zahl wird bei einer Verschiebung von 1 Stelle durch 2 s und dann durch 2 * n geteilt, wobei n die Anzahl der Bits ist, um die die Verschiebung vorgenommen wurde. Versuchen Sie auch, selbst mit Zahlen herumzuspielen, die offensichtlich vollständig in zwei geteilt sind. Und die Frage der Verfüllung - was wird das Ergebnis sein, wenn Sie die ungerade Zahl auf diese Weise teilen?

Wichtiger Hinweis . Wenn Sie eine Verschiebung für eine Variable mit einem negativen Vorzeichen (Vorzeichen) vornehmen, werden die frei gewordenen Positionen mit Einsen besetzt.

Abschließend ...


Für viele Anfänger mag dieses Thema wild langweilig erscheinen und es scheint überhaupt nicht klar zu sein, wo und wie dieses Wissen angewendet werden soll. Ich beeile mich, Sie zu beruhigen, wenn Sie den einen oder anderen Fuß des MK anheben oder einen Parameter in einen Thread in einer Peripherieeinheit oder einem Modul schreiben müssen - dort sind Kenntnisse über Bitoperationen überall erforderlich. Da sich der Artikel als ziemlich umfangreich herausstellte, werden wir die Berücksichtigung von Registern auf die nächste Lektion übertragen. Nun, in Zukunft können Sie diesen Artikel als Spickzettel verwenden.


Versuchen Sie als Hausaufgabe, unseren Programmcode im while (1) {...} -Block selbst zu analysieren, und verstehen Sie, wie wir unsere LEDs mit bitweisen Operationen ein- und ausschalten . Nun, in der nächsten Lektion werde ich Ihnen sagen, wie es wirklich passiert!



Liste der Artikel:
  1. Erste Schritte STM32 studieren oder Licht intelligent verwalten
  2. Erste Schritte STM32: Bitoperationen
  3. Erste Schritte STM32: Was sind Register? Wie arbeite ich mit ihnen?

Source: https://habr.com/ru/post/de406889/


All Articles