Forum: Mikrocontroller und Digitale Elektronik STM32: To HAL or not to HAL


von Karl (Gast)


Lesenswert?

Hallo liebes Forum,

derzeit evaluiere ich die STM32F für den echten Einsatz im 
Industrieumfeld. Dazu gehört natürlich auch die Entwicklungsumgebung und 
die Libs.

Jetzt muss ich sagen, dass der neue HAL seit CubeMX nicht voll 
überzeugen kann. Das Ding tut einfach zu oft nicht das, was man 
erwartet. Natürlich geht nichts über Manual lesen und dann den HAL-Code 
durchforsten. Allerdings gehe ich bei etwas, das sich HAL nennt 
eigentlich davon aus, dass es die Hardware auch tatsächlich abstrahiert 
und nicht nur Register umbenennt und verschleiert was eigentlich 
passiert.

Anfangs war ich auch geblendet von "Projekt inkl. Betriebssystem in 
wenigen Klicks". Für mich ist das aber alles sehr halbgar.

Nun zur eigentlichen Frage: Verwendet jemand im professionellen Umfeld 
den STM HAL (oder die alte Peripherielib) und kann kurz die Erfahrungen 
schildern? Oder auch: Warum wird es nicht verwendet?

Viele Grüße
Karl

von Marcus (Gast)


Lesenswert?

Kurze Zwischenfrage: Nutzt Du bereits andere ARMs mit CMSIS?

von Karl (Gast)


Lesenswert?

Nein, das davor waren es ATMEL SAM7S und da gab es meines Wissens nach 
noch kein CMSIS.

von Mr.T (Gast)


Lesenswert?

Karl schrieb:

> Nun zur eigentlichen Frage: Verwendet jemand im professionellen Umfeld
> den STM HAL (oder die alte Peripherielib) und kann kurz die Erfahrungen
> schildern? Oder auch: Warum wird es nicht verwendet?
Wir verwenden es exakt wegen der Erkenntnisse, die Du auch gewonnen 
hast, nicht.

von Milad (Gast)


Lesenswert?

Hallo,

In StdPeriph_Driver von ST sind alle Dateien für HAL vorhanden. Die 
Registerprogrammierung wie „DMA1->LIFCR = DMA_Stream0_IT_MASK;“ bedarf 
einen tiefen Einblick in den Dokumenten von ST.
Sonst kann ich nur sagen dass auch in ST-Codes Bugs existieren die 
gefunden werden sollen, aber im allgemeinen funktionieren die Methoden 
sehr gut. Ich würde auf jeden Fall die HAL-Funktionen von ST verwenden, 
wenn ich Probleme bekomme suche nach gezielten Infos.

Gruß
Milad

von TTL (Gast)


Lesenswert?

Ja, wir setzen seit einigen Jahren die STM Lib professionel ein.

Es gibt auf Nachfrage bei STM sogar eine Tüv zertifizierte mit 
Speichertests gemäß EN 61508.

So schlecht wie das hier von dem Amateuren gemacht wird, sind die libs 
also nicht.

von Karl (Gast)


Lesenswert?

Vielen Dank für die Hinweise.
Wie ist denn bei Verwendung der Lib das übliche Vorgehen?

Bis jetzt kam ich nicht um ein exaktes Studium des Datenblatts (inkl.der 
Register) herum. Dann muss ich oft auch die Lib-Quellen studieren, um 
herauszufinden welchen Parameter man setzen muss um welches Register zu 
beschreiben. Habe ich einfach Pech mit meiner Auswahl der Peripherie 
gehabt oder ist das durchaus normal? (CAN und USB-FS)

In dem USB-Stack ist dann auch noch ein übler Bug drin, der den 
Interrupt nicht zurücknimmt und folglich den Rest des Frames in einer 
"Interrupt-Endlosschleife" hängt.

So ganz überzeugt bin ich nicht, aber evtl. läuft es auf eine Koexistenz 
hinaus. Lib für eine Peripherie solange bis sie negativ auffällt 
verwenden. Dann selbst machen...

von adenin (Gast)


Lesenswert?

Karl schrieb:
> In dem USB-Stack ist dann auch noch ein übler Bug drin,

Da sind noch mehr üble Bugs im USB-Stack drin :P

von Karl (Gast)


Lesenswert?

Einer der mir schon auf die Schnelle aufgefallen ist ;-)

von Jan K. (jan_k)


Lesenswert?

Meint ihr mit HAL die Funktionen der StdPeriphLib (derzeit v3.5), oder 
gibt es da noch was anderes?

Wir benutzen jedenfalls das CMSIS für die ganzen netten Registernamen 
etc. und die stdlib primär, um peripherie zu initialisieren, da man 
dadurch weniger Fehler beim rumwürfeln mit den Control Register Bits 
macht.
Die einfachen Sachen (spi, dma, adc etc) danach schreiben wir "direkt", 
ohne Umweg über die Lib. Sie kann aber z.B. bei flash oder gar eeprom 
emulation hilfreich und ein Anhaltspunkt sein.

Schöne Grüße,
Jan

von Karl (Gast)


Lesenswert?

Seit STM die CubeMX-Software eingeführt hat, haben sie einen HAL 
eingeführt. Darin findet sich im Großen und Ganzen die alte Lib wieder.

von Di P. (drpepper) Benutzerseite


Lesenswert?

adenin schrieb:
> Karl schrieb:
>> In dem USB-Stack ist dann auch noch ein übler Bug drin,
>
> Da sind noch mehr üble Bugs im USB-Stack drin :P

Habt ihr / gibt es da eine genauere Beschreibung?

von Steffen R. (steffen_rose)


Lesenswert?

Karl schrieb:
> Seit STM die CubeMX-Software eingeführt hat, haben sie einen HAL
> eingeführt. Darin findet sich im Großen und Ganzen die alte Lib wieder.

Leider haben sie einmal wieder die API geändert. Auch wenn es 
größtenteils nur die Namensgebung ist. Heißt für uns mal wieder 
Fleißarbeit.

von Karl (Gast)


Lesenswert?

Aus dem Stehgreif fallen mir zwei Bugs ein:
- Der Interrupt wird beim Senden nicht mehr deaktiviert, so dass der 
Prozessor quasi 100% damit ausgelastet wird
- Beim Verschicken von Paketen mit z.B. 64 Byte wird kein ZLP 
nachgeschickt, so dass die Daten im PC erst auftauchen, wenn zufällig 
mal wieder was geschickt wird.

von Ch. K. (Gast)


Lesenswert?

Jan K. schrieb:
> Wir benutzen jedenfalls das CMSIS für die ganzen netten Registernamen
> etc. und die stdlib primär, um peripherie zu initialisieren, da man
> dadurch weniger Fehler beim rumwürfeln mit den Control Register Bits
> macht.
> Die einfachen Sachen (spi, dma, adc etc) danach schreiben wir "direkt",
> ohne Umweg über die Lib. Sie kann aber z.B. bei flash oder gar eeprom
> emulation hilfreich und ein Anhaltspunkt sein.

witzig, genau so gehen wir auch vor

von ♪Geist (Gast)


Lesenswert?

Ich arbeitete nur noch mit der StdLib von STM. Habe keine Zeit/Lust mich 
mit dem ganzen Zeug auf der Registerebene herumzuschlagen. Hatte schon 
ein paar unschöne Sachen erlebt, aber im großen kann man sich auf die 
StdLib von ST verlassen.

von Thomas T. (runout)


Lesenswert?

Hallo Gemeinde,

ich muss das Thema noch mal aus der Versenkung holen...
Benutzt mittlerweile jemand STM32Cube/HAL?
Habe ein Nucleo64-Board (STM32L467RGxx) und möchte
einen (vorhandenen) CANopen-Stack implementieren.

Wenn ich solche Konstrukte sehe kriege ich aber eher die Krise:

uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
{
   return SysTick_Config(TicksNumb);
}
aus "stm32l4xx_hal_cortex.c":

Wie es bis jetzt aussieht würde SPL oder evtl. CMSIS ausreichen.
Das HAL-Zeugsl maximal für die Init-Routinen.

Wie ist eure Meinung zu "To HAL or not to HAL"?

Runout

von Mehmet K. (mkmk)


Lesenswert?

Ich arbeite sehr gerne mit der StdLib, da ich dort die Schritte 
nachvollziehen kann, um dann das, was mir nicht passt, selbst zu 
schreiben.
Dort, wo es keine StdLibs mehr gibt (z.Bsp. STM32L0xx) sondern nur noch 
HAL, habe ich auf die direkte Register-Programmierung gewechselt. Denn 
beim geschwaetzige HAL-Stakkato habe ich keinen Durchblick mehr.

von Phantomix X. (phantomix)


Lesenswert?

Hallo!


Ich bin gerade dazu übergegangen, mir meine eigene Lib zu stricken und 
da immer Funktionen reinzutun, die ich gerade brauche. Vorallem will ich 
auch mehr als eine "Registerabstraktion" machen, sondern für meine 
Anwendungsfälle ausgelegten Code. Dazu zählt bspw. UART/SPI/I2C die 
komplett im Hintergrund ablaufen, mit Puffern, Queues und allem.

Aktuell läuft
- ISR Vektoren
- RCC teilweise
- GPIO
- USART incl. printf
- I2C
- SPI
- EXTI
- darauf aufgesetzt: Buttons mit Polling/EXTI und Entprellung, Callbacks 
etc
Gegenwärtig bin ich dran, USB auf nem L052 zu implementieren, das ist 
ein ziemlicher Brocken.




Wenn man mit StdPeriphLib / HAL nicht zufrieden ist, lohnt es sich evtl. 
auch, das libopencm3-Projekt anzuschauen, die sind ziemlich weit in 
ihrer Umsetzung.

: Bearbeitet durch User
von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Thomas T. schrieb:

> Wie ist eure Meinung zu "To HAL or not to HAL"?

Ich kann zumindest die Kritik, dass die "abstraction" Library nicht 
wirklich eine Abstraktion ist, gut verstehen.

