Also wechsele ich von PICs zu ARM und kaufe ein STM32F4 Discovery Board. Soweit ich weiß, können Sie zum Programmieren entweder direkt auf alle Register im Speicher zugreifen (auf offensichtliche Weise), und es gibt drei Hauptbibliotheken, mit denen Sie Ihr Leben einfacher gestalten können. Nun ist meine Frage, welche dieser 3 (CMSIS, HAL, Std Peripherals Lib) die niedrigste Stufe ist? dh der mit dem geringeren Overhead. Mein Ziel ist es, das Innenleben des Controllers zu erlernen und mein Leben nicht (nur ein wenig) zu vereinfachen. Daher möchte ich gerne wissen, welches davon näher am Kern liegt, ohne die Montage zu verwenden.
29
Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h
oder inDrivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h
.Antworten:
Auf jeden Fall das CMSIS. Es ist nicht gerade eine Bibliothek, es enthält meist Definitionen für die verschiedenen Register.
Es ist genau das, was man braucht, um einfach auf die Register des Mikrocontrollers zuzugreifen, um seine / ihre eigene HAL zu implementieren. Es hat keinen Overhead, da Sie nur auf die Register zugreifen.
Beachten Sie, dass CMSIS im Gegensatz zu den beiden anderen von ARM und nicht von ST definiert wird. Dies bedeutet, dass die verschiedenen CMSIS-Bibliotheken für die verschiedenen Mikrocontroller sehr ähnlich sind, was die Portabilität erheblich verbessert.
Darüber hinaus ist CMSIS das einfachere und damit das vielseitigste und zuverlässigste (IMO) mit möglicherweise weniger (oder gar keinen) Fehlern. Einige hal-Bibliotheken für die verschiedenen MCUs, die ich verwendet habe, sind ziemlich berüchtigt für ihre Fehler.
Auf der anderen Seite benötigt CMSIS viel mehr Arbeit von Ihnen. Es ist jedoch meine persönliche Entscheidung, da ich es vorziehen würde, meine Zeit in die Erstellung hochwertiger Bibliotheken zu investieren, die meinen Bedürfnissen entsprechen und zu verstehen, wie der Chip funktioniert, und nur Zeit zu investieren, um nur eine neue Bibliothek zu lernen.
quelle
Um zu lernen, wie es funktioniert, möchten Sie keines der oben genannten verwenden. Holen Sie sich einen Arm Cross Compiler und die Dokumentation von st, fertig. Starten Sie die Codierung. Diese Chips sind in der Regel sehr einfach zu programmieren. In der Dokumentation erfahren Sie, welche Bits in welchen Registern was bewirken.
Alle diese Bibliotheken sollen Ihnen das Verständnis / die Last / die Arbeit nehmen und das Gefühl vermitteln, eine API-ähnliche Anwendungsprogrammiererfahrung zu haben. Welches ist, was viele Leute wollen. Sie können den gesamten Quellcode für diese Bibliotheken verwenden, um das Verständnis zu verbessern. Wenn Sie jedoch besser werden, finden Sie Lücken und Probleme in den Bibliotheken, manchmal sehr beängstigenden Code. Code wurde zusammen geworfen, generisch geschrieben und grob von einem Chip auf einen anderen portiert. Möglicherweise werden Funktionen unterstützt, die Ihr Chip nicht hat usw. Und alle haben einen übermäßigen Overhead. 10- bis 100-mal zu viel Code für die Aufgabe, sicher, dass viel davon wegoptimiert wird, aber warum ist er überhaupt da?
Unabhängig davon, ob Sie eine eigene oder eine dieser Bibliotheken verwenden, sollten Sie sich die Quelle der von Ihnen verwendeten Bibliotheken ansehen, um festzustellen, ob Sie mit ihren Funktionen vertraut sind, ob sie sinnvoll sind, mit der Dokumentation des Chips übereinstimmen usw. Wenn etwas schief geht, müssen Sie wahrscheinlich so viel durch ihre Sachen wie Ihre graben, um herauszufinden, warum.
Beachten Sie, dass die Chip-Dokumente auch nicht perfekt sind, das ist ein Teil des Spaßes.
Ich verstehe nicht, warum Baugruppen in einer Diskussion über Bare-Metal-Programmierung auftauchen. Sie kommen mit sehr wenig Montage aus. Für diese Cortex-M-Chips benötigen Sie technisch gesehen nur so viel Asm, um gebootet zu werden:
Sie können sich weder auf Daten noch auf BSS verlassen, und Sie können nicht mit einem Minimum an Asm von Main zurückkehren. Aber das ist alles, was Sie für die Barest of Bare Metal brauchen. Wenn Sie nun Interrupts ausführen möchten, benötigen Sie weitere Einträge in der Vektortabelle. mehr .word Zeilen. Ich empfehle mehr asm, aber vielleicht 10 oder 20 Zeilen mehr.
Das ist normalerweise alles, was ich benutze.
Ja, es heißt Cortex-m0, aber dies ist der eigentliche Bootstrap für meinen M4-Code. Ich bevorzuge es, daumen nicht daumen2 zu sein. Und ich verwende diesen Code einfach von einem Kortex-m zum anderen und ändere die Stapelzeigeradresse nach Bedarf, sodass er für m0, m3 und m4 funktioniert. Ich habe noch kein m7 und habe auch nicht viel recherchiert.
Für die Aktivierung der fpu sind möglicherweise einige Zeilen mehr erforderlich, da spezielle Anweisungen erforderlich sind. Aber der Punkt ist nicht zu verwechseln Low-Level-Programmierung und asm. C hat alles, was Sie brauchen, um den Chip zu konfigurieren und eine Anwendung zu schreiben. Die Bibliotheken, von denen Sie sprechen, sind in C und nicht in asm geschrieben, daher müssen sie offensichtlich auch nicht asm verwenden.
Wenn Sie das Innenleben lernen möchten, schreiben Sie Ihren eigenen Code. Verwenden Sie diese Bibliotheken nur als Referenz. Manchmal ist es einfacher, es einfach zu hacken, als zu versuchen, ihren Code zu lesen. (Nicht nur ST, sondern alle Anbieter. Einer der Anbieter hatte eine Codezeile, die so alarmierend ist, dass ich sie als Interviewfrage verwende, dass ich sie hier nicht veröffentlichen werde.)
Um Strom zu sparen, haben aber definitiv auch andere Hersteller Taktfreigaben für Teile des Chips. Bevor Sie also hineingehen und versuchen, eine LED zu blinken, müssen Sie das Freigabebit für diesen GPIO-Block finden und sehen, ob es herauskommt of reset enabled, wenn nicht, aktivieren Sie es. Wenn Sie mit dieser gpio-Logik sprechen, ohne dass eine Uhr aktiviert ist, hängt sie den Prozessor einfach auf, während er auf eine Antwort von der Logik wartet, die niemals antwortet. Sie erzählen nicht immer von diesen Möglichkeiten. Einmal aktiviert, werden Sie manchmal durch das Init für ein bestimmtes Peripheriegerät geführt. ST-Dokumente sind ziemlich gut. Wenn Sie von einem Mikrochip kommen, der eine ziemlich schlechte Bewertung für die Dokumentation erhält, sollten Sie kein Problem haben.
quelle
I have used both, just bare metal register access and the std peripheral library. I find it easier just to deal with the registers. Also if you are using a debugger you can view the registers and confirm they contain what you programmed them to be. I think you do learn more about the operation of the chip in that way also.
quelle
Comming from the 8bit world I was always used to programming peripherals via registers. Microcontroller data sheets (i.e STM32 reference manuals) describe the peripherals exclusively in register notation. Since the programmer must read this very same documentation to know about the peripheral funtions and features before any attempt is made to use it then it seems natural to me to start programming the registers. With carful code layout and commenting I find the code can be pleasantly to read and modify even after coming back to it months later.
quelle
Until now I have used CMSIS definitions and enjoyed using registers directly. Meanwhile, I used HAL libraries in few projects. It had a considerable influence on code running time so I quit it. Although CMSIS serves my interest, these days I am going to be a fan of libopencm3. It is like
LL
libraries provided by ST. However, it covers more micro-controllers even in ST families:please note that:
you can find the list of supported micro-controllers here.
quelle
adc_get_result()
which wraps in the complete ADC peripheral driver including real-time aspects, interrupts etc. The ST one seems to rather bewrite_to_scary_register
which is basically just a bloated wrapper around the register access. In all fairness, ST isn't the only vendor to provide such excess bloat, Atmel ASF and others are equally bad.