Wie und warum man Datenblätter liest, wenn Mikrocontroller Ihr Hobby sind

Wie und warum man Datenblätter liest, wenn Mikrocontroller Ihr Hobby sind

Mikroelektronik ist ein beliebtes Hobby der letzten Jahre, dank des zauberhaften Arduino. Doch wenn das Interesse einmal geweckt ist, kann man schnell über DigitalWrite() hinauswachsen, und was danach kommt, ist nicht ganz klar. Die Entwickler von Arduino haben viel unternommen, um den Einstieg in ihr Ökosystem zu erleichtern, doch außerhalb davon ragt nach wie vor der dunkle Wald der anspruchsvollen Schaltungstechnik hervor, der für Hobbyisten schwer zugänglich ist.

Zum Beispiel die Datenblätter. Man meint, sie liefern alles, was man braucht – einfach nehmen und nutzen. Aber die Autoren scheinen nicht das Ziel zu verfolgen, Mikrocontroller populär zu machen; manchmal hat man das Gefühl, dass sie absichtlich mit unverständlichen Fachbegriffen und Abkürzungen bei der Beschreibung einfacher Dinge übertreiben, um den Unkundigen maximal zu verwirren. Doch so schlimm ist es nicht, mit etwas Willen öffnet sich die Schatztruhe.

In diesem Artikel teile ich meine Erfahrungen als Geisteswissenschaftler im Umgang mit Datenblättern für Hobbyzwecke. Der Text richtet sich an diejenigen, die aus den Kinderschuhen des Arduino herausgewachsen sind und bereits ein gewisses Verständnis für die Funktionsweise von Mikrocontrollern haben.

Ich beginne mit dem traditionellen

LEDs blinken lassen mit Arduino

Und gleich der Code:

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

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

„Was ist das?“, wird der versierte Leser fragen. „Warum schreibst du etwas in das Eingangsregister PINB? Das ist doch nur zum Lesen!“ Tatsächlich, die Dokumentation von Arduino, wie die meisten Lehrartikel im Internet, behauptet, dass dieses Register nur lesbar ist. Ich dachte das auch, bis ich das Datenblatt der Atmega328p durchgelesen habe, während ich diesen Artikel vorbereitete. Und dort steht:

Wie und warum man Datenblätter liest, wenn Mikrocontroller Ihr Hobby sind

Das ist eine relativ neue Funktionalität, die es bei der Atmega8 nicht gab; nicht jeder weiß davon oder erwähnt es aus Gründen der Abwärtskompatibilität. Aber es ist durchaus geeignet, um den Gedanken zu demonstrieren, dass es wichtig ist, Datenblätter zu lesen, um alle Möglichkeiten des Chips zu nutzen, einschließlich der weniger bekannten. Und das ist nicht der einzige Grund.

Warum sollte man Datenblätter noch lesen?

Normalerweise experimentieren Hobby-Entwickler, nachdem sie mit LEDs und AnalogWrite gespielt haben, mit verschiedenen Modulen und Chips, für die bereits Bibliotheken geschrieben wurden. Früher oder später kommt dann eine Bibliothek, die nicht so funktioniert, wie sie sollte. Dann fängt der Hobbyist an, sie zu bearbeiten, um sie zu reparieren, und dann...

Es gibt dort etwas, das völlig unverständlich ist, weshalb man gezwungen ist, Google zu konsultieren, zahlreiche Tutorials zu lesen, Teile passenden Codes zu extrahieren und schließlich sein Ziel zu erreichen. Dies vermittelt ein starkes Gefühl der Vollendung, aber tatsächlich ähnelt der Prozess dem Erfinden eines Fahrrads durch Reverse Engineering eines Motorrads. Dabei versteht man nicht wirklich, wie dieses Fahrrad funktioniert. Ich weiß das, weil ich selbst relativ lange damit beschäftigt war.

Hätte ich anstelle dieser spannenden Beschäftigung ein paar Tage damit verbracht, die Dokumentation zu Atmega328 zu studieren, hätte ich eine enorme Menge an Zeit gespart. Schließlich handelt es sich um einen recht einfachen Mikrocontroller.

