Wie und warum man DatenblÀtter lesen sollte, wenn Mikrocontroller Ihr Hobby sind

Wie und warum man DatenblÀtter lesen sollte, wenn Mikrocontroller Ihr Hobby sind

Mikroelektronik ist ein angesagtes Hobby der letzten Jahre dank des zauberhaften Arduino. Doch das Problem ist: Bei entsprechendem Interesse wĂ€chst man schnell ĂŒber DigitalWrite() hinaus, und was danach zu tun ist, ist nicht ganz klar. Die Entwickler von Arduino haben viel Aufwand betrieben, um die EinstiegshĂŒrde in ihr Ökosystem zu senken, aber außerhalb davon liegt nach wie vor der dunkle Wald des rauen Schaltungsdesigns, der fĂŒr den Amateur schwer zugĂ€nglich ist.

Zum Beispiel DatenblĂ€tter. Man denkt, sie enthalten alles, was man braucht. Aber die Autoren verfolgen offensichtlich nicht das Ziel, Mikrocontroller populĂ€r zu machen; manchmal scheint es, dass sie absichtlich mit unverstĂ€ndlichen Begriffen und AbkĂŒrzungen bei der Beschreibung einfacher Dinge ĂŒbertreiben, um den Unwissenden maximal zu verwirren. Aber nicht alles ist so schlecht, wenn man es möchte, öffnet sich das Geheimnis.

In diesem Artikel möchte ich meine Erfahrungen im Umgang eines Geisteswissenschaftlers mit DatenblĂ€ttern zu Hobbyzwecken teilen. Der Text richtet sich an Arduino-Enthusiasten, die aus ihren Kinderschuhen herausgewachsen sind, und setzt ein gewisses VerstĂ€ndnis fĂŒr die Funktionsweise von Mikrocontrollern voraus.

Ich beginne mit dem traditionellen

LED 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 erfahrene Leser fragen. – Warum schreibst du etwas in das Eingangsregister PINB? Das ist doch nur zum Lesen!“ In der Tat, die Dokumentation von Arduino, wie die meisten Lehrartikel im Internet, behauptet, dass dieses Register schreibgeschĂŒtzt ist. Ich dachte das auch, bis ich Datenblatt der Atmega328p gelesen habe, wĂ€hrend ich diesen Artikel vorbereitete. Und dort steht:

Wie und warum man DatenblÀtter lesen sollte, wenn Mikrocontroller Ihr Hobby sind

Das ist eine relativ neue FunktionalitĂ€t, die es bei der Atmega8 nicht gab, und nicht jeder weiß davon oder erwĂ€hnt sie aus GrĂŒnden der AbwĂ€rtskompatibilitĂ€t. Aber sie ist durchaus geeignet, um zu zeigen, dass man DatenblĂ€tter lesen sollte, um alle Eigenschaften des Chips zu nutzen, auch die weniger bekannten. Und das ist nicht der einzige Grund.

Warum man sonst noch DatenblÀtter lesen sollte

Normalerweise beginnen Arduino-Entwickler, nachdem sie mit LEDs und AnalogWrite experimentiert haben, verschiedene Module und Chips anzuschließen, fĂŒr die bereits Bibliotheken geschrieben existieren. FrĂŒher oder spĂ€ter taucht eine Bibliothek auf, die nicht so funktioniert, wie sie sollte. Dann beginnt der Amateur, sie zu durchforsten, um sie zu reparieren, und dann


Dort passiert etwas kategorisch UnverstĂ€ndliches, weshalb man gezwungen ist, zu Google zu gehen, zahlreiche Tutorials zu lesen, irgendeinen passenden Code StĂŒck fĂŒr StĂŒck zu entnehmen und schließlich doch ans Ziel zu kommen. Das gibt ein starkes GefĂŒhl des Erfolgs, aber eigentlich erinnert der Prozess daran, ein Fahrrad durch Reverse Engineering eines Motorrads zu erfinden. Dabei versteht man nicht besser, wie dieses Fahrrad funktioniert. Ich weiß das, weil ich selbst eine ganze Zeit lang damit beschĂ€ftigt war.

