Ich habe langjährige Erfahrung mit 8-Bit-Cores verschiedener Hersteller - nämlich 8051, PIC und AVR - und muss jetzt einen Cortex M0 herausfinden. Speziell dieses , aber ich hoffe, wir können allgemeiner sein.
Es stellt sich heraus, dass es ein bisschen mehr ist, als ich erwartet hatte, mit mehreren Dokumenten, die verschiedene Teile des Systems in unterschiedlichen Detaillierungsgraden beschreiben und keine, die ich wirklich gesehen habe, um alles miteinander zu verbinden. Dies im Vergleich zu einem Datenblatt, das alles erklärt. Ich verstehe, dass ich in erster Linie viel mehr zu dokumentieren habe, aber der Formatwechsel bringt mich auf die Sprünge.
Die obige Website enthält ein Dokument, das einen guten Überblick über jedes Subsystem und Peripheriegerät für sich bietet, und ein weiteres, das jedes Register ausführlich beschreibt. Ich habe den gesamten Quellcode für das SDK, einschließlich Header-Dateien und einiger komplexer Beispiele, aber ich sehe es immer noch nichts, was beschreibt, wie alles miteinander verbunden ist.
Gibt es eine kurze exemplarische Vorgehensweise für die Cortex-Architektur, in der die Funktion von Dingen erläutert wird, über die kleinere Controller einfach nicht verfügen - beispielsweise mehrere Busebenen von der CPU zu den Peripheriegeräten mit jeweils eigenem Watchdog-Timer - und wie sie alle miteinander verbunden sind?
Antworten:
Ich habe sowohl an AVRs als auch an ARM Cortex-M3 / M4 / R4-basierten MCUs gearbeitet. Ich denke, ich kann einige allgemeine Ratschläge geben. Dies setzt voraus, dass Sie in C und nicht in Assembly programmieren.
Die CPU ist eigentlich der einfache Teil. Die grundlegenden C-Datentypen haben unterschiedliche Größen, aber Sie verwenden trotzdem uint8 / 16 / 32_t, oder? :-) Und jetzt sollten alle Integer-Typen relativ schnell sein, wobei 32-Bit (int) die schnellste ist. Sie haben wahrscheinlich keine FPU. Vermeiden Sie daher weiterhin Schwimmer und Doppelgänger.
Arbeiten Sie zunächst an Ihrem Verständnis der Architektur auf Systemebene. Dies bedeutet E / A, Takten, Speichern, Zurücksetzen und Unterbrechen. Außerdem müssen Sie sich an die Idee von speicherabgebildeten Peripheriegeräten gewöhnen. Bei AVR können Sie vermeiden, darüber nachzudenken, da die Register eindeutige Namen haben, für die eindeutige globale Variablen definiert sind. Bei komplexeren Systemen ist es üblich, auf Register anhand einer Basisadresse und eines Offsets zu verweisen. Alles läuft auf Zeigerarithmetik hinaus. Wenn Sie mit Zeigern nicht vertraut sind, lernen Sie jetzt.
Finden Sie für E / A heraus, wie das Muxen von Peripheriegeräten gehandhabt wird. Gibt es eine zentrale Mux-Steuerung, mit der ausgewählt werden kann, welche Pins periphere Signale und welche GPIOs sind? Oder setzen Sie die Pins mithilfe der Peripherieregister in den Peripheriemodus? Und natürlich müssen Sie wissen, wie Sie GPIOs als Ein- und Ausgänge konfigurieren und den Open-Drain-Modus sowie Pull-Ups / Downs aktivieren. Externe Interrupts fallen normalerweise ebenfalls in diese Kategorie. GPIOs sind ziemlich allgemein gehalten, daher sollte Ihre Erfahrung hier von Nutzen sein.
Clocking läuft auf ein paar Dinge hinaus. Sie beginnen mit einer Taktquelle, normalerweise einem Quarz- oder internen RC-Oszillator. Dies wird verwendet, um eine oder mehrere Uhrdomänen auf Systemebene zu erstellen. Chips mit höherer Geschwindigkeit verwenden eine PLL, die Sie sich als Frequenzvervielfacher vorstellen können. An verschiedenen Stellen wird es auch Taktteiler geben. Dabei ist zu berücksichtigen, wie hoch die CPU-Taktfrequenz sein sollte und welche Bitraten Sie für Ihre Kommunikationsperipheriegeräte benötigen. Normalerweise ist das ziemlich flexibel. Wenn Sie fortgeschrittener sind, können Sie etwas über Energiesparmodi lernen, die normalerweise auf Clock-Gating basieren.
Speicher bedeutet Flash und RAM. Wenn Sie über genügend RAM verfügen, ist es häufig schneller, Ihr Programm während der frühen Entwicklung dort zu belassen, damit Sie den Flash nicht immer wieder neu programmieren müssen. Das große Problem hierbei ist die Speicherverwaltung. Ihr Hersteller sollte Beispiel-Linker-Skripte bereitstellen, aber Sie müssen möglicherweise mehr Speicher für Code, Konstanten, globale Variablen oder den Stapel zuweisen, je nach Art Ihres Programms. Weiterführende Themen umfassen Codesicherheit und Laufzeit-Flash-Programmierung.
Das Zurücksetzen ist ziemlich unkompliziert. Normalerweise müssen Sie nur nach dem Watchdog-Timer Ausschau halten, der möglicherweise standardmäßig aktiviert ist. Zurücksetzungen sind während des Debuggens wichtiger, wenn Sie denselben Code immer wieder ausführen. Es ist leicht, einen Fehler zu übersehen, da auf diese Weise Sequenzierungsprobleme auftreten.
Es gibt zwei Dinge, die Sie über Interrupts wissen müssen - wie Sie sie aktivieren und deaktivieren und wie Sie die Interruptvektoren konfigurieren. Letzteres erledigt AVR-GCC für Sie mit den ISR () -Makros. Auf anderen Architekturen müssen Sie möglicherweise manuell eine Funktionsadresse in ein Register schreiben.
Mikrocontroller-Peripheriegeräte sind normalerweise unabhängig voneinander, sodass Sie sie einzeln lernen können. Es kann hilfreich sein, ein Peripheriegerät auszuwählen und damit einen Teil des Systems zu lernen. Kommunikationsperipheriegeräte und PWMs eignen sich für Taktung und E / A, und Timer eignen sich für Interrupts.
Lassen Sie sich nicht von der Komplexität einschüchtern. Diese "einfachen" Mikrocontroller haben Ihnen bereits viel von dem beigebracht, was Sie wissen müssen. Bitte lassen Sie mich wissen, wenn ich etwas klären muss.
quelle
int
/int_leastN_T
-Typen für Stapelvariablen zu bevorzugen .int_fastN_t
Typen, keineint_leastN_t
Typen.int16_t
oft genauso schnell wie seinint32_t
für Werte im Speicher gespeichert, aber der Standard verlangt , dass auf Plattformen , auf denenint
17 Bit oder größer ist ,int16_t x=32767; x+=2;
muss festgelegtx
zu -32767, häufig Zeichen-Erweiterung Anweisungen selbst wenn Code erfordern würde Verwenden Sie niemals das Wickelverhalten.x+=2
, wäre es rechtliche Anweisung zu verwenden , für 16-Bit - Typen, weil Compiler dieser Wert nicht einwickeln annehmen kann, und somit unter Verwendung wäre es nicht beobachtbare Verhalten ändern. Aber ich denke, dass ARM keine 16-Bit-ADD-Anweisung hat, die dies ermöglichen würde. (Ich könnte mich irren, mein Wissen über den ARM-Befehlssatz ist nicht so gut.)Es ist nützlich, sich daran zu erinnern, dass ARM das geistige Eigentum für den Mikroprozessor besitzt, aber eigentlich keine Teile herstellt. Stattdessen lizenzieren die Hersteller die verschiedenen ARM-Prozessorversionen und produzieren ihre eigenen Einzelteile mit individuellen Kombinationen von Funktionen und Peripheriegeräten.
Wenn Sie jedoch mit der Architektur noch nicht vertraut sind, ist es wahrscheinlich sinnvoll, mit der Dokumentation von ARM zu beginnen, die im Wesentlichen die Basisdokumentation für alle derartigen Mikroprozessoren darstellt.
Beispielsweise wird der Cortex-M0 auf der ARM-Website beschrieben .
Es gibt auch eine Liste von Büchern zum Thema ARM , die eine Vielzahl von Bedürfnissen und Interessen abdecken.
Schließlich gibt es die spezifischen Datenblätter des Herstellers. Für den M0 sind Cypress, NXP und STMicroelectronics nur drei von vielen Herstellern von Realteilen, die auf dem Cortex-M0 basieren.
(Und nein, ich arbeite nicht für ARM und habe es nie getan.)
quelle
Ein großer Unterschied ist die Verwendung von vom Hersteller bereitgestellten Bibliotheken. Für die PICs, Atmels usw. wurden die Basisbibliotheken (für GPIO, Timer, ADC usw.) von den meisten Entwicklern nicht viel verwendet. Nach meiner Erfahrung würden die Leute sie (höchstens) als Leitfaden verwenden, wenn sie ihren eigenen Code schreiben.
Bei ARM werden die Bibliotheken jedoch fast immer verwendet. Es gibt einen Standard, "CMSIS", dessen Einhaltung den Herstellern empfohlen wird. Die meisten tun es. Es unterstützt die Code-Portabilität (zwischen verschiedenen ARMs und zwischen Herstellern) und bietet eine "standardisierte" Methode zur Strukturierung Ihres Codes. Die Leute gewöhnen sich daran, die Bibliotheksfunktionen zu sehen und zu verstehen.
Sicher gibt es einige Entwickler, die direkt auf die Register zugreifen, aber sie sind die Ausreißer :)
Um Ihre Frage zu beantworten, fand ich es sehr hilfreich, die Dokumentation der Bibliothek durchzulesen. ST verfügt über einen gut entwickelten Code mit einer großen, von Doxygen erstellten Hilfedatei. Sie können sehen, welche Optionen für jedes Hardwaremodul verfügbar sind.
Um GPIO als Beispiel zu verwenden, verarbeitet die Initialisierungsfunktion Folgendes:
Anhand der Optionen können Sie erkennen, was möglich ist. Und natürlich lernen Sie, wie Sie diese Optionen an die Init-Funktion übergeben!
OK, jetzt, da ich das gesagt habe, sehe ich, dass Ihr spezifischer ARM keine CMSIS-kompatiblen Bibliotheken hat. Stattdessen steht ihnen das proprietäre SDK zum Download zur Verfügung. Ich würde anfangen, ihre SDK-Dokumente zu durchsuchen.
Wenn Sie nicht mit diesem bestimmten Produkt verheiratet sind, empfehle ich Ihnen möglicherweise, einen anderen Anbieter mit kompatibleren Bibliotheken zu finden. Sie werden ohnehin eine Lernkurve überwinden, sodass Sie Ihre Investition genauso gut portabler machen können ...
Waffen machen Spaß! Ich habe nicht zurückgeschaut.
quelle
Gute Zeit umzuziehen; die 8-Bits sterben schnell ab; Wenn Sie ein 5-Dollar-Board mit (zum Beispiel) einem STM32F103 kaufen können, der ein ziemlich leistungsfähiger 32-Bit-ARM-Mikrocontroller ist (sogar mit USB!), haben sich die Zeiten zweifellos geändert.
Sie hatten bereits einige ausgezeichnete Antworten, aber in erster Linie würde ich sagen "Assembly vergessen" und fast "vergessen, sich darum zu kümmern, wie die CPU auf einer niedrigen Ebene funktioniert" - eines Tages wird es einen Eckfall geben, in dem Sie sich damit befassen müssen (eine spezielle Optimierung oder zum Debuggen), aber auf ARM-Kernen läuft C-Code außergewöhnlich gut (vom Design her), und Sie müssen sich selten tief in die Eingeweide wagen.
Dies bedeutet, dass Sie eine gewisse Zeit damit verbringen werden, sich mit Problemen zu beschäftigen, bei denen Compiler (und insbesondere Linker und Makefiles) obskure Fehler an Ihnen ausschließen, aber sie sind alle überwindbar.
Der Mut zur Funktionsweise der ARMs (dh der ARM-CPU-Bücher) ist bis zu dem Tag, an dem Sie tatsächlich optimieren müssen (und Sie werden erstaunt sein, wie selten dies geschieht, wenn Sie 32-Bit-Register und Ihre PLL haben), dicht und wenig interessant. d Der CPU-Takt liegt im Bereich von 100 MHz.
Der ARM-Befehlssatz "old skool" ist beim Zerlegen viel einfacher zu lesen als der viel neuere "Thumb2" - den Sie auf den meisten modernen Mikrocontroller-ARMs (Cortex) finden -, aber auch die Innereien der Anweisungen in Assemblersprache meist in den Hintergrund treten; Wenn Sie das richtige Toolset haben (insbesondere einen anständigen Debugger auf Source-Ebene mit Haltepunkten / Einzelschritten usw.), ist es Ihnen einfach egal, ob es überhaupt ARM ist.
Wenn Sie erst einmal in der Welt der 32-Bit-Register und 32-Bit-Datenbusbreiten sind und alles, was Sie sich jemals gewünscht haben, auf dem Chip verfügbar gemacht haben, möchten Sie nie wieder auf eine 8-Bit-CPU zurückgreifen. Im Grunde gibt es oft keine Strafe dafür, dass "es leicht nimmt" und das Schreiben von Code mehr als effizient lesbar ist.
Aber ... Peripheriegeräte ... ja, und da ist der Haken.
Auf modernen MCUs kann man sicher jede Menge Sachen spielen, und viele davon sind ziemlich ausgefallene Sachen. Sie finden oft eine Welt der Raffinesse, die weit über die On-Chip-Peripheriegeräte AVR, PIC und 8051 hinausgeht.
Ein programmierbarer Timer? Nein, hab acht! DMA? Wie wäre es mit 12 Kanälen mit programmierbarer Priorität und Burst-Modus und verkettetem Modus und Auto-Reload und .. und .. und ...
I2C? I2S? Dutzende Pin-Muxing-Optionen? Fünfzehn verschiedene Möglichkeiten, den On-Chip-Flash neu zu programmieren? Sicher!
Es fühlt sich oft so an, als wären Sie von einer Hungersnot zur nächsten übergegangen, und es kommt häufig vor, dass Sie ganze Stücke eines Chips bewundern, aber kaum verwenden (daher: Clock Gating).
Die Menge an On-Chip-Hardware (und Variationen davon in nur einer Chipserie eines Anbieters) ist heutzutage ziemlich umwerfend. Ein Chiplieferant wird IP-Blöcke natürlich häufig wiederverwenden. Wenn Sie sich also mit einer bestimmten Marke vertraut gemacht haben, wird es einfacher, aber "Scheiße ist heutzutage verrückt geworden".
Wenn überhaupt, sind die Peripheriegeräte und ihre Interaktionen (und DMA und Interrupts und die Buszuweisung und und und ...) SO komplex (und gelegentlich nicht genau so, wie in den Datenblättern beschrieben), dass Ingenieure häufig eine bevorzugte Auswahl an ARM-MCUs und haben Ich tendiere dazu, einfach deshalb dabei zu bleiben, weil ich mit den Peripheriegeräten und Entwicklungstools vertraut bin.
Gute Bibliotheken und Entwicklungstools (z. B. schnelles Kompilieren und Debuggen mit einem geeigneten Debugger) und eine Vielzahl funktionierender Beispielcode-Projekte sind heutzutage für Ihre Entscheidung für eine ARM-MCU von entscheidender Bedeutung. Es scheint, dass die meisten Anbieter jetzt äußerst billige Evaluierungsboards haben (
Wie Sie sicherlich bemerkt haben, ändern sich die Regeln vollständig, sobald Sie die Mikrocontroller-Ebene mit ARMs und die SOC-Ebene (z. B. SOCs im Raspberry Pi / etc-Stil) überschritten haben und es dreht sich alles darum, welche Art von Linux Sie verwenden zu rennen, weil Sie - mit verschwindend wenigen Ausnahmen - wahnsinnig bellen würden, etwas anderes zu versuchen.
Grundsätzlich gilt; Kaufen Sie sich unabhängig von der CPU, die (möglicherweise) für Sie bei diesem Auftritt vorgewählt wurde, eine Handvoll supergünstiger Cortex-basierter Evaluierungsboards von verschiedenen Anbietern (TI, STM, Freescale usw.) und Machen Sie sich mit dem bereitgestellten Beispielcode vertraut.
Letzter Ratschlag; Sobald Sie im Datenblatt die Seite-oder-drei gefunden haben, die die Pin-Muxing-Optionen für den genauen Teilenummern- Chip beschreibt, mit dem Sie arbeiten, möchten Sie ihn möglicherweise ausdrucken und an die Wand kleben. Spät in einem Projekt herauszufinden, dass eine bestimmte Kombination von Peripheriegeräten aufgrund von Pin-Muxing nicht möglich ist, macht keinen Spaß, und manchmal sind diese Informationen so versteckt, dass Sie schwören würden, dass sie versuchen, sie zu verbergen :-)
quelle
Ich komme auch von AVR und bleibe jetzt meist bei STM32 (Cortex-M). Folgendes empfehle ich für den Anfang und reflektiere meine eigenen Schwierigkeiten, als ich anfing:
Holen Sie sich ein Board mit einem Debugger oder mindestens einem JTAG-Anschluss (und kaufen Sie dann einen JTAG-Debugger). Es gibt viele billige, und Sie werden viel Zeit sparen, indem Sie es verwenden.
Holen Sie sich eine gute IDE mit allem, was enthalten ist. Ich habe die CooCox CoIDE schon vor langer Zeit empfohlen . Seitdem wurde die Entwicklung gestoppt und neu gestartet, daher bin ich mir nicht sicher, wie es jetzt ist. "Eine gute IDE" ermöglicht es Ihnen, die grundlegende Hello World-LED im Handumdrehen blinken zu lassen.
"Eine gute IDE" sollte die CMSIS-Header des Herstellers einrichten. Dies sind im Grunde die Registerkarten, die das Schreiben von C / C ++ - Programmen mit Variablennamen anstelle von einfachen Zahlen und Zeigern erleichtern.
Versuchen Sie, die Peripheriebibliotheken des Herstellers zu verwenden, wenn Sie nicht die absolut beste Leistung benötigen. Das tust du eigentlich erstmal nicht, seit du lernst. Wenn Sie später feststellen, dass Sie mehr auspressen müssen, schauen Sie in den Bibliothekscode, um zu sehen, wie er was bewirkt. Das Gute an Bibliotheken ist auch, dass Sie in der Regel viele verschiedene Chips desselben Herstellers mit demselben Code verwenden können.
Anders als bei AVR beginnen die ARM-Chips mit deaktivierten Peripheriegeräten. Sie müssen sie zuerst aktivieren. In einer guten Peripheriebibliothek finden Sie Beispiele für die ordnungsgemäße Verwendung der Peripheriegeräte. Weitere Informationen finden Sie im Datenblatt des Geräts. Denken Sie also daran, die Uhren und Peripheriegeräte zu aktivieren, bevor Sie sie verwenden. Ja, auch die E / A-Ports werden als Peripheriegeräte betrachtet.
Code, wie Sie lernen. Versuchen Sie nicht, alles auf einmal zu grillen, da es wirklich sehr komplex ist. Ich beginne mit dem Erlernen des Uhrenbaums (APB, AHB usw. Busse) und der Interaktion von Uhren und Uhrenteilern. Dann würde ich schauen, wo die IDE die Linker-Skripte und den Startcode für Ihr Gerät speichert . Mit dem Linker-Skript organisieren Sie den Speicher (RAM, Flash, ISR-Vektortabelle usw.). Das Startskript richtet Ihr Programm ein (z. B. Kopieren globaler Variableninitialisierer von Flash in den Arbeitsspeicher). Einige IDEs verfügen über Startskripte in ASM und einige über Startskripte in C. Manchmal können Sie in der von Ihnen bevorzugten Sprache nach einem anderen googeln.
Bringen Sie den Debugger so schnell wie möglich zum Laufen. Es ist durchaus üblich, am Anfang einen Fehler zu machen, indem Sie einige Dinge (normalerweise Hardware-Initialisierung) in einer anderen Reihenfolge ausführen, als Sie sollten. Dies löst manchmal eine ISR-Ausnahme aus, die Sie in eine
while(1);
Endlosschleife versetzt (Standardimplementierung für diesen ISR), die Ihr Programm anhält und selbst mit einem Debugger schwer zu verfolgen ist. Stellen Sie sich ohne Debugger vor.Wenn Sie über einen Debugger sprechen, versuchen Sie, den UART ebenfalls in Gang zu setzen, und verwenden Sie dann einen seriellen USB-Adapter, um dies zu lesen.
printf()
debuggen ist immer nützlich :-)quelle
Ich habe nicht viel an 8051, AVR oder PIC gearbeitet. Vor kurzem habe ich begonnen, mir die ARM Cortex MX-Prozessoren anzuschauen. Daher kann ich Ihnen nicht viel über den Übergang von 8051, AVR oder PIC erzählen, aber meistens vom Standpunkt eines Anfängers.
Der ARM®Cortex ™ -M4-Prozessor basiert auf der Harvard-Architektur und verfügt daher über separate Daten- und Befehlsbusse. Unten ist ein Bild auf hoher Ebene.
Diese Woche werden Vertreter von NXP unsere Einrichtung besuchen. Ich werde bei ihnen nach NXP ARM-Cortex Mx-Ressourcen suchen und sie hier veröffentlichen. Freescale verfügt über Kinetis Low Power 32-Bit-Mikrocontroller (MCUs), die auf ARM® Cortex®-M-Kernen basieren . Ich verstehe, dass sie auch ähnliche Anleitungen zum Erlernen von ARM-Prozessoren haben. Leider habe ich sie nicht recherchiert.
Verweise:
quelle