Daher ist es wichtig, die Datenblätter zu lesen, um zumindest eine Vorstellung davon zu haben, wie der Mikrocontroller aufgebaut ist und was er leisten kann. Und noch dazu:

  • um fremde Bibliotheken zu überprüfen und zu optimieren. Oft werden sie von ebenso leidenschaftlichen Hobbyisten geschrieben, die das Fahrrad neu erfinden; oder, im Gegenteil, die Autoren versehen sie absichtlich mit überflüssigem Schutz gegen Fehlbedienung. Soll es dreimal mehr Aufwand und langsamer sein, aber sicher funktionieren.

  • um Chips in einem Projekt nutzen zu können, für die niemand eine Bibliothek geschrieben hat;

  • um den Umstieg von einer Serie von Mikrocontrollern auf eine andere zu erleichtern;

  • um endlich meinen alten Code zu optimieren, der nicht in die Arduino-Umgebung passte;

  • um zu lernen, wie man jeden Chip direkt über seine Register verwaltet, ohne sich mit der Funktionsweise der Bibliotheken auseinandersetzen zu müssen, falls solche überhaupt vorhanden sind.

Warum direkt in die Register schreiben, wenn es HAL und LL gibt?

Wörterbuch
HAL, High Abstraction Layer – eine Bibliothek zur Steuerung eines Mikrocontrollers mit hohem Abstraktionsgrad. Wenn der SPI1-Bus genutzt werden soll, einfach SPI1 konfigurieren und aktivieren, ohne sich Gedanken darüber zu machen, welche Register wofür zuständig sind.
LL, Low Level API – eine Bibliothek, die Makros oder Strukturen mit den Adressen der Register enthält und es ermöglicht, sie nach Namen anzusprechen. DDRx, PORTx, PINx auf einem Atmega – das ist LL.

Diskussionen über "HAL, LL oder Register" kommen regelmäßig in den Kommentaren auf Habr vor. Ohne Anspruch auf astrales Wissen, möchte ich einfach meine amateurhaften Erfahrungen und Überlegungen teilen.

Nachdem ich mich einigermaßen mit der ATmega vertraut gemacht und viele Artikel über die Vorzüge des STM32 gelesen hatte, kaufte ich ein halbes Dutzend verschiedener Boards – sowohl Discovery als auch „Blaue Tabletten“ und sogar einfach Chips für meine eigenen Projekte. All diese Teile lagen nun zwei Jahre in einer Kiste. Manchmal sagte ich mir: „Jetzt lerne ich STM“, startete CubeMX, generierte ein Setup für SPI, sah mir die resultierende Textwand mit den vielen Copyrightern von STM an und entschied, dass es irgendwie zu viel war.

Wie und warum man Datenblätter liest, wenn Mikrocontroller Ihr Hobby sind

Es ist natürlich möglich, herauszufinden, was CubeMX da geschrieben hat. Aber gleichzeitig ist klar, dass es unrealistisch ist, sich all die Formulierungen einzuprägen, um sie später selbst zu tippen. Und das Debuggen, falls ich versehentlich vergesse, in Cube ein Häkchen zu setzen, wäre ganz schön problematisch.

Zwei Jahre sind vergangen, und ich schielte immer noch nach ST MCU Finder nach allerlei leckeren, aber für mein Verständnis unerreichbaren Chips, als ich zufällig auf eine großartige Artikel, wenn auch über den STM8, stieß. Und plötzlich mir wurde klar, dass ich die ganze Zeit gegen eine offene Tür gestoßen bin: Die Register bei STM sind genauso aufgebaut wie bei jedem anderen Mikrocontroller, und für die Arbeit damit ist Cube nicht zwingend notwendig. Oh, das hätte man also so machen können?..

HAL und insbesondere STM32CubeMX sind Werkzeuge für professionelle Ingenieure, die intensiv mit STM32-Chips arbeiten. Das Hauptmerkmal ist das hohe Abstraktionsniveau, das es ermöglicht, schnell von einem Mikrocontroller zum anderen und sogar von einem Kern zum nächsten innerhalb der STM32-Reihe zu migrieren. Solche Aufgaben begegnen Hobbyanwendern selten – unsere Auswahl an Mikrocontrollern ist in der Regel auf das Sortiment von AliExpress beschränkt, und wir migrieren häufiger zwischen grundlegend unterschiedlichen Chips – wir wechseln von Atmega zu STM, von STM zu ESP oder sehen, was uns unsere chinesischen Freunde Neues anbieten. HAL wird uns hier nicht helfen, und die Zeit, die für das Lernen benötigt wird, ist beträchtlich.

Dann bleibt noch LL – aber von dort sind es nur noch Schritte zu den Registern. Ich persönlich finde es nützlich, meine eigenen Makros mit den Adressen der Register zu schreiben: So beschäftige ich mich intensiver mit dem Datenblatt, überlege, was ich in Zukunft benötigen könnte und was nicht, strukturiere meine Programme besser, und generell hilft der überwundene Lernprozess beim Erinnern.