HĂ€tte ich anstelle dieses spannenden Hobbys ein paar Tage damit verbracht, die Dokumentation zur Atmega328 zu studieren, hĂ€tte ich eine Menge Zeit gespart. Schließlich ist es ein ziemlich einfacher Mikrocontroller.

Daher sollte man DatenblĂ€tter lesen, um sich wenigstens vorzustellen, wie ein Mikrocontroller aufgebaut ist und was er alles kann. Und außerdem:

  • um fremde Bibliotheken zu ĂŒberprĂŒfen und zu optimieren. Diese werden oft von anderen Hobbyisten geschrieben, die das Fahrrad neu erfinden; oder umgekehrt, die Autoren fĂŒgen absichtlich ĂŒberflĂŒssige Schutzmechanismen gegen Dummheit hinzu. Lass es dreimal langsamer und umfangreicher sein, Hauptsache es funktioniert sicher.

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

  • um den Umstieg von einem Mikrocontroller-Typ auf einen anderen zu erleichtern;

  • um schließlich meinen alten Code zu optimieren, der einfach nicht in die Arduino-Umgebung passte;

  • um zu lernen, wie man jeden Chip direkt ĂŒber seine Register steuert, ohne sich mit der Funktionsweise seiner Bibliotheken, falls vorhanden, auseinanderzusetzen.

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

Glossar
HAL, High Abstraction Layer – eine Bibliothek zur Steuerung eines Mikrocontrollers auf hoher Abstraktionsstufe. Wenn man die Schnittstelle SPI1 verwenden möchte, konfiguriert und aktiviert man einfach SPI1, ohne sich Gedanken darĂŒber zu machen, welche Register welche Funktion haben.
LL, Low Level API – eine Bibliothek, die Makros oder Strukturen mit den Adressen der Register enthĂ€lt und den Zugriff auf diese durch ihren Namen ermöglicht. DDRx, PORTx, PINx auf dem Atmega – das ist LL.

Diskussionen ĂŒber die Themen „HAL, LL oder Register“ kommen regelmĂ€ĂŸig in den Kommentaren auf Habrahabr vor. Ohne Anspruch auf astrales Wissen möchte ich einfach meine Amateur-Erfahrungen und Überlegungen teilen.

Nachdem ich mich mehr oder weniger mit der Atmega und den wunderbaren Möglichkeiten von STM32 vertraut gemacht hatte, kaufte ich mir ein halbes Dutzend verschiedener Platinen – sowohl Discovery als auch „Blaue Tablets“ und sogar einfach nur Chips fĂŒr meine eigenen Projekte. Sie lagen zwei Jahre lang in einer Kiste. Manchmal sagte ich mir: „Ab diesem Wochenende lerne ich STM“, startete CubeMX, generierte ein Setup fĂŒr SPI, sah mir die entstandene Textwand an, die reichlich mit Copyright-Hinweisen von STM versehen war, und entschied, dass das einfach zu viel war.

Wie und warum man DatenblÀtter lesen sollte, wenn Mikrocontroller Ihr Hobby sind

Es ist natĂŒrlich möglich, herauszufinden, was CubeMX hier geschrieben hat. Aber gleichzeitig ist es klar, dass es unrealistisch ist, sich alle Formulierungen zu merken, um sie spĂ€ter von Hand zu schreiben. Und das Debuggen ist eine ganz andere Herausforderung, wenn ich zufĂ€llig vergesse, in Cube ein HĂ€kchen zu setzen.