Ich nutze die HAL, da wo es das ganze einfacher macht. Die Dokumentation 
steckt zum Teil eher in den Beispielen.

von Vincent H. (vinci)


Lesenswert?

An die ganzen HAL-Kritiker, bitte gebt doch mal ein Beispiel an wie 
Hardware-Abstraktion für euch aussieht.

HAL macht:
- Initialisierung mit Enum Klarnamen
- Statusmeldungen in den zugehörigen Strukturen
- Verlinkung von Peripherie, DMA und IRQ
- Handhabung von exclusive access an die Hardware

Was fehlt da noch?

von hp-freund (Gast)


Lesenswert?

Endlich mal einer dafür. :)

von Harry L. (mysth)


Lesenswert?

hp-freund schrieb:
> Endlich mal einer dafür. :)

...und noch Einer!

von Random .. (thorstendb) Benutzerseite


Lesenswert?

neverHAL. Das selbst tun, was notwendig ist.
Man kann es nicht allen recht machen, bzw. ists dann stark aufgeblasen, 
und teilweise komplizierter, als wenn man direkt auf die Register geht 
:-)

: Bearbeitet durch User
von Mac G. (macgyver0815)


Lesenswert?

Ich hab den HAL Kram noch nicht verwendet - aber soll das nicht 
eigentlich dazu da sein, dass es einfacher mit einem RTOS zu nutzen ist?
Könnte auch ein Grund sein warum manches etwas aufgeblasen ist - ist im 
Linux Kernel ja auch so ;-)

von Jens (Gast)


Lesenswert?

Hallo,

wir arbeiten überwiegend auch mit den Standard Bibliotheken von ST. Im 
großem und ganzem kann man damit schon recht gut arbeiten. Es kommt aber 
drauf an welchen Core Typen du verwenden willst.

Ich persönlich bin vom STM32F0 mittlerweile etwas enttäuscht. Er macht 
zwar alles was man will, aber einige Sachen sind nicht so komfortable 
wie ich es von anderen Controllern, auch abseits des Arm Bereiches, 
kannte.

Beispiele die mir auf Anhieb einfallen wo wir doch arg gekämpft haben:
- EEproms mit 1Mbit bzw mit mehr als 10bit Adressraum lassen sich nicht 
besonders gut via I2C an den F0 anbinden. Das Funktioniert so nicht. 
Scheint aber mehr an der Hardware als an den Libs zu liegen. Da muss man 
schon reichlich in die Trickkiste greifen.
- Das Alligment bei den AD Werte lässt sich über die libs nicht 
vernünftig einstellen. Was wir auch taten, es war immer links 
ausgerichtet. Da half nur manuelles schieben.
- Bei Umstellung des Controllers auf einen größeren mit gleichem Pinning 
haben sich die Zuordnung der SPIs verändert (trotz gleichem Pinnings 
wurde aus SPI1 -> SPI2)- damit auch die Zuordnung der DMAs. Das habe ich 
nicht mehr ans laufen bekommen via DMA. Mit der neuen DMA Nummer ging 
das dann aber gar nicht mehr.
- Generell hat sich DMA und SPI als Slave sehr zickig angestellt und 
immer die ersten 2 Bytes beim senden verschluckt.
- Nen vernünftigen Zufallsgenerator gibt es auch nicht. Hier muss man 
auch tricksen.

Wir haben in jedem dieser Fälle die libs verwendet und sind an Grenzen 
gekommen.

Also zumindest den F0 Typen finde ich relativ zickig. Kollegen haben 
aber schon mit anderen ST Arm Derivaten gearbeitet und sind sehr zu 
Frieden gewesen. Kommt aber sicher auf die Anwendung an die man hat. Für 
viele unser Anwendungen reicht das Ding aber voll aus. Es kommt eben 
immer drauf an was man tun will...

Grüße

Jens

von Dr. Sommer (Gast)


Lesenswert?

Die STM32F4 und STM32F7 haben eine identische SDIO-Peripherie u.a. zur 
Kommunikation mit SD-Karten (bis darauf dass im F7 ein paar 
Hardware-Bugs gefixt sind). Leider hat sich irgendein Schlaumeier 
ausgedacht, die beim F7 nach "SDMMC" umzubenennen. Dementsprechend sind 
auch die HAL-Funktionen umbenannt - somit kann man mit der STM32-HAL 
nichtmal die gleiche Peripherie auf unterschiedlichen Controllern mit 
dem selben Code nutzen! Das ist für mich keine Hardware-Abstraktion.

Weiteres Beispiel: Die GPIO-Peripherie der F1 und der F4 unterscheiden 
sich. Dementsprechend sind auch die HAL-Funktionen unterschiedlich, und 
man kann den gleichen Code nicht auf beiden Controllern verwenden. 
Somit ist mit der "HAL-Library" nichts gewonnen, da kann man aus den 
oben bereits genannten Gründen lieber direkt auf die Register 
zugreifen...

von Matthias K. (mkeller)


Lesenswert?

Also privat nutze ich gern ChibiOS/RT bzw. ChibiOS HAL: 
http://www.chibios.org/dokuwiki/doku.php?id=chibios:product:hal:start

Der Abstraktionsgrad ist hier schon sehr hoch, im beruflichen Umfeld hab 
ichs bisher nur für kleine Prototypen genutzt, bei der ich sehr schnell 
eine funktionierende Lösung brauchte...

Hat hier schon jemand Erfahrung bei größeren Projekten gesammelt?

von Lukas K. (carrotindustries)


Lesenswert?

Vincent H. schrieb:
> HAL macht:
> - Initialisierung mit Enum Klarnamen

Das könnte man auch haben, wenn ST gescheite Header ausliefern würde, 
die für Bitfelder in Registern benannte Konstanten enthalten.

von Bastler (Gast)


Lesenswert?

Matthias K. schrieb:
> Also privat nutze ich gern ChibiOS/RT bzw. ChibiOS HAL:

Hallo,

darf ich Fragen wie lange du dich einarbeiten musstest?

von cs (Gast)


Lesenswert?

Hallo,

dass es mit CubeMX ein Programm gibt bei dem man Pins zuordnen kann und 
ein Codegeruest mit Initialisierung erzeugen kann finde ich schon ganz 
praktisch. Die HAL Treiber sind dann jedoch schon mit Vorsicht zu 
geniessen. Damit der USB Device Port eines STM32L1 funktionierte habe 
ich mal ewig gesucht. Da kommt man dann auch nicht darum herum 
Datenblaetter zu studieren und schauen was welches Bit in welchem 
Register bedeutet.

Die Performanz wird zwar durch Compiler-Optimierung schon sehr gut, 
jedoch ist hald von Hand immer noch ein wenig schneller.

Wer Zeitunkritisches machen will und wenn es fertige funktionierende 
Funktionen (z.B. PWM-Erzeugung mit einem Timer, Daten mit UART im 
Interrupt-Modus versenden, etc.) gibt kann hier durchaus zu HAL greifen. 
Wenn es aber ins eingemachte geht kommt man mit HAL schnell an die 
Grenzen bzw. an die Bugs...

Cheers

von Gerd E. (robberknight)


Lesenswert?

Matthias K. schrieb:
> Also privat nutze ich gern ChibiOS/RT bzw. ChibiOS HAL:
> http://www.chibios.org/dokuwiki/doku.php?id=chibios:product:hal:start

Ja, das nutze ich auch gerne. Im Gegensatz zu dem "HAL" von ST bekommt 
man hier wirklich eine echte Abstraktion geboten.

Nachteil ist daß nicht alle Details der Peripheriemodule unterstützt 
werden. Z.B. kann man im Chibios-HAL den Ausgang der Komparatoren nicht 
direkt als Stop fürs PWM verbinden.

Wenn ich sowas brauche, setze ich an dieser Stelle das Register direkt. 
Zusätzlich kommt ein einheitlich formatierter Kommentar an die Stelle.
So kann ich alle betroffenen Stellen mit einem grep ruckzuck im gesamten 
Projekt finden, den Anpassungsaufwand abschätzen und bei Bedarf auch 
schnell migrieren.

von Matthias K. (mkeller)


Lesenswert?

Bastler schrieb:
> Matthias K. schrieb:
>> Also privat nutze ich gern ChibiOS/RT bzw. ChibiOS HAL:
>
> Hallo,
>
> darf ich Fragen wie lange du dich einarbeiten musstest?

Sehr sehr kurz (~ 2 Hobby-Tage). Wobei meine bisherige Anwendungen eher 
klein sind/waren.
Ich muss eher sagen, dass ich mich mit den Controllern (STM32F407 und 
STM32F3103) bzw. der Architektur selber  noch zu wenig beschäftigt habe.

Beispiel: Lichtwecker mit RGBW-Dimmer mit IRMP, kleiner Shell. Vieles 
geht eben schon einfach out-of-the-box.

Oder ein kleiner Stimulator für eine unserer Industriesteuerungen 
(einlesen von 5x ADC, phasenverschobene Frequenz erzeugen, CAN-Bus 
senden/empfangen ...). Ich musste mich dazu kaum mit den Datenblättern 
beschäftigen, sondern hatte das ganze Ding innerhalb von ein paar 
Stunden fertig. Inklusive komfortabler Cmd-shell...


Klar hätte man das alles mit einem 8bit Controller machne können und 
ganz sicher auch "bare-metal" mit dem STM32.


Ich persönlich fand die ST-lib eher abschreckend, da ich das gefühlt 
hatte dass eigentlich nur die Register in structs gepresst sind ohne 
wirkliche Abstraktion. Könnte aber auch nur ein Vorurteil sein, da ich 
mich nie wirklich damit befasst habe..

von Matthias K. (mkeller)


Lesenswert?

Gerd E. schrieb:
> Nachteil ist daß nicht alle Details der Peripheriemodule unterstützt

Ja das stimmt leider. Aber dafür ist der Rest wirklich durchdacht und 
sehr sauber. Ich fand mich im Code sehr schnell zurecht.