Außerdem gibt es einen Punkt zum beliebten STM32F103 – es existieren zwei inkompatible Versionen von LL: eine offizielle von STM und eine andere von Leaf Labs, die im Projekt STM32duino verwendet wird. Wenn man eine Open-Source-Bibliothek schreibt (und genau das hatte ich vor), ist es wichtig, diese Unterschiede zu beachten.), man muss entweder zwei Versionen erstellen oder direkt auf die Register zugreifen.

Schließlich vereinfacht der Verzicht auf LL, meiner Meinung nach, die Migration, besonders wenn man von Anfang an auf sie setzt. Ein übertriebenes Beispiel: Wir schreiben das Arduino Blink in Atmel Studio ohne 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++);
    } 
}

Damit dieser Code die LED auf dem chinesischen STM8-Board (aus ST Visual Desktop) blinken lässt, muss man lediglich zwei Adressen ändern:

#define DDR_B 0x5007
#define OUT_B 0x5005

Ja, ich nutze die spezifische Eigenschaft der LED-Anschluss auf dem bestimmten Board, es wird sehr langsam blinken, aber es wird blinken!

Welche Arten von Datenblättern gibt es

In Artikeln und Foren, sowohl in russischen als auch in englischen, versteht man unter 'Datenblättern' jede technische Dokumentation zu Chips, und so verfahren auch ich in diesem Text. Formal sind sie lediglich eine Art dieser Dokumentation:

Datenblatt – technische Daten, taktische technische Eigenschaften. Jedes elektronische Bauteil hat notwendigerweise eines. Es ist nützliche Referenzinformation, die man griffbereit haben sollte, aber besonders viel zum Nachdenken gibt es darin nicht. Allerdings sind einfachere Chips oft auf das Datenblatt beschränkt, um nicht unnötig viele Dokumente zu erstellen; in diesem Fall Referenzhandbuch wird hier ebenfalls hinzugefügt.

Referenzhandbuch – das eigentliche Handbuch, ein umfassendes Buch mit über 1000 Seiten. Es beschreibt detailliert die Funktionsweise des gesamten Chips. Das wichtigste Dokument, um den Mikrocontroller zu verstehen. Im Gegensatz zu dem Datenblatt, sind die Anleitungen für eine breite Palette von Mikrocontrollern geschrieben und enthalten viele Informationen zu Peripherie, die in Ihrem spezifischen Modell möglicherweise nicht vorhanden ist.

Programmierhandbuch oder Befehlssatzhandbuch – eine Anleitung zu den einzigartigen Befehlen des Mikrocontrollers. Sie richtet sich an Programmierer, die in Assembly programmieren. Compiler-Autoren nutzen sie aktiv zur Optimierung des Codes, daher ist sie im Allgemeinen nicht erforderlich. Es ist jedoch nützlich, hier hineinzuschauen, um ein allgemeines Verständnis für spezifische Befehle wie den Interrupt-Austritt sowie für die aktive Verwendung von Debuggern zu gewinnen.

Anwendungsnotiz – nützliche Tipps zur Lösung spezifischer Probleme, oft mit Codebeispielen.

Korrekturblatt – eine Beschreibung von Fällen, in denen der Chip sich untypisch verhält, einschließlich möglicher Umgehungslösungen, falls vorhanden.

Was im Datenblatt enthalten ist

Direkt im Datenblatt könnten uns folgende Abschnitte benötigen:

Geräteübersicht – Die erste Seite des Datenblatts gibt einen kurzen Überblick über das Gerät. Dies ist besonders hilfreich, wenn Sie irgendwo einen Chip gefunden haben (zum Beispiel im Geschäft gesehen, herausgelötet oder eine Erwähnung getroffen) und herausfinden möchten, was es ist.

Allgemeine Beschreibung – eine detailliertere Beschreibung der Funktionen der Chips aus der Reihe.

Pinbelegung – Belegungsschemata für alle verfügbaren Gehäuse des Chips (welcher Pin auf welchen Anschluss).

Pin-Beschreibung – beschreibt die Funktion und Möglichkeiten jedes Pins.

Speicherkarte – Eine Adresskarte im Speicher ist wahrscheinlich nicht erforderlich, aber manchmal umfasst sie auch die Adressliste der Registerblöcke.

Registerkarte – Die Tabelle der Adressen der Registerblöcke ist in der Regel im Datenblatt zu finden, während in Ref Manual – nur die Verschiebungen (Adressverschiebungen).