Zwei Jahre sind vergangen, ich schaute weiterhin hungrig auf ST MCU Finder nach allerlei leckeren, aber meinem VerstĂ€ndnis unzugĂ€nglichen Chips und stieß zufĂ€llig auf einen wunderbaren Artikel, auch wenn er ĂŒber STM8 ist. Und plötzlich verstand ich, dass ich die ganze Zeit an einer offenen TĂŒr geklopft hatte: Die Register von STM sind genauso aufgebaut wie die von jedem anderen Mikrocontroller, und fĂŒr die Arbeit mit ihnen ist Cube nicht zwingend erforderlich. Ach, das hĂ€tte man also auch so machen können?

HAL und speziell STM32CubeMX sind Werkzeuge fĂŒr professionelle Ingenieure, die intensiv mit STM32-Chips arbeiten. Das Hauptmerkmal ist der hohe Abstraktionsgrad, die Möglichkeit, schnell von einem Mikrocontroller auf einen anderen zu migrieren und sogar von einem Kern auf einen anderen, wĂ€hrend man innerhalb der STM32-Familie bleibt. Liebhaber begegnen solchen Aufgaben selten – unsere Auswahl an Mikrocontrollern ist in der Regel durch das Angebot bei AliExpress begrenzt, und wir migrieren oft zwischen grundlegend unterschiedlichen Chips – wir wechseln von Atmega zu STM, von STM zu ESP oder was uns die chinesischen Freunde Neues anbieten.

Bleibt LL – aber von ihm zu den Registern ist es nur ein kleiner Schritt. Persönlich finde ich es nĂŒtzlich, meine eigenen Makros mit Registeradressen zu schreiben: Ich studiere das Datenblatt genauer, denke darĂŒber nach, was ich in Zukunft brauchen werde und was bestimmt nicht, strukturiere meine Programme besser und insgesamt hilft das Überwinden dabei, sich besser zu erinnern.

Außerdem gibt es eine Besonderheit beim beliebten STM32F103 – fĂŒr ihn existieren zwei inkompatible Versionen von LL, eine offizielle von STM und die andere von Leaf Labs, die im Projekt STM32duino verwendet wird. Wenn man eine Open-Source-Bibliothek schreiben möchte (und genau das war mein Ziel), muss man entweder zwei Versionen erstellen oder direkt auf die Register zugreifen.

Schließlich vereinfacht der Verzicht auf LL meiner Meinung nach die Migration, insbesondere wenn man von Anfang an an das Projekt denkt. Ein ĂŒbertriebenes Beispiel: Wir schreiben einen 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++);
    } 
}

Um diesen Code die LED auf einer chinesischen Platine mit STM8 (aus ST Visual Desktop) blinken zu lassen, reicht es aus, zwei Adressen zu Àndern:

#define DDR_B 0x5007
#define OUT_B 0x5005

Ja, ich nutze die Besonderheit der LED-Verbindung auf dieser spezifischen Platine, es wird sehr langsam blinken, aber es wird blinken!

Was gibt es fĂŒr DatenblĂ€tter

In Artikeln und in Foren, sowohl in russischen als auch in englischen, versteht man unter „DatenblĂ€ttern“ jede technische Dokumentation zu Chips, das mache ich in diesem Text auch so. Formal sind sie nur eine Art solcher Dokumentation:

Datenblatt – technische Daten, taktisch-technische Eigenschaften. Muss bei jedem elektronischen Bauteil vorhanden sein. NĂŒtzliche Informationsquelle, die man griffbereit haben sollte, aber es gibt nicht viel, was man darin aufmerksam lesen könnte. Allerdings beschrĂ€nken sich einfachere Chips oft auf das Datenblatt, um nicht unnötige Dokumente zu schaffen; in diesem Fall Handbuch wird hiermit ebenfalls einbezogen.

Handbuch – die eigentliche Anleitung, ein umfangreiches Buch von ĂŒber 1000 Seiten. Beschreibt detailliert die Funktion aller Komponenten, die im Chip integriert sind. Das Hauptdokument zum VerstĂ€ndnis des Mikrocontrollers. Im Gegensatz zu Datenblatt, werden Anleitungen fĂŒr eine breite Palette von MK geschrieben, sie enthalten viele Informationen ĂŒber die Peripherie, die in Ihrem spezifischen Modell fehlt.