Eine USB-Host Funktion gibt es z.B. auch nicht. Genauso fehlt I2C Slave 
und SPI Slave...

von Basti (Gast)


Lesenswert?

Wir nutzen die HAL auch.
Aber so richtig sind wir trotzdem nicht überzeugt!
Beispiel:
Im UART Interrupt führt der HAL ein obligatorisches Flush aus, man 
könnte ja in der recv vergessen das Byte zu holen...
Finde ich nicht sauber, bei schneller UART und langsamer Clock. So ist 
die HAL teilweise so ineffektiv, dass es ein Byte wegflusht.

Trotzdem denken wir, wenn nur wir an der Lib arbeiten, dann ist es noch 
wahrscheinlicher Fehler im Quellcode zu haben.

Ob wir nun Fehler im HAL suchen oder im eigenen Quellcode ist dann 
soweit auch egal!

von Gerd E. (robberknight)


Lesenswert?

Bastler schrieb:
>> Also privat nutze ich gern ChibiOS/RT bzw. ChibiOS HAL:
> darf ich Fragen wie lange du dich einarbeiten musstest?

Ich fand die Einarbeitung ins ChibiOS, also sowohl das HAL, als auch das 
RT oder NIL, ziemlich schnell machbar. Innerhalb von wenigen Stunden 
kann man da richtig loslegen, also nicht nur ein Blinky, sondern mehrere 
Threads, die untereinander mit Events kommunizieren, Locking, etc.

Zum Einstieg empfehle ich unbedingt das hier:
http://chibios.org/dokuwiki/doku.php?id=chibios:book:start

von W.S. (Gast)


Lesenswert?

Karl schrieb:
> Allerdings gehe ich bei etwas, das sich HAL nennt
> eigentlich davon aus, dass es die Hardware auch tatsächlich abstrahiert
> und nicht nur Register umbenennt und verschleiert was eigentlich
> passiert.

Eben.

Das Zeugs, was ST da verzapft hat, ist nur zusätzlicher Ballast, der 
auch noch Bugs mit sich bringt. Deswegen benutze ich dies nicht.

Es sind ja nicht nur die vielbeschworenen Bugs, die man lieber im 
eigenen Code sucht als in Fremdcode, es ist vor allem die viele 
Schaumschlägerei um nichts. Eben Registerumbenennerei.

W.S.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Und wehe dem, der manche hal Funktionen in der nicht von St gewünschten 
Reihenfolge aufruft. Da musste dann eh jedes mal die Funktionen komplett 
durchblättern um sicherzugehen, dass der fehler nicht am "eigenen" code 
liegt.

von Thomas T. (runout)


Lesenswert?

Aber Holla,

da hat sich einiges angstaut...
Vielen Dank erstmal für die guten Hinweise.
Ich weis jetz ungefähr wo die Reise hingehen muss.

Werde mich wohl weiterhin in den "Niederungen" bewegen ;-)

Viele Grüße
Runout

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Vincent H. schrieb:
> An die ganzen HAL-Kritiker, bitte gebt doch mal ein Beispiel an wie
> Hardware-Abstraktion für euch aussieht.

Beispiel mit HAL:
1
    hdma_rx.Instance                 = receive_dma_channel;
2
    hdma_rx.Init.Direction           = DMA_PERIPH_TO_MEMORY;
3
    hdma_rx.Init.PeriphInc           = DMA_PINC_DISABLE;
4
    hdma_rx.Init.MemInc              = DMA_MINC_ENABLE;
5
    hdma_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
6
    hdma_rx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
7
    hdma_rx.Init.Mode                = DMA_NORMAL;
8
    hdma_rx.Init.Priority            = DMA_PRIORITY_HIGH;
9
    hdma_rx.Init.Request             = DMA_REQUEST_2;
10
11
    assert_ok( HAL_DMA_Init(&hdma_rx) );

Was ist DMA_REQUEST_2? Die ganzen Felder, die da gefüllt werden sind 1:1 
auf die Register der Pheripheral gemünzt.

Aber das eigentlich Problem ist, dass die Hardware nicht abstrahiert 
wird. Wenn ich eigentlich eine UART habe und von der Daten empfangen 
möchte, dann möchte ich eigentlich beschreiben, in welcher Granularität 
ich Daten vorgelegt bekommen möchte. Ob die MCU nun DMA kann und mein 
Problem evtl. am besten unter Verwendung der DMA gelöst wird, ist mir 
doch egal.

Die HAL bekommt es ja nicht mal hin, dass ich nicht im Datenblatt 
nachschlagen muss, das DMA in 2 Einheiten mit mehreren Kanälen arbeitet 
und ich muss dann raus suchen, welcher Kanal nun derjenige ist, denn 
ich verwenden muss, wenn ich den an eine UART ran binden möchte.

Ich denke das mit der Abstraktion kann man noch deutlich hoher ansetzen, 
als knapp über der Register-Nabe ;-) Und dann würde es die Produktivität 
auch deutlich erhöhen.

mfg Torsten

von Matthias K. (mkeller)


Lesenswert?

Beispiel aus meinem Projekt mit ChibiOS:
UART zur Kommunikation zum RasPi:

http://chibios.sourceforge.net/docs3/hal/group___u_a_r_t.html#details
main.c
1
/* UART driver configuration structure.*/
2
static UARTConfig uart_cfg_1 = {
3
  txend1, /*End of transmission buffer callback.*/
4
  txend2, /*Physical end of transmission callback.*/
5
  rxend, /*Receive buffer filled callback.*/
6
  rxchar, /*Character received while out if the @p UART_RECEIVE state.*/
7
  rxerr, /*Receive error callback.*/
8
  115200,
9
  0, /*STM32 HW dependent: Init value for the CR1 register*/
10
  USART_CR2_LINEN, /*STM32 HW: Init value for the CR2 register--> LIN mode */
11
  0  /*STM32 HW dependent: Init value for the CR3 register */
12
};
13
14
void main(void)
15
{
16
[...]
17
  uartStart(&UARTD1, &uart_cfg_1);
18
[...]
19
}

mcuconf.h
1
#define STM32_UART_USE_USART1               TRUE

halconf.h
1
#define HAL_USE_UART                TRUE

fertig.

Damit bekomme ich einen UART der im Hintergrund über DMA läuft

: Bearbeitet durch User
von Sepp aus Hintertupfing (Gast)


Lesenswert?

Thomas T. schrieb:
> Wie ist eure Meinung zu "To HAL or not to HAL"?

für mich ganz klar: NOT TO HAL

HAL gaukelt einen vor dass man sich um die HW Niederungen
nicht mehr kümmern muss und mit Cube x ist sowieso alles easy going.

Meistens läuft es doch so, dass man den CUBE x verwendet um
die Anschlüsse des Prozessors zu sortieren (dieser Teil ist sehr
gut) der Rest ...
Die Intialisierung geschieht dann mit HAL d.h. wenn ich es richtig 
verstanden habe muss ich den Rest mit HAL weitermachen.

Wenn man nun eine anspruchsvolle I2C Schnittstelle realisieren muss
( z.B. EEPROM , Bausteine ) dann startet mann damit, das man sich
bei Google von überall Beispiele zusammen kopiert
und daraus dann ein Geflickwerk implementiert.

Mit der Folge dass nichts funktioniert.

Spätestens zu diesem Zeitpunkt muss man nun doch in die
HW NIEDERUNGEN einsteigen !
Warum dann nicht gleich unten einsteigen ?

wie mach ich es ?
zuerst mal 3 Bildschirme am PC anschliessen.
Auf den Linken  das Referenzmanuel des entsprechenden Prozessors legen.
in der Mitte die Coocox IDE und auf den Rechten
die Beispiel Suchergerbnisse von "LOW End" Anwendungen.
Und dann: DIY .

Der Weg ist steinig aber es geht von mal zu mal besser.
Irgendwann ist man dann schneller wie die HAl'er ;-)

Nochmals: ich bin kein Glaubensverfechter
und wenn jemand mit HAL bestens zu recht kommt dann sei es ihm gegönnt.

Sepp aus Hintertupfing

von Thomas T. (runout)


Angehängte Dateien:

Lesenswert?

zumindest bei der STM32L4-Serie gibt es keine Alternative...
Entweder mit CubeMx oder "from the scratch".

CubeMx hat auch noch einen Low-Level-Treiber (LL)
aber da heißt es erst Mal: reinlesen...

Viele Grüße
Runout

von Lukas K. (carrotindustries)


Lesenswert?

Ich hatte mir letztens mal libopencm3 für USB angesehen und war recht 
überzeugt.
 - Deutlich übersichtlichere API
 - git pull , make und das Beispiel baut
 - beispielcode verwendet designated initalizers für deskriptoren

Mit POSIX/Linux-Hintergrund wird man sich bei libopencm deutlich 
heimischer fühlen als bei der HAL von ST. KISS, Worse is better und so

von Ben W. (ben_w)


Lesenswert?

internen ST mitarbeitern zu folge ist eine LL auch fpr die STM32F4 für 
2017 geplant.

aus den bisherigen Erfahrungen würde ich je nach projekt größe entweder 
ChibiOS/HAL oder CubeMX einsetzen.
eine weitere alternative wäre die libopenCM3, da habe ich aber bisher 
keine Erfahrung.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Diese Perle habe ich gerade beim Debuggen gefunden 
(HAL_I2C_Master_Transmit) ;-)
1
hi2c->Instance->TXDR = (*pData++);

von Stefan K. (stefan64)


Lesenswert?

Torsten R. schrieb:
> hi2c->Instance->TXDR = (*pData++);

Was ist an der Zeile so bemerkenswert?

Gruß, Stefan

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Die Klammern! :-)

: Bearbeitet durch User
von Stefan K. (stefan64)


Lesenswert?

hehe ;-)

Aber besser einmal zu viel geklammert als zuwenig (alte 
Kieferorthopäden-Weisheit).

Gruß, Stefan

