
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, , wie die meisten Lehrartikel im Internet, behauptet, dass dieses Register nur lesbar ist. Ich dachte das auch, bis ich der Atmega328p durchgelesen habe, wĂ€hrend ich diesen Artikel vorbereitete. Und dort steht:

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.

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 nach allerlei leckeren, aber fĂŒr mein VerstĂ€ndnis unerreichbaren Chips, als ich zufĂ€llig auf eine , 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), ), 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 0x5005Ja, 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 Hysterese, von der Ăbersetzung "Hysterese" wird Ihnen nicht wĂ€rmer werden. Nutzen Sie Google, Stack Overflow, Wikipedia und Foren, wo das benötigte Konzept erklĂ€rt wird. .
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:

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