Programmiertutorial oder Befehlshandbuch – Anleitung zu den speziellen Befehlen des Mikrocontrollers. Bestimmt fĂŒr diejenigen, die in Assembler programmieren. Compiler-Autoren verwenden es aktiv zur Codeoptimierung, daher wird es im Allgemeinen nicht benötigt. Aber es ist nĂŒtzlich, hier fĂŒr ein allgemeines VerstĂ€ndnis nachzuschlagen, besonders bei bestimmten speziellen Befehlen wie dem Verlassen von Interrupts sowie bei aktivem Gebrauch des Debuggers.

Anwendungshinweis – nĂŒtzliche Tipps zur Lösung spezifischer Probleme, oft mit Codebeispielen.

Errata – Beschreibung von FĂ€llen, in denen der Chip ein nicht standardmĂ€ĂŸiges Verhalten zeigt, mit Umgehungsmöglichkeiten, falls vorhanden.

Was ist in den DatenblÀttern enthalten

Direkt im Datenblatt benötigen wir möglicherweise folgende Abschnitte:

GerĂ€teĂŒbersicht – die erste Seite des Datenblatts gibt einen kurzen Überblick ĂŒber das GerĂ€t. Sehr nĂŒtzlich in Situationen, wenn Sie irgendwo einen Chip gefunden haben (im GeschĂ€ft gesehen, herausgelötet, irgendwo erwĂ€hnt) und verstehen möchten, um was es sich handelt.

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

Pinouts – Anschlussdiagramme fĂŒr alle möglichen GehĂ€use des Chips (an welchem Pin welcher Anschluss).

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

Speicherkarte – die Adresskarte im Speicher benötigen wir wahrscheinlich nicht, aber manchmal enthĂ€lt sie auch eine Tabelle der Adressblöcke der Register.

Registerkarte – eine Tabelle der Adressen der Registerblöcke, die normalerweise im Datenblatt zu finden ist, sowie in Ref-Handbuch – nur die Verschiebungen (Adressverschiebungen).

Elektrische Eigenschaften – in diesem Abschnitt interessieren uns in erster Linie absoluten Höchstwerte, die die maximalen Belastungen fĂŒr den Chip auflisten. Im Gegensatz zum unverwĂŒstlichen Atmega328p erlauben die meisten Mikrocontroller nicht, ernsthafte Lasten an die Pins anzuschließen, was fĂŒr Arduino-Anwender eine unangenehme Überraschung sein kann.

Paketinformationen – Zeichnungen der verfĂŒgbaren GehĂ€use, die bei der Planung eigener Platinen hilfreich sind.

Handbuch besteht strukturell aus Abschnitten, die einem bestimmten PeripheriegerĂ€t gewidmet sind, wie in ihren Überschriften angegeben. Jedes Kapitel kann grob in drei Teile unterteilt werden:

Übersicht, EinfĂŒhrung, Eigenschaften – Übersicht ĂŒber die Funktionen der Peripherie;

Funktionsbeschreibung, Benutzerhandbuch oder einfach der Hauptblock des Abschnitts – eine ausfĂŒhrliche textliche Beschreibung der Funktionsweise der Peripherie und der Wege ihrer Nutzung;

Register – Beschreibung der Steuerregister. In einfachen FĂ€llen wie GPIO oder SPI reicht das oft aus, um mit der Peripherie zu beginnen, aber oft muss man trotzdem die vorherigen Teile lesen.

Wie man DatenblÀtter liest

DatenblÀtter wirken auf den ersten Blick durch ihr Volumen und die Vielzahl unbekannter Begriffe abschreckend. In Wirklichkeit ist es nicht so schlimm, wenn man ein paar Tipps kennt.

Installieren Sie einen guten PDF-Reader. DatenblĂ€tter werden in der schönen Tradition von Papieranleitungen verfasst, es macht Spaß, sie auszudrucken, mit Plastikkarten zu markieren und zu binden. Hypertext gibt es nur in spĂ€rlichen Mengen. GlĂŒcklicherweise ist zumindest die Struktur des Dokuments in Gliederungen organisiert, sodass ein geeigneter Reader mit komfortabler Navigation sehr nĂŒtzlich ist.

Ein Datenblatt ist kein Lehrbuch von Stroustrup, man muss nicht alles am StĂŒck lesen. Wenn Sie den vorherigen Rat befolgt haben – suchen Sie einfach den benötigten Abschnitt in dem Gliederungsbereich.

DatenblĂ€tter, insbesondere ReferenzhandbĂŒcher, können die Möglichkeiten nicht eines bestimmten Chips, sondern der gesamten Reihe beschreiben.. Das bedeutet, dass die HĂ€lfte oder sogar zwei Drittel der Informationen nichts mit Ihrem Chip zu tun haben. Bevor Sie sich mit den Registern von TIM7 befassen, ĂŒberprĂŒfen Sie, Allgemeine Beschreibung, ob Sie ihn haben.

Englisch zu wissen ist ausreichend auf grundlegendem Niveau . Die DatenblĂ€tter bestehen zur HĂ€lfte aus Begriffen, die einem durchschnittlichen Muttersprachler unbekannt sind, und zur anderen HĂ€lfte aus einfachen Satzstrukturen. Es gibt auch hervorragende chinesische DatenblĂ€tter in „chinesischem Englisch“, wo ebenfalls die HĂ€lfte aus Begriffen und die andere HĂ€lfte aus zufĂ€lligen Wörtern besteht.Wenn Sie ein

unbekanntes Wort begegnen, versuchen Sie nicht, es mit einem Englisch-Russisch-Wörterbuch zu ĂŒbersetzen. Wenn Sie ĂŒber das Worthysteresis stolpern, wird Ihnen die Übersetzung „Hysterese“ kein besseres GefĂŒhl geben. Nutzen Sie Google, Stack Overflow, Wikipedia, Foren, in denen der relevante Begriffeinfach erklĂ€rt wird, mit Beispielen. Der beste Weg, um das Gelesene zu verstehen, ist es,.

es in der Praxis zu ĂŒberprĂŒfen. Halten Sie also das Debugging-Board bereit, mit dem Sie sich vertraut machen, noch besser zwei – fĂŒr den Fall, dass Sie doch etwas nicht verstanden haben und den magischen Rauch sehen.Es ist hilfreich, ein Datenblatt zur Hand zu haben, wenn Sie

jemanden Tutorial lesen oder eine andere Bibliothek studieren. Es ist durchaus möglich, dass Sie darin eine bessere Lösung fĂŒr Ihr Problem finden. Umgekehrt gilt: Wenn Sie aus dem Datenblatt nicht verstehen können, wie das Register funktioniert, googeln Sie es: höchstwahrscheinlich hat es jemand bereits einfach erklĂ€rt oder einen verstĂ€ndlichen Code auf GitHub hinterlassen. Einige nĂŒtzliche Begriffe und Bezeichnungen, die Ihnen helfen, sich schneller mit DatenblĂ€ttern vertraut zu machen. Alles, was mir in den letzten Tagen eingefallen ist, ErgĂ€nzungen und Korrekturen sind willkommen.

Glossar

ElektrizitÀt