von itzztitz (Gast)


Lesenswert?

hi

hat schonmal jemand die SAI mit HAL lib genutzt?
ich habe ein problem das full duplex mit I2S zu verwenden.

Beitrag "STM32F7xx und Audio codec am SAI2"

von Micha (Gast)


Lesenswert?

Stefan K. schrieb:
> Aber besser einmal zu viel geklammert als zuwenig (alte
> Kieferorthopäden-Weisheit).

Ich frage mich eher ob da nicht eine der Klammern an anderer Stelle sein 
müsste - aber ohne den Kontext zu kennen ist das schwer zu sagen. Also 
sowas:
1
hi2c->Instance->TXDR = (*pData)++;

von Di P. (drpepper) Benutzerseite


Lesenswert?

Micha schrieb:
> Stefan K. schrieb:
>> Aber besser einmal zu viel geklammert als zuwenig (alte
>> Kieferorthopäden-Weisheit).
>
> Ich frage mich eher ob da nicht eine der Klammern an anderer Stelle sein
> müsste - aber ohne den Kontext zu kennen ist das schwer zu sagen. Also
> sowas:
>
1
> hi2c->Instance->TXDR = (*pData)++;
2
>

Sicher nicht. Damit würde der Wert, der bei *pData steht erhöht werden, 
bevor er ins Senderegister kommt.
Das Ziel wird aber ganz sicher sein, den Lesepointer nach dem 
dereferenzieren um eine Adresse weiterzuschieben.

: Bearbeitet durch User
von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Micha schrieb:
> Ich frage mich eher ob da nicht eine der Klammern an anderer Stelle sein
> müsste - aber ohne den Kontext zu kennen ist das schwer zu sagen. Also
> sowas:
>
1
> hi2c->Instance->TXDR = (*pData)++;
2
>

Naja, wenn wir mal davon ausgehen, dass der Code "merkwürdig" aber 
Fehlerfrei ist, dann meinte der Autor bestimmt:
1
hi2c->Instance->TXDR = *(pData++);

dann würden die Klammern zwar immer noch überflüssig sein, aber beim 
Lesen helfen.

Ich würde dann aber immer:
1
hi2c->Instance->TXDR = *pData;
2
++pData;

bevorzugen

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

Sepp aus Hintertupfing schrieb:
> Nochmals: ich bin kein Glaubensverfechter
> und wenn jemand mit HAL bestens zu recht kommt dann sei es ihm gegönnt.

Da stimme ich dir zu, aber ich hab darüberhinaus noch einige andere 
Bedenken und Ansichten. Da ist z.B., daß man sich mit allen solchen 
Dingen wie ST-Lib, CMSIS und Konsorten ja nicht nur ne Menge 
zusätzlichen Zeuges inclusive tonnenweise zusätzlicher Identifier 
reinzieht, man zieht auch ganz leicht jedoch unbeabsichtigt einiges an 
ungewollten Bibliotheksfunktionen in sein System mit hinein. Ich habe in 
der Vergangenheit des öfteren sowas wie _main und __main und _break und 
Konsorten gehabt, die schlußendlich dafür gesorgt haben, daß mein System 
nicht so läuft, wie gewollt. Also Vorsicht mit sowas.

Weiters sieht es ja so aus, daß man - wenn man kein wirklich blutiger 
Anfänger ist - bereits ein ziemliches Portfolio an Peripherie-Treibern 
und hardwareunabhängigen Units hat, die man recht leicht weiterverwenden 
kann. Stellenweise sogar herstellerübergreifend - ich denke grad an die 
SD-Karten-Treiber von NXP, die man auch für die STM32 benutzen kann. 
Solche Treiber, die die HW tatsächlich abstrahieren, sind allemal 
nützlich - aber jedes Zeugs, daß aus einem Bit eines HW-Registers zwei 
#defines macht und sonst nichts weiteres dazu beiträgt, verdient die 
Bezeichnung HAL nicht. Das ist der Knackpunkt.

W.S.

von Di P. (drpepper) Benutzerseite


Lesenswert?

W.S. schrieb:
> ...- aber jedes Zeugs, daß aus einem Bit eines HW-Registers zwei
> #defines macht und sonst nichts weiteres dazu beiträgt, verdient die
> Bezeichnung HAL nicht.

Das ist doch gerade der Punkt an Hardware Abstraction Layers. Und die 
von dir so gefürchteten Unmengen an #defines werden von jedem mindestens 
mittelmäßigen Compiler ohne weiteres beherrscht und in der sehr großen 
Mehrheit aller Fälle mindestens so performant übersetzt wie geekige 
unlesbare Bitschieberei.

: Bearbeitet durch User
von Ist es echt? (Gast)


Lesenswert?

Karl schrieb:

> den echten Einsatz

Was ist ein ein "echter Einsatz"? Und was ist ein "unechter Einsatz"?

von W.S. (Gast)


Lesenswert?

Di P. schrieb:
> Das ist doch gerade der Punkt an Hardware Abstraction Layers.

Nein, das ist es eben nicht. Das schiere Erzeugen von zusätzlichen 
Bezeichnern ist eben keine Hardware-Abstraktion.

Di P. schrieb:
> Und die
> von dir so gefürchteten Unmengen an #defines werden von jedem mindestens
> mittelmäßigen Compiler ohne weiteres beherrscht..

Ja klar, aber der Compiler schreibt keinen Quellcode, sowas macht ein 
Mensch (jedenfalls in den meisten hier vorliegenden Fällen). Kurzum, 
es geht nicht um die Bedürfnisse und Grenzen eines Compilers, sondern um 
die Bedürfnisse und Grenzen des Menschen.

Grad eben haben wir hier in einem anderen Thread jemanden, der 
verzweifelt nach einer Funktion in seiner ST-Lib sucht, um mehrere 
Portpins zu setzen - bloß weil er vor lauter Pseudo-HAL der ST-Lib den 
Wald vor Bäumen nicht zu sehen vermag.

W.S.

von Di P. (drpepper) Benutzerseite


Lesenswert?

W.S. schrieb:
> Grad eben haben wir hier in einem anderen Thread jemanden, der
> verzweifelt nach einer Funktion in seiner ST-Lib sucht, um mehrere
> Portpins zu setzen - bloß weil er vor lauter Pseudo-HAL der ST-Lib den
> Wald vor Bäumen nicht zu sehen vermag.

Weiß jetzt nicht was an
1
HAL_GPIO_WritePin(
2
    GPIOA
3
    ,GPIO_PIN_0 | GPIO_PIN_3 | GPIO_PIN_7
4
    ,GPIO_PIN_SET
5
    );
so schwierig ist.

Man muss halt - wie immer - den Kopf anschalten, und eine grobe Ahnung 
davon haben, was man tun möchte. Den kurzen Blick in die Implementierung 
erspart auch kaum eine andere Lib.

von Stefan K. (stefan64)


Lesenswert?

Zum Bits setzen / löschen bietet sich bei der STM32-Familie das 
BSRR-Register an. Damit kann man atomar beliebig viele Pins eines Ports 
setzen UND/ODER löschen:

GPIOx_BSRR (x = A..I/J/K)

In den oberen 16 Bit des Registers werden alle Portpins markiert, die 
verändert werden sollen. In den unteren 16 Bits wird der gewünschte 
Pegel des Portpins eingetragen.

Es gibt eine HAL-Funktion, die dieses Register benutzt:
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, 
GPIO_PinState PinState)

Leider beschneidet diese Funktion völlig die Möglichkeiten, die das 
BSSR-Register bietet.

Mit dem BSSR-Register lassen sich übrigens auch hervorragend einzelne 
Pins oder Pingruppen per DMA modifizieren (set/reset). Zusammen mit 
einem Timer lassen sich so sehr komplexe Signalformen komplett ohne 
CPU-Intervention realisieren.

Gruß, Stefan

von Di P. (drpepper) Benutzerseite


Lesenswert?

Stefan K. schrieb:
> Leider beschneidet diese Funktion völlig die Möglichkeiten, die das
> BSSR-Register bietet.

Nur dass du nicht gleichzeitig Pins setzen und löschen kannst. Wer das 
Vorhat kann ja das BSRR einfach benutzen. Es mag Fälle geben, in denen 
das nötig ist, aber ein Großteil der Anwender wird auch mit zwei 
HAL-Aufrufen gut bedient sein. Wer eine DDS aufbauen möchte, wird das 
wohl kaum mit HAL-Funktionen machen.

von Stefan K. (stefan64)


Lesenswert?

Di P. schrieb:
> Nur dass du nicht gleichzeitig Pins setzen und löschen kannst.

Das ist noch gar nicht einmal das, was mich am meisten stört.

Erstens suggeriert die HAL-Beschreibung, dass mit dieser Funktion nur 
ein Pin modifiziert werdn kann, und dass die Pin-Nummer und nicht die 
Pin-Maske übergeben werden muss.

Zweitens wird in der Funktion eine if-else-Konstruktion verwendet, die 
bei einer geschickteren Definition einfach überflüssig gewesen wäre:

Auszug aus der HAL-Library:
1
/**
2
  * @brief  Sets or clears the selected data port bit.
3
  *
4
  * @note   This function uses GPIOx_BSRR register to allow atomic read/modify
5
  *         accesses. In this way, there is no risk of an IRQ occurring between
6
  *         the read and the modify access.
7
  *
8
  * @param  GPIOx: where x can be (A..K) to select the GPIO peripheral for STM32F429X device or
9
  *                      x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices.
10
  * @param  GPIO_Pin: specifies the port bit to be written.
11
  *          This parameter can be one of GPIO_PIN_x where x can be (0..15).
12
  * @param  PinState: specifies the value to be written to the selected bit.
13
  *          This parameter can be one of the GPIO_PinState enum values:
14
  *            @arg GPIO_PIN_RESET: to clear the port pin
15
  *            @arg GPIO_PIN_SET: to set the port pin
16
  * @retval None
17
  */