Elektrische Eigenschaften – In diesem Abschnitt interessieren uns in erster Linie absolute Maximalwerte, die die maximalen Belastungen für den Chip auflisten. Im Gegensatz zum unverwüstlichen Atmega328p erlauben die meisten Mikrocontroller keine schweren Lasten an den Pins, was überraschend für Arduino-Nutzer sein kann.

Paketinformationen – Zeichnungen der verfügbaren Gehäuse, die bei der Konstruktion eigener Platinen nützlich sind.

Referenzhandbuch besteht strukturell aus Abschnitten, die bestimmten Peripheriegeräten gewidmet sind, wie im jeweiligen Titel angegeben. Jedes Kapitel kann grob in drei Teile unterteilt werden:

Übersicht, Einführung, Funktionen – Übersicht der Peripheriefunktionen;

Funktionsbeschreibung, Gebrauchsanleitung oder einfach der Hauptblock des Abschnitts – eine ausführliche textliche Beschreibung der Funktionsweise der Peripherie und deren Verwendung;

Register – Beschreibung der Steuerregister. In einfachen Fällen wie GPIO oder SPI ist es oft ausreichend, um mit der Peripherie zu beginnen, aber oft muss man auch die vorhergehenden Teile lesen.

Wie man Datenblätter liest

Datenblätter können mit ihrem Umfang und der Menge an schwierigen Begriffen abschrecken. Tatsächlich ist alles nicht so schlimm, wenn man ein paar Tricks kennt.

Installieren Sie einen guten PDF-Reader. Datenblätter sind im Geiste der klassischen Papierhandbücher verfasst, sie lassen sich hervorragend ausdrucken, mit Kunststoffmarkierungen versehen und heften. Hypertext kommt darin nur sporadisch vor. Glücklicherweise wird zumindest die Struktur des Dokuments durch Lesezeichen gestaltet, daher ist ein geeigneter Reader mit komfortabler Navigation sehr wichtig.

Das Datenblatt ist kein Buch von Stroustrup, man muss nicht alles durchlesen.. Wenn Sie den vorherigen Rat befolgt haben, finden Sie einfach im Lesezeichen-Bereich den entsprechenden Abschnitt.

Datenblätter, insbesondere Referenzhandbücher, können die Funktionen nicht eines bestimmten Chips, sondern der gesamten Seriebeschreiben. Das bedeutet, dass die Hälfte oder sogar zwei Drittel der Informationen irrelevant für Ihren Chip sein könnten. Bevor Sie die Register TIM7 studieren, überprüfen Sie bitte Allgemeine Beschreibung, ob Sie es haben.

Grundkenntnisse in Englisch sind auf Basisniveauzureichend. Datenblätter bestehen zur Hälfte aus Begriffen, die einem durchschnittlichen Muttersprachler unbekannt sind, und zur Hälfte aus einfachen verbindenden Strukturen. Außerdem gibt es großartige chinesische Datenblätter in chinesischem Englisch, wo ebenfalls die Hälfte Fachbegriffe sind und die andere Hälfte ein zufälliger Wortschatz.

Wenn Sie ein unbekanntes Wortbegegnen, versuchen Sie nicht, es mit einem Englisch-Russisch-Wörterbuch zu übersetzen. Wenn Sie von "hysteresis" verwirrt sind, wird Ihnen die Übersetzung "Hysteresis" nicht viel helfen. Nutzen Sie Google, Stack Overflow, Wikipedia, Foren, wo das benötigte Konzept hysteresis, то от перевода «гистерезис» теплее вам не станет. Пользуйтесь Гуглом, Stack Overflow, Википедией, форумами, где нужное понятие будет einfach erklärt mit Beispielen.

ist. Der beste Weg, um das Gelesene zu verstehen, besteht darin, es in der Praxis zu überprüfen.. Halten Sie deshalb das Datenblatt bereit, mit dem Sie sich vertraut machen, besser noch zwei – für den Fall, dass Sie doch etwas nicht ganz verstanden haben und den magischen Rauch sehen.

Es ist eine nützliche Angewohnheit, das Datenblatt zur Hand zu haben, wenn Sie einen Tutorial lesen oder eine Bibliothek eines anderen Autors erkunden. Es ist möglich, dass Sie darin eine optimierte Lösung für Ihr Problem finden. Und umgekehrt – wenn Sie aus dem Datenblatt nicht herauslesen können, wie der Register funktioniert, suchen Sie es einfach bei Google: Höchstwahrscheinlich hat es bereits jemand einfach erklärt oder klaren Code auf GitHub hinterlassen.

Wörterbuch