Vcc
Vdd, – „plus“, Stromversorgung Vss
Vee, – „minus“, Erde current
– Strom voltage
– Spannung to sink current
– als „Erde“ fĂŒr die externe Last arbeiten to source current
– externe Last versorgen 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, „hoher Widerstand“, er ist fĂŒr die Außenwelt praktisch unsichtbar. weak pull up
weak pull down, – integrierter Pull-Up/Pull-Down-Widerstand, ca. 50 kOhm (siehe Datenblatt). Wird verwendet, um zum Beispiel zu verhindern, dass der Eingangspin im Leeren schwebt und Fehlalarme auslöst. Weak – weil er leicht "ĂŒbersteuert" werden kann. push pull
– Ausgabemodus des Pins, in dem er zwischen – Ausgangsmodus des Pins, in dem er zwischen Hoch und Niedrig – gewöhnlicher OUTPUT mit Arduino.
open drain – Bezeichnung fĂŒr den Ausgangszustand, in dem der Pin entweder Niedrig, oder Hochohmig / Floating. Dabei handelt es sich fast immer nicht um einen „echten“ Open Drain, es gibt Schutzdioden, WiderstĂ€nde und so weiter. Es ist einfach eine Bezeichnung fĂŒr den Zustand Erdung / nichts.
echter Open Drain – und das ist nun ein echter Open Drain: Der Pin fĂŒhrt direkt zur Erde, wenn er offen ist, oder befindet sich im schwebenden Zustand, wenn er geschlossen ist. Das bedeutet, dass durch ihn, falls nötig, eine Spannung grĂ¶ĂŸer als Vcc fließen kann, aber das Maximum wird trotzdem im Datenblatt im Abschnitt Absolute Maximum Ratings / Voltage.

Schnittstellen
in Serie – in Serie verbunden
zu einer Kette – Chips in einer Kette verbinden, indem man sie seriell anschließt und die Anzahl der AusgĂ€nge erhöht.
Shift – Verschiebung, bedeutet normalerweise die Bits zu verschieben. Deshalb, to shift in und to shift out – Daten bitweise empfangen und senden.
latch – Riegel, der den Puffer zudeckt, wĂ€hrend die Bits verschoben werden. Wenn die Übertragung abgeschlossen ist, öffnet sich der Riegel und die Bits beginnen zu arbeiten.
to clock in – eine bitweise Übertragung durchfĂŒhren, alle Bits an die gewĂŒnschten Stellen verschieben.
double buffer, Shadow-Register, Preload-Register – Bezeichnungen fĂŒr die Historie, wenn ein Register in der Lage sein muss, neue Daten zu empfangen, sie aber bis zu einem bestimmten Zeitpunkt zu halten. Zum Beispiel sollten fĂŒr einen korrekten PWM-Betrieb seine Parameter (Duty Cycle, Frequenz) nicht geĂ€ndert werden, bis der aktuelle Zyklus abgeschlossen ist, aber neue Parameter können bereits ĂŒbergeben werden. Daher werden die aktuellen in Shadow-Register, und die neuen gelangen in Preload-Register, indem sie in das entsprechende Register des Chips geschrieben werden.

Alles mögliche
Prescaler – Frequenzteiler
einen Bit setzen – ein Bit auf 1 setzen
einen Bit zurĂŒcksetzen – ein Bit auf 0 zurĂŒcksetzen (reset – Merkmal der STM-DatenblĂ€tter)

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 mit Hilfe von DatenblĂ€ttern, Lampen, SPI, Timern, PWM und Interrupts erstellt wurden:

Wie und warum man DatenblÀtter lesen sollte, wenn Mikrocontroller Ihr Hobby sind

Aber der Text wird ein wenig zu umfangreich, daher werden die Projekte in den zweiten Teil verschoben.

Die FĂ€higkeit, DatenblĂ€tter zu lesen, wird Ihnen bei Ihrem Hobby helfen, dĂŒrfte aber das persönliche GesprĂ€ch mit Gleichgesinnten in Foren und Chats kaum ersetzen. DafĂŒr muss man in erster Linie die Englischkenntnisse verbessern. Und deshalb gibt es fĂŒr die, die bis hierher gelesen haben – einen besonderen Preis: zwei kostenlose Lektionen bei Skyeng bei der ersten Zahlung mit dem Code HABR2.

Quelle: habr.com

60GB SSD 8Gb DDR4