18
19
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
20
{
21
  /* Check the parameters */
22
  assert_param(IS_GPIO_PIN(GPIO_Pin));
23
  assert_param(IS_GPIO_PIN_ACTION(PinState));
24
25
  if(PinState != GPIO_PIN_RESET)
26
  {
27
    GPIOx->BSRR = GPIO_Pin;
28
  }
29
  else
30
  {
31
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U;
32
  }
33
}

Aber Du hast schon Recht: für den letzten Performance-Kick ist die HAL 
nicht konzipiert. Und der größte Vorteil des BSRR, der atomare Zugriff 
auf einzelne Portpins, wird damit auch erreicht.

Gruß, Stefan

von Di P. (drpepper) Benutzerseite


Lesenswert?

Ich glaube, darauf können wir uns einigen ;).

von Nico W. (nico_w)


Lesenswert?

Stefan K. schrieb:
> In den oberen 16 Bit des Registers werden alle Portpins markiert, die
> verändert werden sollen. In den unteren 16 Bits wird der gewünschte
> Pegel des Portpins eingetragen.

Hö?
Also vielleicht mache ich das ja verkehrt, aber ich setzte die Bits in 
den ersten 16bit und lösche in den letzten 16bit.
Aber vielleicht ist mein STM32F411 ja anders...

: Bearbeitet durch User
von Stefan K. (stefan64)


Lesenswert?

Nico W. schrieb:
> Also vielleicht mache ich das ja verkehrt, aber ich setzte die Bits in
> den ersten 16bit und lösche in den letzten 16bit.

Stimmt, sorry für die falsche Beschreibung.

Gruß, Stefan

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Thomas T. schrieb:
> zumindest bei der STM32L4-Serie gibt es keine Alternative...
> Entweder mit CubeMx oder "from the scratch".
> CubeMx hat auch noch einen Low-Level-Treiber (LL)
> aber da heißt es erst Mal: reinlesen...

An der Stelle war ich die Tage auch gestanden:
Ich hatte eine Firmware fertig auf F407 laufen und wollte zur 
Kostenoptimierung mal kurz auf L476 umsteigen.

Da die F4-Anwendung auf vor-HAL-Bibliotheken basierte, habe ich mich 
beim L476 erstmal wahnsinnig gefreut.
Aber tatsächlich kann man vorhandene Firmware relativ einfach auf LL 
übertragen. "relativ einfach" heißt in diesem Fall, dass praktisch JEDES 
Register, JEDE Funktion und JEDES Makro umbenannt wurde. Mit so 
Highlights wie "DAC_SetChannel2Data" -> 
"LL_DAC_ConvertData12RightAligned".

Ende von Lustig war dann die PLL-Programmierung. Dafür habe ich keine 
kompakte Funktion gefunden. Da ist mir dann die Geduld ausgegangen und 
ich habe das PLLCFG-Register in einer Zeile direkt mit der Info aus dem 
Datenblatt programmiert, statt hunderte von Codezeilen aus der HAL zu 
übernehmen.

Mein Fazit:

- Ein bestehenden Projekt auf HAL umzurüsten dauert länger als neu
schreiben.

- Ein bestehendes F4-Projekt auf den L4 zu portieren geht mittels LL und 
ein paar selbstgeschriebenen #defines in endlicher Zeit.

- beim Projektstart muss man sich entscheiden, was man vom STM32 will:
 - einen high-Performance Hack -> LL
 - eine Applikationsentwicklung, an die fremde Middle-Ware / Treiber
   angeschraubt werden sollen -> HAL


Ich finde grade die Quelle nicht, aber in einer Präsentation bezeichnet 
STM die Portierung von F4-alt nach L4-HAL als "hard".
Worst understatement ever...

von Thomas T. (runout)


Lesenswert?

Hallo Marcus,

danke für die Info.
Es gibt die STM AN4616 "Migrating from STM32F401/411 lines to STM32L4 
Series
microcontrollers".
Wenn alles schon mal HAL-basiert ist ginge angeblich der Umzug F4->L4
rucki-zucki...
Aber wer braucht das schon jeden Tag.
In deinem (typischen) Fall ist Neu-Aufsetzen angesagt.

Grüße Runout

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Hi Thomas,
danke für den Link. Das war nicht das Dokument, das ich meinte, aber das 
sollte man gesehen haben, bevor man die Umstellung angeht.

Für die Umstellung F4-alt nach L4-HAL habe ich ca. einen guten Manntag 
gebraucht, allerdings war das natürlich nur eine Untermenge der Treiber 
und die meiste Zeit war Lesen und Verstehen, was STM uns da serviert 
hat.
Langjährige Erfahrung mit der STM32-Hardware war dafür nicht schädlich.

Ich habe das Zählen aufgegeben, aber seit 2009 hatten wir mehrere 
Umbrüche im Firmware-Framework. Und jedesmal wird meine Liebe zu dieser 
wirklich tollen MCU-Familie auf eine harte Probe gestellt.

Zur Wartung von verschiedenen langlebigen Produkten bleibt einem nichts 
anderes übrig, als mehrere Codestämme mit ähnlicher Funktion parallel zu 
pflegen. seufz

Grüße,
 marcus

von Fabian B. (Firma: Blacbird Technologies) (fbodensteiner)


Lesenswert?

Hallo zusammen,

wir steigen zurzeit von der Std-Periph.-Library auf die HAL mit CubeMX 
um und versuchen so weit wie möglich Tutorials zu schreiben..

- SPI: http://blacbird.de/tutorial-stm32-cubemx-spi
- SDIO + FATFS: http://blacbird.de/tutorial-stm32-cubemx-sdio

Im Grunde hat sich die Qualität der Bibliothek (und vor allem CubeMX) im 
Vergleich zum Anfang sehr stark verbessert und für Standard-Funktionen 
kann man es mittlerweile tatsächlich verwenden.

Vielleicht können unsere Beiträge dem einen oder anderem bei seiner 
Entscheidung helfen, wir sind aber derzeit doch ziemlich zufrieden.

PS: Wir haben mit diesen Artikeln erst angefangen und werden diese auch 
noch ergänzen, deswegen sind Verbesserungsvorschläge immer willkommen!

Viele Grüße,
Fabian

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Hi Fabian,

Fabian B. schrieb:
> wir steigen zurzeit von der Std-Periph.-Library auf die HAL mit CubeMX
> um und versuchen so weit wie möglich Tutorials zu schreiben..

was ich mich bei so etwas immer frage, ist: bin ich der einzige der mit 
anderen Kollegen zusammen an Projekten arbeite und 
Quellcode-Verwaltungen verwende?

Was passiert, wenn ein Kollege einen Pull-Up Widerstand falsch 
konfiguriert und das eincheckt. Kann man das am Commit erkennen oder 
erscheint das nur als eine kaum erkennbare Änderung an einer kryptischen 
XML-Datei?

mfg Torsten

von Fabian B. (Firma: Blacbird Technologies) (fbodensteiner)


Lesenswert?

Hallo Torsten,

nehmen wir mal genau deinen Fall an (siehe Beispiel). Es ändert sich 
natürlich das "kryptische" cubeMX-File, aber auch der generierte 
Source-Code, und der ist eigentlich gut verständlich (bei default 
Einstellungen in der main.c zu finden):

Konfigurierter Pulldown (siehe Kommentar):
1
//main.c
2
//...
3
static void MX_GPIO_Init(void)
4
{
5
  /*Configure GPIO pin : NRG_IRQ_Pin */
6
  GPIO_InitStruct.Pin = NRG_IRQ_Pin;
7
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
8
  GPIO_InitStruct.Pull = GPIO_PULLDOWN; // <--- Pulldown konfiguriert
9
  HAL_GPIO_Init(NRG_IRQ_GPIO_Port, &GPIO_InitStruct);
10
}
11
//...

Konfigurierter Pullup (siehe Kommentar):
1
//main.c
2
//...
3
static void MX_GPIO_Init(void)
4
{
5
  /*Configure GPIO pin : NRG_IRQ_Pin */
6
  GPIO_InitStruct.Pin = NRG_IRQ_Pin;
7
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
8
  GPIO_InitStruct.Pull = GPIO_PULLUP; // <--- Pullup konfiguriert
9
  HAL_GPIO_Init(NRG_IRQ_GPIO_Port, &GPIO_InitStruct);
10
}
11
//...

Wir verwenden SVN und solche Fehler sind durch einen Vergleich mit alten 
Version schnell gefunden. Wichtig ist aber, dass das CubeMX-File und der 
generierte Code in der Versionsverwaltung zusammenpassen!

Viele Grüße,
Fabian

von Axel S. (a-za-z0-9)


Lesenswert?

Fabian B. schrieb:
> Wir verwenden SVN und solche Fehler sind durch einen Vergleich mit alten
> Version schnell gefunden. Wichtig ist aber, dass das CubeMX-File und der
> generierte Code in der Versionsverwaltung zusammenpassen!

Normalerweise checkt man generierte Files nicht in das VCS ein. Genau 
deswegen, weil man dann die Konsistenz separat prüfen muß. Prinzipiell 
kann man solche Checks zwar über die entsprechenden Hooks nachrüsten [1] 
aber es ist halt extra Arbeit für kaum einen Gegenwert.

[1] 
http://svnbook.red-bean.com/en/1.7/svn.ref.reposhooks.pre-commit.html
wir haben damit bei einem früheren AG mal eine statische Syntaxprüfung 
gemacht, weil es immer wieder Deppen gab, die Code einchecken wollten 
der es nicht mal durch den Compiler schaffte.

von Fabian B. (Firma: Blacbird Technologies) (fbodensteiner)


Lesenswert?

Axel S. schrieb:
> Normalerweise checkt man generierte Files nicht in das VCS ein. Genau
> deswegen, weil man dann die Konsistenz separat prüfen muß. Prinzipiell
> kann man solche Checks zwar über die entsprechenden Hooks nachrüsten [1]
> aber es ist halt extra Arbeit für kaum einen Gegenwert.