Einige nützliche Begriffe und Bezeichnungen, die Ihnen helfen, sich schneller mit Datenblättern zurechtzufinden. Was mir in den letzten Tagen in den Sinn kam, Ergänzungen und Korrekturen sind willkommen.

Elektrizität
Vcc, Vdd – „Plus“, Stromversorgung
Vss, Vee – „Minus“, Erde
current – Strom
voltage – Spannung
to sink current – als „Erde“ für eine externe Last arbeiten
to source current – eine externe Last speisen
high sink/source pin – Pin mit erhöhter „Toleranz“ gegenüber der Last

IO
H, High – am Pin Vcc
L, Low – am Pin Vss
High Impedance, Hi-Z, floating – am Pin ist nichts vorhanden, „hoher Widerstand“, er ist für die Außenwelt faktisch unsichtbar.
weak pull up, weak pull down – integrierter Pull-Up/Pull-Down-Widerstand, ca. 50 kΩ (siehe Datenblatt). Wird verwendet, um z. B. zu verhindern, dass der Eingangs-Pin in der Luft hängt und dadurch Fehlfunktionen verursacht. Schwach – weil er leicht „überstimmt“ werden kann.
Push-Pull – Ausgangsmodus des Pins, in dem er zwischen Hoch und Niedrig – normalem OUTPUT mit Arduino.
Open Drain – Bezeichnung für den Ausgangsmodus, in dem der Pin entweder Niedrig, oder High Impedance / Floating. Dabei handelt es sich fast immer nicht um einen „echten“ offenen Drain, da es Schutzelemente wie Dioden, Widerstände usw. gibt. Es bezeichnet einfach den Modus Erdung/nichts.
True Open Drain – und hier reden wir von einem echten offenen Drain: Der Pin führt direkt zur Erde, wenn er geöffnet ist, oder bleibt im Schwebezustand, wenn er geschlossen ist. Das bedeutet, dass über ihn bei Bedarf eine höhere Spannung als Vcc fließen kann, aber das Maximum wird dennoch im Datenblatt im Abschnitt Absolute Maximum Ratings / Voltage.

Schnittstellen
in Reihe – in Serie verbunden
zu einer Kette – Chips in eine Kette verbinden durch serielle Verbindung, um die Anzahl der Ausgänge zu erhöhen.
Shift – Schiebung, betrifft normalerweise den Bitschub. Entsprechend zu schieben und zu schieben – Daten bitweise empfangen und übermitteln.
Latch – ein Schieber, der den Puffer abdeckt, solange Bits verschoben werden. Wenn die Übertragung abgeschlossen ist, öffnet sich der Schieber und die Bits beginnen zu arbeiten.
to clock in – eine bitweise Übertragung durchführen, alle Bits an die richtigen Stellen verschieben.
Double Buffer, Shadow Register, Preload Register – Bezeichnungen in der Historie, wenn ein Register neue Daten empfangen können soll, diese aber bis zu einem bestimmten Moment zurückhalten muss. Zum Beispiel dürfen für die korrekte Funktion des PWM die Parameter (Duty Cycle, Frequenz) nicht geändert werden, solange der aktuelle Zyklus noch läuft, die neuen Parameter können jedoch bereits übertragen werden. Daher bleiben die aktuellen in Shadow Register, und die neuen gelangen in Preload Register, indem sie im entsprechenden Register des Chips gespeichert werden.

Verschiedenes
Prescaler – Frequenzteiler
to set a bit – ein Bit auf 1 setzen
to clear/reset a bit – ein Bit auf 0 zurücksetzen (reset – ein Merkmal von STM-Datenblättern)

Was kommt als Nächstes

Eigentlich war hier ein praktischer Teil mit der Demonstration von drei Projekten auf STM32 und STM8 geplant, die speziell für diesen Artikel mithilfe der Datenblätter mit Lampen, SPI, Timern, PWM und Interrupts erstellt wurden:

Wie und warum man Datenblätter liest, wenn Mikrocontroller Ihr Hobby sind

Aber der Text wird etwas viel, daher werden die Projekte in den zweiten Teil verschoben.

Das Lesen von Datenblättern wird Ihnen bei Ihrem Hobby helfen, ersetzt jedoch kaum die persönliche Kommunikation mit Gleichgesinnten in Foren und Chats. Daher müssen Sie sich zunächst mit der englischen Sprache beschäftigen. Eine besondere Belohnung für diejenigen, die bis zum Ende gelesen haben: zwei kostenlose Lektionen bei Skyeng bei der ersten Zahlung mit dem Code. HABR2.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster