Forum: Mikrocontroller und Digitale Elektronik STM32 HAL und CMSIS


von Student (Gast)


Lesenswert?

Guten Tag,
Kleine Verständnisfragen. Arbeite derzeit mit einem STM32F3 Nucleo 
Board. Nun habe ich ein paar Fragen zu den Headern:

1. Es gibt eine CMSIS Datei. Laut Doku wird diese von dem 
Halbleiterhersteller und von ARM erstellt um eine standardisierte 
Schnittstelle für Programmierer zu erstellen. Die CMSIS ist aber für 
jeden uC unterschiedlich. Ist das richtig?

2. Habe im Projekt noch eine "stm32f3xx_hal.c" Datei. Ist dies die HAL 
Bibliothek? Also eine Bibliothek für die Peripherie des Boards?

3. Was hat es mit dem STM32CubeMX aufsich? Habe gelesen es ist eine 
Ablösung des Standard Peripherie Library?

Wie ihr seht bin ich etwas verwirrt mit den ganzen Bibliotheken. Könnte 
mich bitte jemand aufkären?

: Verschoben durch User
von Student (Gast)


Lesenswert?

Und was ist der Unterschied zwischen HAL und CMSIS? Sind doch beides 
eine Hardware Abstraction Layer?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Student schrieb:
> Die CMSIS ist aber für jeden uC unterschiedlich

Jein.

CMSIS steht für "Cortex Microcontroller Software Interface Standard" und 
stammt als Konzept erst einmal von ARM selbst. Da gibt es einerseits 
generische Abstraktionen für die Prozessor-Cores und deren von ARM 
spezifizierte Standard-Peripherie (System control block, Nested vectored 
interrupt controller, Systick timer).  Andererseits gibt es unter diesem 
Titel noch weitere zentrale Vereinheitlichungen wie das Debug-Interface 
(CMSIS-DAP) oder eine DSP-Library.

Andererseits sortiert typischerweise jeder Hersteller in diese 
Hierarchie auch seine controllerabhängigen Headerfiles ein, die die 
jeweilige Peripherie des Controllers zugreifbar machen und beschreiben. 
Diese includieren dann in der Regel auch die core-spezifischen Details 
aus dem allgemeinen CMSIS-Teil.  Mit passenden -I-Optionen des Compilers 
brauchst du dann nur noch sowas wie:
1
// STM
2
#include "stm32f4xx.h"
3
#include "system_stm32f4xx.h"
4
5
// Atmel/Microchip
6
// use e.g.-D__ATSAME70Q21__ to define exact device type
7
#include "sam.h"

… und hast alle nötigen Definitionen zusammen.

von Stefan F. (Gast)


Lesenswert?

Was du da mit CMSIS genannt hast, ist nur die CMSIS-Core. Darin befinden 
sich die Namen und Strukturen der I/O Register, sowie eine kleine Menge 
Hilfsfunktionen zum Konfigurieren des ARM Kerns.

Darauf aufbauend gibt es diverse CMSIS-xxxx Libraries (z.B. CMSIS-RTOS), 
die du vermutlich nicht vorliegen hast.

ST hatte früher die SPL Library verbreitet wleche auf CMSIS-Core aufbaut 
und Hilfsfunktionen zur Nutzung der Peripherie bereit stellt, die ST um 
den ARM Kern herumg gebaut hat.

Seit etwa 2012 wurde die SPL durch die Cube-HAL abgelöst. Diese basiert 
ebenfalls auf CMSIS-Core und erfüllt den gleichen Zweck.

CubeMX ist ein Desktop-Programm, welches Quelltext-Projekte generiert, 
die auf Cube-HAL aufbauen. In CubeMX kannst du in einer grafischen 
Ansicht den I/O Pins Namen geben, die Takt-Versorgung konfigurieren und 
I/O Funktionen konfigurieren. Auf Knopfdruck wird dann ein 
Quelltext-Projekt erzeugt, dass entsprechenden Startup-Code enthält.

Mir gefällt diese Entwicklungsmethode nicht. Ich lese lieber 
Referenzhandbücher und programmiere selbst auf Basis der CMSIS. Ich 
verspreche mir davon, meine Projekte und Arbeitsweise nicht zu sehr an 
die Produkte von ST zu binden.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefanus F. schrieb:
> Ich verspreche mir davon, meine Projekte und Arbeitsweise nicht zu sehr
> an die Produkte von ST zu binden.

Kann ich bestätigen. Wir bauen eine Software auf Basis vorrangig von 
Atmel-ARMs, wobei wir deren Pendant (ASF) auch nicht oder nur zu ganz 
kleinen Teilen benutzt haben. Portierung auf einen STM32(F4) war dann 
kein übertriebener Kraftakt. Am weitesten divergierend sind 
Port-Interrupts: bei Atmel (und vermutlich auch anderen) gruppieren sie 
sich nach der jeweiligen PIO (also PA0 und PA1 triggern den gleichen 
Vektor), bei STM dagegen nach der Bitnummer (also PA0 und PB0 triggern 
den gleichen Interruptvektor).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.