Und wie macht ihr dass dann, wenn sich jemand das aktuelle Projekt 
herunterladen möchte (neuer Entwickler z.B.), mit der Code-Generierung 
aber nichts zu tun hat (wir nutzen wirklich nur die Grundfunktionen von 
SVN, sry falls ich da ein offensichtliches Feature übersehe)?

Meiner Meinung bietet CubeMX den Vorteil, dass sich auch Leute, die 
nichts mit den unteren Schichten zu tun haben, über die GUI einen 
Überblick über die verschiedenen Funktionen (oder Taktraten von 
Peripherien) verschaffen können (spricht meiner Meinung nach dafür das 
CubeMX-File mit hochzuladen).

Die Grundkonfiguration des Chips zum Projekt wird bei uns meist von 
einer Person betreut und durchgeführt (der Großteil der Arbeit steckt ja 
dann doch in der Applikation), weswegen die Konsistenz dann zwangsläufig 
gegeben ist (ist bei großen Unternehmen sicher ein relevanteres 
Problem).

Viele Grüße,
Fabian

von ac1 (Gast)


Lesenswert?

Fabian B. schrieb:
> Vielleicht können unsere Beiträge dem einen oder anderem bei seiner
> Entscheidung helfen, wir sind aber derzeit doch ziemlich zufrieden.

Wir nutzen die neue HAL in verschiedenen Produkten.

Unser Fazit: Die Qualität ist eine reine Katastrophe. Sobald du von den 
einfachen Standard-Funktionen abweichst, findest du schnell üble Bugs.

USB ist nahezu nicht verwendbar, da werden teilweise kritische Flags 
nicht gesetzt/zurückgesetzt.

Stellenweise sind wir dazu übergegangen, uns eine eigene HAL zu 
implementieren. Die Zeit, die hierfür drauf geht, sparen wir uns später 
bei der Bug-Suche doppelt und dreifach.

Examples kompilieren teilweise nicht und sind stellenweise einfach 
fehlerhaft.

Davon kann ich noch duzende mehr aufzählen.

Also im Hinterkopf behalten: Wenn's nicht läuft, liegts mit oher 
Warscheinlichkeit nicht an euch :-)

von ac1 (Gast)


Lesenswert?

ac1 schrieb:
> Davon kann ich noch duzende mehr aufzählen.

Zusatz:
Es empfiehlt sich, die offiziellen STM32-Foren zu lesen (alle Beiträge 
der letzten 6 Monate) um ein Überblick über die kritischsten Bugs zu 
bekommen.

https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/AllItems.aspx

Irgendwo gibt es auch noch eine gigantische Liste an Fehlern in der 
STM32 Chip Dokumentation. Den hab ich gerade leider nicht griffbereit.

von Axel S. (a-za-z0-9)


Lesenswert?

Fabian B. schrieb:
> Axel S. schrieb:
>> Normalerweise checkt man generierte Files nicht in das VCS ein. Genau
>> deswegen, weil man dann die Konsistenz separat prüfen muß. Prinzipiell
>> kann man solche Checks zwar über die entsprechenden Hooks nachrüsten [1]
>> aber es ist halt extra Arbeit für kaum einen Gegenwert.
>
> Und wie macht ihr dass dann, wenn sich jemand das aktuelle Projekt
> herunterladen möchte (neuer Entwickler z.B.), mit der Code-Generierung
> aber nichts zu tun hat

Gar nicht. Wer unfähig oder unwillig ist, den Codegenerator 
anzuschubsen, der kann dann halt nicht aus dem Repo bauen, sondern muß 
ein Release oder Nightly verwenden.

Wobei ich persönlich ja einen eher weiten Bogen um alles mache, was nur 
aus der GUI geht. Der komplette Buildvorgang muß von der Kommandozeile 
funktionieren. Dann kann man den auch in ein Makefile oder Build-Skript 
verpacken, was dann wieder die Hemmschwelle für Dritte senkt.

Keine Ahnung wie es in diesem Punkt bei CubeMX aussieht.

von Dennis X. (Gast)


Lesenswert?

Fabian B. schrieb:
> Hallo zusammen,
> wir steigen zurzeit von der Std-Periph.-Library auf die HAL mit CubeMX
> um und versuchen so weit wie möglich Tutorials zu schreiben..
>
> - SPI: http://blacbird.de/tutorial-stm32-cubemx-spi
> - SDIO + FATFS: http://blacbird.de/tutorial-stm32-cubemx-sdio

Hammer! Danke man! Gerade SDIO finde ich interessant. Werde mir das bei 
Zeit mal durchlesen.

von Fabian B. (Firma: Blacbird Technologies) (fbodensteiner)


Lesenswert?

Dennis X. schrieb:
> Hammer! Danke man! Gerade SDIO finde ich interessant. Werde mir das bei
> Zeit mal durchlesen.

Vielen Dank, wobei der Artikel zeitnah noch ergänzt wird, da noch zu 
oberflächlich (vor allem im Bezug auf die Einstellmöglichkeiten der 
FATFS).

von Nop (Gast)


Lesenswert?

Marcus H. schrieb:
> - beim Projektstart muss man sich entscheiden, was man vom STM32 will:
>  - einen high-Performance Hack -> LL

"high performance hack" - der Ausdruck gefällt mir. :-)

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Hi Fabian,

Fabian B. schrieb:
> Und wie macht ihr dass dann, wenn sich jemand das aktuelle Projekt
> herunterladen möchte (neuer Entwickler z.B.), mit der Code-Generierung
> aber nichts zu tun hat (wir nutzen wirklich nur die Grundfunktionen von
> SVN, sry falls ich da ein offensichtliches Feature übersehe)?

Das man generierte Binaries / Artefakte irgendwo ablegt, damit andere, 
die nicht so tief in der SW-Entwicklung stecken, diese nutzen können, 
ist hilfreich. Aber:

Wenn jetzt jemand im Team meint, er möchte nur die Hälfte generieren, 
die andere Hälfte möchte er sich aus irgend einem Repository ziehen (die 
Quellcodeverwaltung ist dafür ungeeignet) finde ich "ungewöhnlich". Es 
kommt doch auch keiner auf die Idee und installiert nur den Linker und 
erwartet, dass die passenden Object-Files mit im Repo abgelegt sind.

> Meiner Meinung bietet CubeMX den Vorteil, dass sich auch Leute, die
> nichts mit den unteren Schichten zu tun haben, über die GUI einen
> Überblick über die verschiedenen Funktionen (oder Taktraten von
> Peripherien) verschaffen können (spricht meiner Meinung nach dafür das
> CubeMX-File mit hochzuladen).

Den Vorteil würde ich Dir auch nicht absprechen. Ich würde Ihn mir aber 
nicht gegen den Nachteil, dass ich Änderungen nicht mehr an einem Diff 
erkennen kann und meinen build wahrscheinlich(?) nicht mehr 
automatisieren kann, erkaufen. Build-Artefakte im SCV abzulegen, könnte 
ich mir nur vorstellen, wenn die automatisch mit irgend einem 
commit-hook aktualisiert werden (das bedingt aber, dass man die 
überhaupt automatisiert bauen kann).

Selbst die kleineren Projekte an denen ich so beteiligt war, hatten 
meist mehr als ein build target. (Die Firmware für den einen Controller 
vom Hersteller A, die Firmware auf dem anderen Controller von Hersteller 
B. Das Test-Tool auf dem PC. Die Unit-Tests auf dem PC usw.) Wenn man da 
für jedes Artefakt eine GUI braucht, bekommt man automatisierte builds 
nur sehr schwer hin.

mfg Torsten

von Steffen R. (steffen_rose)


Lesenswert?

Da Cube Code generiert, welcher durch den Anwender gepflegt werden soll, 
erübrigt sich fast die Frage, ob dieser Code einzuchecken ist.

/* USER CODE BEGIN Includes */
/* USER CODE END Includes */

Oft genug wird auch in Fehlern im HAL Code berichtet, der ggf. 
korrigiert wird.

Wir nutzen Cube nur zur initialen Erstellung des Codes, welcher dann 
durch uns weiterbearbeitet wird.

Das sind die Gründe, warum wir den von Cube erstellten 
(Hardwareanpassung) bzw. umkopierten (HAL, USB) Code einchecken. 
Ansonsten gehe ich auch in den meisten Fällen so vor, dass generierter 
Code nicht extra eingecheckt wird.

von Juppeck (Gast)


Lesenswert?

Ich finde diese Debatte schon Grenzwertig. Wenn gleich sie nicht neu 
ist, wie hier unschwer zu erkennen ist, ist sie noch immer aktuell.

Was man bei all dieser Argumente pro und kontra zu HAL/STDLIBS noch 
ergänzen muss ist, dass die STDLIBS nur bis F4 verfügbar sind - sie sind 
obsolete. Es gibt eben nur die Wahl zwischen HAL_LL und HAL. Das CMSIS 
mit oder ohne OS hat mit dem HAL erstmal nichts zutun.
Was der CUBEMX da raushaut ist bestenfalls als Tutorial geeignet.
Die zusammengehauene Baustelle aus Eclipse, CubeMX und Compiler 
toolchain names CubeIDE 1.01 ist grauenhaft. Atollics Umgebung war nie 
mein Liebling, jedoch dass, was ST da nun aus dem TrueStudio und CubeMX 
zusammengebacken hat, will man nicht haben. Erst recht nicht dass, was 
das Zeug produziert.
Mir gefällt derzeit nur WinIDEA-OPEN und Segger Embedded-Studio (Rowley 
Crossworks). Die Segger-Variante hat schon ihren Scharm.

Code generieren sie nicht, schaffen aber ein Framework aus den genannten 
Komponenten und bauen ein Projekt daraus.

von Au Weia (Gast)


Lesenswert?

Juppeck schrieb:
> Ich finde diese Debatte schon Grenzwertig.

Ich finde deinen Beitrag schon grenzwertig.

Da er erst nach drei Jahren auf das Thema eingeht.

von Dennis (Gast)


Lesenswert?

Ich persönlich finde Leute grenzwertig, die nicht mal lesen können aber 
schon maulen.

:-)

Juppeck schrieb:
> Ich finde diese Debatte schon Grenzwertig. Wenn gleich sie nicht neu
> ist, wie hier unschwer zu erkennen ist, ist sie noch immer aktuell.

Au Weia schrieb:
> Ich finde deinen Beitrag schon grenzwertig.
>
> Da er erst nach drei Jahren auf das Thema eingeht.

Wie dem auch sei. Wir haben in der Firma vor etwa 10 Jahren auf Cortex-M 
umgestellt und alle Bibliotheken komplett selbst geschrieben.

Wir haben es nicht bereut...

von Stefan F. (Gast)


Lesenswert?

Dennis schrieb:
> Wie dem auch sei. Wir haben in der Firma vor etwa 10 Jahren auf Cortex-M
> umgestellt und alle Bibliotheken komplett selbst geschrieben.

Dann hat eure Bibliothek sicher schon länger bestand, als die drei von 
ST.

von Dennis (Gast)


Lesenswert?

Stefanus F. schrieb:
> Dann hat eure Bibliothek sicher schon länger bestand, als die drei von
> ST.

Das hat es...

Ist halt der Vorteil, wenn man eine Bib nicht nur zu Marketingszwecken 
von ein paar Studenten erstellen lässt (und dann vom Erfolg überrascht 
wird) sondern gleich von Anfang an drei Profis ransetzt. Unser Chef 
damals war auch einer, der mit dem 8048 angefangen und mit dem 8051 groß 
geworden ist und wusste worauf es ankommt. Genug Budget, 4 Monate Zeit 
und keine anderen Projekte: fertig war die Laube. Seitdem erfolgt nur 
noch behutsames Feintuning.

von Das dass das das !!! (Gast)


Lesenswert?

Stefanus F. schrieb:
> die drei von ST.

Das erinnert mich an den hier: https://xkcd.com/927/

Dennis schrieb:
> 4 Monate Zeit und keine anderen Projekte: fertig war die Laube. Seitdem
> erfolgt nur noch behutsames Feintuning.

Schon Mal überlegt, diese lib zu mit pro-Projekt-Lizenz, NDA und 
Endprodukt-stückzahlabhängigen Schmalz-Faktor zu verkaufen?

Sozusagen...
Marcus H. schrieb:
> einen high-Performance Hack
...ohne alles selber stricken zu müssen?

von Nico W. (nico_w)


Lesenswert?

Guck dir die HAL von ChibiOS an. Läuft unter Apache 2.0.

von Dennis (Gast)


Lesenswert?

Das dass das das !!! schrieb:
> Schon Mal überlegt, diese lib zu mit pro-Projekt-Lizenz, NDA und
> Endprodukt-stückzahlabhängigen Schmalz-Faktor zu verkaufen?
>
> Sozusagen...
> Marcus H. schrieb:
>> einen high-Performance Hack
> ...ohne alles selber stricken zu müssen?

Denke nicht dass es Pläne in diese Richtung gibt. Wir verdienen unser 
Geld mit klassischer Hardwareentwicklung und hardwarenaher 
Programmierung, die Bibliotheken sind quasi Firmenkapital. Da muss schon 
einer der Großen die ganze Firma kaufen um an die ranzukommen :-)

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Fabian B. schrieb:
> wir steigen zurzeit von der Std-Periph.-Library auf die HAL mit CubeMX
> um und versuchen so weit wie möglich Tutorials zu schreiben..
>
> - SPI: http://blacbird.de/tutorial-stm32-cubemx-spi
> - SDIO + FATFS: http://blacbird.de/tutorial-stm32-cubemx-sdio

Grauer Text auf weißem Hintergrund?
Wer hat das den verbrochen? Das lässt sich echt schlecht lesen.
Stellt das doch bitte mal auf schwarzen Text um!

Fabian B. schrieb:
> wobei der Artikel zeitnah noch ergänzt wird, da noch zu
> oberflächlich (vor allem im Bezug auf die Einstellmöglichkeiten der
> FATFS).

Es empfielt sich das originale elmchan fatfs ins Projekt zu ziehen.
Alleine für spätere Updates, denn ST hat ganz schön an dem fatfs 
rumgepfuscht (nicht zum guten).

ac1 schrieb:
> Unser Fazit: Die Qualität ist eine reine Katastrophe. Sobald du von den
> einfachen Standard-Funktionen abweichst, findest du schnell üble Bugs.
>
> USB ist nahezu nicht verwendbar, da werden teilweise kritische Flags
> nicht gesetzt/zurückgesetzt.
>
> Stellenweise sind wir dazu übergegangen, uns eine eigene HAL zu
> implementieren. Die Zeit, die hierfür drauf geht, sparen wir uns später
> bei der Bug-Suche doppelt und dreifach.

Diese ST HAL ist vor allem garkein HAL, sondern eher eine 
Registerabstraktion.
Beim DMA zB muss man immernoch DMA 1/2 und Channel selber raussuchen 
anstatt zu sagen "Machmal DMA mit dem UART1 RX"
(Mein Eigenbau HAL kann das)

Habt ihr USB Host oder Device genutzt?
Der USB OTG Host in Verbindung mit einem OS ist richtig übel vergeigt.
Der Knaller: Wenn man sich OTG mit automatischer Umschaltung klicken 
will, dann sagt CubeMX, dass man das selber proggen soll.
GANZ GROSSES KINO!

Dennis schrieb:
> Wie dem auch sei. Wir haben in der Firma vor etwa 10 Jahren auf Cortex-M
> umgestellt und alle Bibliotheken komplett selbst geschrieben.

Zwar nicht vor 10 Jahren, aber willkommen im Club.

von 900ss (900ss)


Lesenswert?

Dennis schrieb:
> Genug Budget, 4 Monate Zeit
> und keine anderen Projekte: fertig war die Laube.

Klingt traumhaft. Welche Fa? Braucht ihr Leute? :)

von Stefan F. (Gast)


Lesenswert?

Mw E. schrieb:
> Grauer Text auf weißem Hintergrund? Das lässt sich echt schlecht lesen.

Sehe ich auch so.

Das gleiche Thema hatte ich mal bei der ARD bemängelt, nachdem die fett 
darauf hinwiesen, ihre Seite jetzt barrierefrei gemacht zu haben. Die 
Antwort war geil: Das sei alles umfangreich mit gesunden und 
benachteiligten Personen getestet. Es habe sich herausgestellt, dass der 
reduzierte Kontrast den Text besser lesbar mache. WTF?

von A. F. (artur-f) Benutzerseite


Lesenswert?

Karl schrieb:
> Nun zur eigentlichen Frage: Verwendet jemand im professionellen Umfeld
> den STM HAL (oder die alte Peripherielib) und kann kurz die Erfahrungen
> schildern? Oder auch: Warum wird es nicht verwendet?

Ich verwende die LL API im professionellen Umfeld, den LL Api Code kann 
man übrigens auch mit dem CubeMX generieren. HAL war mir zu abstrakt und 
zu "CallBack" lastig, was ich in einer gewöhnlichen hardwarenahen 
Programmierung nicht gerne habe. Ich bin froh, dass ST auch die LL Api 
anbietet. So einen Controller mag man nicht zufuß, über die 
Registerzugriffe programmieren...

von Stefan F. (Gast)


Lesenswert?

A. F. schrieb:
> So einen Controller mag man nicht zu fuß, über die
> Registerzugriffe programmieren...

Ich betrachte das als sportliche Herausforderung. Ist spannender als 
jedes Adventure Game. Die Zeit dazu habe ich, da es nur ein Hobby ist.

Ich hatte innerhalb von zwei Jahren drei mal versucht, mit der HAL zu 
starten und jedes mal waren die nicht lauffähig, weil die HAL Bugs 
hatte. Hier im Forum wurde mir dabei geholfen, die Bugs zu finden und zu 
korrigieren.

Mein Vertrauen in die HAL ist damit im Keller.

Außerdem erfüllt die HAL nicht meine Erwartung, von der Hardware 
unabhängig zu werden. Schon ein µC Wechsel innerhalb der gleichen Serie 
klappt nicht, ohne Quelltext anzupassen. Und ein Wechsel von F1 nach F3 
(welcher von STM als "pin-kompatibler" Nachfolger angepriesen wird) 
erfordert ein Redesign sämtlicher HAL Aufrufe.

von A. F. (artur-f) Benutzerseite


Lesenswert?

Stefanus F. schrieb:
> Außerdem erfüllt die HAL nicht meine Erwartung, von der Hardware
> unabhängig zu werden. Schon ein µC Wechsel innerhalb der gleichen Serie
> klappt nicht, ohne Quelltext anzupassen.

Mit der Verwendung von LL API hat der Wechsel innerhalb der ST Reihe 
problemlos. Was die Bugs angeht, habe ich bis jetzt in der LL API nur 
einen gefunden. Der I2C Slave hat beim Initialisieren die SCK Leitung 
kurz auf Low gezogen. Habe das ST berichtet inklusive Workaround. Die 
von ST nehmen solche Hinweise gerne an und haben minten darauf, dass der 
Bug in der neueren Version beseitigt wird.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

A. F. schrieb:
> Ich bin froh, dass ST auch die LL Api
> anbietet. So einen Controller mag man nicht zufuß, über die
> Registerzugriffe programmieren...

Dann guck dir mal die LL API als Source an.
Das ist meist nur ein Funktionsname um den Registerzugriff gestrickt ;)
Daher kommen da auch nicht allzuviele Bugs bei rum.

von Ödipussi (Gast)


Lesenswert?

A. F. schrieb:
> So einen Controller mag man nicht zufuß, über die
> Registerzugriffe programmieren...

Warum nicht? Ich investiere 2,3 Stunden und schreibe von der Peripherie 
die ich benötige kurz meine eigene HAL und habe später keinen Stress. 
Die meisten Peripheriebausteine beim STM32 haben doch nur wenige 
Register. USB oder Ethernet ist gewiss ein anderes Kaliber, aber NVIC, 
GPIOS, Timer, ADC, DAC, DMA,... das lässt sich alles wirklich super 
leicht per Register konfigurieren. Und ich auch übersichtlicher, denn 
das sind max 100 Zeilen und alles ist initialisiert.

von Markus M. (adrock)


Lesenswert?

Der Thread ist zwar schon alt, aber eigentlich ist das Thema immer noch 
aktuell.

Wollte letztlich mal den neuen STM32G031 (im kleinen 8-Pin Gehäuse fast 
ein ATtiny-Killer :-) ausprobieren.

Die includes (HW-Definitionen) sind gut im CubeMX Pack versteckt, auch 
die Taktconfiguration geht halbwegs komfortabel nur noch über CubeMX. 
Also ließ ich mich verleiten doch mal wieder die HAL auszuprobieren.

War wieder wirklich zum abgewöhnen. Es ist eben einfach KEIN HAL. Eher 
ein Hardware Obfuscation Layer. Die HAL-Funktionen tun (noch dazu 
relativ ineffizient) Sachen, die auf den ersten Blick nicht ersichtlich 
sind. Andere Sachen (Control-Flags) werden teilweise 1:1 an die 
HW-Register durchgereicht, aber dann eben doch wieder mit zusätzlichen 
Abfragen in der HAL. Am Ende guckt man sich dann doch den Source-Code 
der HAL-Funktion an um zu verstehen, was sie eigentlich wie macht. 
Ineffizienter (von der Entwicklung her) geht es kaum noch.

Ich wollte z.B. für eine WS2812-Ansteuerung nur den SPI-Datenausgang 
verwenden. Dieser Fall ist aber in CubeMX garnicht vorgesehen, man muss 
auch noch zwangsweise einen Pin für SPI Clock definieren.

von 900ss (900ss)


Lesenswert?

Markus M. schrieb:
> Hardware Obfuscation Layer

Ha ha, sehr schön gesagt :)

Und was nimmst du jetzt anstatt HAL?

von Klaus (Gast)


Lesenswert?

Karl schrieb:
> Jetzt muss ich sagen, dass der neue HAL seit CubeMX nicht voll
> überzeugen kann.

Dann hast du noch nicht richtig damit gearbeitet.

Markus M. schrieb:
> Dieser Fall ist aber in CubeMX garnicht vorgesehen, man muss
> auch noch zwangsweise einen Pin für SPI Clock definieren.

Logisch. SPI ist nunmal ein Zweidrahtsystem. Das du es entgegen des 
eigentlichen Verwendungszweckes benutzen willst kann man den Entwicklern 
bei ST kaum vorwerfen.

von pegel (Gast)


Lesenswert?

Klaus schrieb:
> SPI ist nunmal ein Zweidrahtsystem.

Du kannst trotz HAL auch zwischendurch ein paar Register setzen.
Die frage ist nur: funktioniert das überhaupt ohne CLK, oder landet man 
im Hardfault?

von Stefan F. (Gast)


Lesenswert?

Markus M. schrieb:
> War wieder wirklich zum abgewöhnen...

In deinen weiteren Ausführungen hast du genau meinen ersten Eindruck 
beschrieben, der mich davon abgehalten hat, die HAL ein zweites mal zu 
versuchen.

von Wühlhase (Gast)


Lesenswert?

Ich habe unlängst mal wieder etwas mit CubeMX gespielt, habe aber die 
Low-Level-Library verwendet.

Es gibt dafür (noch?) etwas wenige Beispiele, aber das läßt sich schon 
weitaus besser verwenden als die HAL. Finde ich jedenfalls.

von Ben S. (bensch123)


Lesenswert?

Ich boxe mich zu 99% auf Registerebene durch. Denn wozu soll ich bei 
SPI, USART, I²C, DMA etc. für normale Aufgaben mich darauf verlassen - 
komplex sind diese nicht wirklich?

Sofern ich Ethernet oder USB mache, greife ich durchaus auf HAL zurück - 
wobei ich auch hier der Meinung bin, dass man sich langfristig einlesen 
sollte, so dass man diese auch ohne HAL bewältigen könnte.

von Vincent H. (vinci)


Lesenswert?

Trotz aller Kritik bleibt die HAL eine Abstraktion. Die Abstraktion 
betrifft allerdings ausschließlich die Nutzung einer Peripherie und 
nicht, wie viele sich das wünschen, deren Initialisierung.

Hier etwa quer durch die Bank 3x "HAL_SPI_Transmit" von 3 vollkommen 
verschiedenen µC Familien. Soweit ich mich erinner hab ich grad H7, F4 
und F1 kopiert:
1
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

Wenn jemand von Abstraktion und im gleichen Atemzug von manuell Register 
setzen spricht, dann muss ich leider sagen, dass die ursprüngliche Idee 
noch nicht verstanden wurde. ST's Bibliothek tut (ohne Berücksichtigung 
etwaiger Bugs) genau das was sie tun soll. Sie abstrahiert die Nutzung 
einer Schnittstelle wie etwa in diesem Fall das Senden von Daten via SPI 
in einer Funktion.

Es wird davon ausgegangen dass der Nutzer für die Initialisierung CubeMX 
verwendet und für jede separate Hardware eigene Init-Funktionen 
erstellt. Die Kern-Applikation kann jedoch unverändert bleiben und wie 
in diesem Fall etwa die Funktion "HAL_SPI_Transmit" nutzen, unabhängig 
davon ob nun ein H7, F4 oder F1 zum Einsatz kommt. Welche der SPI 
Schnittstellen, welcher Interrupt, welcher DMA usw. wirklich zum Einsatz 
kommt muss dann halt via CubeMX zusammengeklickt werden.

Ist diese Lösung perfekt? Nein, sicherlich nicht. Meiner Meinung nach 
liese sich mit modernen Sprachfeatures von C++ oder Rust eine wesentlich 
bessere Abstraktionen bilden. So könnten etwa Interrupts und DMA-Kanäle 
in die Typen der Schnittstellen integriert werden. Folglich müsste man 
sich weder merken welcher Kanal wo zu geordnet ist, noch wäre man wie 
aktuell auf Code-Generation angewiesen.

Nachdem sich aber seit Erstellung dieses Threads 2014 absolut nichts auf 
diesem Gebiet getan hat seh ich eher schwarz dass so eine Bibliothek 
jemals das Licht der Welt erblickt...

von Johannes S. (Gast)


Lesenswert?

Mir ist selbst der HAL Level zu niedrig und zuviel Schreibarbeit. Kann 
hier jemand aus dem Kopf eine SPI Schnittstelle implementieren? Ich kann 
mir gerade noch sowas merken: 'SPI spi(SPI_MOSI, SPI_MISO, SPI_CLK, 
SPI_CS);'
Und ich möchte auch keine HAL die nur auf STM oder NXP oder Nordic 
funktioniert. Und schon garnicht meine restliche Lebenszeit damit 
verschwenden für jeden µC aufs Neue den Registerkram raussuchen um eine 
LED zum Blinken zu bekommen. Es gibt genug Arbeit aufbauend auf 
funktionierenden Schnittstellen Komponenten zu bauen wie 
Kommandointerpreter, HTTP Server, Sensor/Aktor Komponenten usw. Und das 
müssen als Baukasten einfach zusammenpassende Objekte sein. Soviel 
Komfort ist heute mit µC locker möglich, dank der hochoptimierten und 
optimierenden Compiler kostet das auch erstaunlich wenig Leistung.

von drm (Gast)


Lesenswert?

vielleicht ist der Anwendungsfall für HAL mit CubeMX nur etwas 
missverständlich von ST dargestellt.
Beides ist nicht für Einsteiger die noch nicht wissen wie ein uC 
funktioniert, sondern für Fortgeschrittene und Profis, die nicht jedes 
Mal stupide Routinearbeit wie Config von Uart, SPi usw. jedes Mal von 
Hand machen wollen sondern schnell zum Wesendlichen ihres Projekts 
kommen wollen.
Nicht jeder hat einen Azubi neben sich sitzen und kann Routinearbeit 
weggeben.
Natürlich schüttelt der Profi diese Settings mit links aus dem Ärmel und 
kennt sie ohne Blick ins Datenblatt auswendig, aber irgendwann muss man 
diese Routinearbeit abstreifen und automatisieren. ST hat vielleicht 
einen holprigen Start mit CubeMX und HAL gehabt, aber ich will nicht 
nachschauen müssen ob irgendwo vielleicht ein Bit falsch gesetzt ist. 
Allerdings war es auch einige Einarbeitungszeit, das Konzept von CubeMX 
und HAL zu verstehen. Nur danach konnte ich es effizient einsetzen. Ohne 
die Einarbeitungszeit kommt einem das System natürlich wie eine 
Fehlkonstruktion vor.

von Stefan F. (Gast)


Lesenswert?

Ich denke, dass man wenigstens einen STM32 mal ernsthaft auf 
Registerebene mit dem Reference Manual programmiert haben muss, um die 
HAL verstehen zu können.

von drm (Gast)


Lesenswert?

Mit dem 8085 und Assembler habe ich angefangen, war Pflicht in der 
Ausbildung. PIC16F887 und ATtiny/ATmega sind die letzten uC, die ich auf 
Registerebene und C verstehen wollte. Alle ARM Cortex sind zu komplex um 
das Rad noch mal neu erfinden zu wollen. Es hilft allerdings, die 
8-bitter programmiert zu haben um keinen Unfug auf Embedded Systemen zu 
machen.
Wenn Einsteiger gleich mit Cortex-M auf Registerebene einsteigen, dann 
müssen Sie entweder einen guten Tutor haben oder extrem frustresistent 
sein. Die alten Hasen vergessen oft wie sie selbst die ersten wackeligen 
Schritte gemacht haben, in der guten alten Zeit. In der Erinnerung war 
alles viel bunter ...

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.