Forum: Mikrocontroller und Digitale Elektronik Getting started with STM32F103


von alarmdin (Gast)


Lesenswert?

Hi,

ich habe mir jetzt einmal drei STM32F103C8T6 auf einem BluePill-Board 
bestellt.
Dazu hätte ich nun einmal ein paar Fragen:
1. Würdet ihr mir zum Programmieren eher zu einem (universeller 
einsetzbaren) USB-to-RS232-Adapter raten oder eher zu einem ST-Link V2? 
Und warum?
2. Ich komme von den AVRs, bei denen man ja immer die Register 
programmiert. Nun habe ich mich auch einmal schon ein wenig in die 
Register eingelesen (Ref. Man.) und glaube, dass ich so langsam auch 
durchblicke, was in etwa für was da ist. Allerdings lese ich jetzt fast 
immer nur von Leuten, die das CubeMX verwenden, sich da den Startup-Code 
zusammenklicken und diesen dann generieren. Daraus entsteht dann Code 
mit der HAL-Lib, sehe ich das richtig? Wieder andere benutzen dann 
wiederum structs wie GPIO_InitTypeDef und Funktionen wie SystemInit(). 
Diese sind dann allerdings kein HAL sondern die StdPeriphLib von ST, 
oder?
Nachdem ich mir jetzt das alles einmal angesehen habe, frage ich mich 
allerdings, wofür man diese ganzen Funktionen braucht. Letztendlich ist 
das doch nicht schneller, als wenn man im Datenblatt nachliest, wie die 
Register heißen und dann schnell die entsprechenden Bits setzt, oder 
nicht? Ich möchte eben auch eigentlich wissen, was ich da mache und 
nicht einfach nur irgendeine Funktion aufrufen, die hinter meinem Rücken 
alles mögliche macht.
Ist es also entsprechend möglich (und sinnvoll), auch einfach nur mit 
den Registern aus stm32f10x.h zu programmieren oder würdet ihr mir 
absolut davon abraten? Mir geht es eben vor allem auch um das 
Verständnis.
3. Was für ein Flashtool würdet ihr mir empfehlen? Für den St-Link lese 
ich eigentlich immer nur das Programm "stlink". Gibt es das auch 
GUI-less? Ich habe in den Arch-Repos nur eines mit GUI gefunden und 
ansonsten auch nichts. Ich würde das eben gerne einfach in ein 
flash-script einbauen.
4. Ich habe in dem CMSIS-Ordner von CubeMX startup-ASM-Code gefunden. 
Braucht man den? Wenn ich das richtig sehe, dann wird da eigentlich nur 
RCC initalisiert, was ja auch ansonsten mit ein paar Registern erledigt 
ist, sodass man nicht extra diese Datei braucht, oder?

Das war es, glaube ich, fürs Erste.
Vielen Dank schon einmal für alle Antworten!

von Stefan F. (Gast)


Lesenswert?

1.) Programme übertragen geht mit beiden gleich gut. Debuggen geht aber 
nur mit einem ST-Link.

2.) Sowohl die Cube HAL als auch die StdPeriphLib abstrahieren die 
Hardware ein bisschen und "sollen" die Programmierung vereinfachen. Ich 
komme jedoch mit direkten Registerzugriffen ebenso zurecht - außer was 
beim USB Port. Aber für den hat W.S. hier eine Library veröffentlicht, 
die keine der beiden Abstraktions-Libraries benötigt.

3.) An der Kommandozeile kann man openocd benutzen, um die Firmware zu 
flashen. Ich habe das allerdings noch nicht ausprobiert.Für den 
seriellen Port gibt es außerdem stm32flash, für den ST-Link gibt es das 
texane stlink Tool. Beide bei GitHub.

4.) Ja, den startup code braucht man. Vom AVR bist du gewohnt, dass der 
gcc diesen automatisch erzeugt und noch vor deine main() Funktion 
einfügt. Bei ARM hast du hier die Chance, den Code zu verändern. 
Außerdem kannst du hier die Interrupt-Vektoren selbst ausfüllen und 
Namen vergeben, während beim AVR die Namen der Interrupthandler hart 
vorgegeben sind. Der Startup Code hat die Aufgabe, alles so weit 
vorzubereiten, dass dein C Programm ausführbar ist. Also hauptsächlich 
die Initialisierung vom Heap, Stack und globale Variablen (kopieren aus 
dem Flash).

Schau Dir meine Notizen an: http://stefanfrings.de/stm32/index.html

von Schlaubischlumpf (Gast)


Lesenswert?

> frage ich mich
> allerdings, wofür man diese ganzen Funktionen braucht. Letztendlich ist
> das doch nicht schneller, als wenn man im Datenblatt nachliest, wie die
> Register heißen und dann schnell die entsprechenden Bits setzt

Brilliant beobachtet.

von W.S. (Gast)


Lesenswert?

alarmdin schrieb:
> 1. Würdet ihr mir zum Programmieren eher zu einem (universeller
> einsetzbaren) USB-to-RS232-Adapter raten oder eher zu einem ST-Link V2?
> Und warum?

Wenn du mehr debuggst als daß du programmierst, dann würde ich dir gar 
sehr zu einem JLink raten, ersatzesweise zu einem STLink, besser jedoch 
ein zum JLink umgeflashten STLink. Da gibt es ne Software von Segger, 
die das bei ausgewählten STLinks kann.

Wenn du jedoch einigermaßen gut bist beim Programmieren, so daß du nicht 
jeden Furz per Debugger überprüfen mußt, dann wäre eher der USB zu 
seriell Adapter und der eingebaute Bootlader angesagt. Ich hatte hier 
auch schon mal ein Brennprogramm 
(Beitrag "STM32Fxxx Bootlader Programmer STM32Prog") gepostet, mit dem man 
auch eine kleine Konsole per seriell haben kann, was die Kommunikation 
mit dem Chip erleichtert.


> 2. Ich komme von den AVRs, bei denen man ja immer die Register
> programmiert. Nun habe ich mich auch einmal schon ein wenig in die
> Register eingelesen (Ref. Man.) und glaube, dass ich so langsam auch
> durchblicke, was in etwa für was da ist. Allerdings lese ich jetzt fast
> immer nur von Leuten, die das CubeMX verwenden

Es hat ne Menge Leute gegeben, die die ST-Lib und später Cube ganz toll 
finden und strikt bevorzugen. Diese Leute machen hier und anderswo viel 
Traffic, eben weil sie den Blick in das Referenzmanual scheuen.

Ich selber halte davon nichts.

Stattdessen halte ich mehr davon, sich an das RefMan zu halten und bei 
den eigenen Kreationen ein striktes Regime der Trennung von Low-Level 
Treibern und höheren Programmschichten einzuhalten. Sowas schafft 
Klarheit und befördert die Portierbarkeit.

Bis man sich klar darüber ist, daß sowas seine Meriten hat, braucht es 
so seine Zeit. Ging mir nicht anders. Quellen, die ich vor 10 oder 20 
Jahren schrieb, würde ich heute SO niemals wieder schreiben.

W.S.

von Schlaubischlumpf (Gast)


Lesenswert?

Die neueren ST-Link sind eigentlich ganz annehmbar.
Die erste Generation war dagegen fürchterlich.

> jeden Furz per Debugger überprüfen mußt

Wenn einem im Referenzmanual etwas unklar ist, kann man die
entsprechenden IO-Register auch per Debugger "bespielen".
Programmieren muss man dazu nichts.

Einen USB-Seriell-Wandler sollte man nebenbei sowieso im Haus haben.

Ein passendes Nucleoboard kann als Referenz auch nicht schaden.
Das bringt auch gleich einen ST-Link mit USB-Seriell-Wandler mit.

Die Chinesen haben da merkwürdige Dinge auf ihren Bords.

von alarmdin (Gast)


Lesenswert?

Stefanus F. schrieb:
> 1.) Programme übertragen geht mit beiden gleich gut. Debuggen geht aber
> nur mit einem ST-Link.

Ich habe jetzt erst einmal einen FT232RL bestellt. Wobei die Dinger 
sowieso so billig sind, dass das keinen großen Unterschied macht. Sonst 
bestelle ich, sobald ich die Debug-Funktion brauche, einfach noch einen 
St-Link. Debugger sind zwar oftmals nett, aber man findet üblicherweise 
auch so den Fehler.

W.S. schrieb:
> ausgewählten STLinks

Woran erkenne ich denn die geeigneten STLinks? Sind das die Originale 
oder funktioniert das genauso bei den ganzen Kopien aus China?

Stefanus F. schrieb:
> 4.) Ja, den startup code braucht man. Beim AVR bist du gewohnt, dass der
> COmpiler diesen automatisch erzeugt und noch vor deine main() Funktion
> einfügt. Bei AVR hast du hier die Chance, den Code zu verändern.
> Außerdem kannst du hier die Interrupt-Vektoren selbst ausfüllen und
> Namen vergeben, während beim AVR die Namen der Interrupthandler hart
> vorgegeben sind. Der Startup Code hat die Aufgabe, alles so weit
> vorzubereiten, dass dein C Programm ausführbar ist. Also hauptsächlich
> die Initialisierung vom Heap, Stack und globale Variablen (kopieren aus
> dem Flash).

Okay, das ist tatsächlich gut zu wissen, danke.
Was ich allerdings noch nicht verstehe:
ich brauche ja stm32f10x.h für die ganzen Definitionen. Darin sind 
allerdings noch die Abhängigkeiten core_cm3.h und system_stm32f10x.h und 
die zugehörigen *.c-files enthalten. Was genau sind das denn für Header? 
Brauche ich die wirklich zwingend?

Stefanus F. schrieb:
> 3.) An der Kommandozeile kann man openocd benutzen, um die Firmware zu
> flashen. Ich habe das allerdings noch nicht ausprobiert.Für den
> seriellen Port gibt es außerdem stm32flash, für den ST-Link gibt es das
> texane stlink Tool. Beide bei GitHub.

Ich habe mir jetzt einmal noch openocd und stm32flash installiert und 
werde einfach einmal alles ausprobieren, sobald der entsprechende 
Adapter kommt.

W.S. schrieb:
> Ich hatte hier
> auch schon mal ein Brennprogramm
> (Beitrag "STM32Fxxx Bootlader Programmer STM32Prog") gepostet, mit dem
> man
> auch eine kleine Konsole per seriell haben kann, was die Kommunikation
> mit dem Chip erleichtert.

Wärst du bereit, den Source Code davon zu teilen, damit ich schauen 
kann, dass ich das für Linux portiere?
Aber ansonsten werde ich wohl einfach auf die oben genannten Programme 
zurückgreifen.

Schlaubischlumpf schrieb:
> Die neueren ST-Link sind eigentlich ganz annehmbar.
> Die erste Generation war dagegen fürchterlich.
>
>> jeden Furz per Debugger überprüfen mußt
>
> Wenn einem im Referenzmanual etwas unklar ist, kann man die
> entsprechenden IO-Register auch per Debugger "bespielen".
> Programmieren muss man dazu nichts.
>
> Einen USB-Seriell-Wandler sollte man nebenbei sowieso im Haus haben.
>
> Ein passendes Nucleoboard kann als Referenz auch nicht schaden.
> Das bringt auch gleich einen ST-Link mit USB-Seriell-Wandler mit.
>
> Die Chinesen haben da merkwürdige Dinge auf ihren Bords.

Der USB-Serial-Adapter ist bereits bestellt. Sonst bestelle ich mir halt 
noch einen StLink mit. Aber zumindest beim AVR brauchte ich bisher noch 
nie einen Debugger.
Beim Nucleo-Board weiß ich nicht, ob mir das wirklich etwas bringt. Da 
ist dann ja auch noch einmal ein anderer µC drauf, womit ich dann immer 
mit zwei Ref. Man.s herumhantieren müsste. Ich werde es jetzt erst 
einmal so probieren. Vllt. werde ich mir ein solches zulegen, sobald ich 
einige Erfahrungen mit ARMs sammeln konnte.

von Stefan F. (Gast)


Lesenswert?

Lies die infos auf meiner Homepage. Die Unterschiede zwischen dem 
ST-Link vom Nucleo Board und den billigen Clones aus China habe ich dort 
beschrieben. Die CMSIS ist umfangreich weil der STM32 viele Register 
hat. Du kannst aber Files weglassen, die für andere STM32 Modelle 
gelten. Aber das macht dein Programm nich schlanker. Also würde ich mir 
die Mühe sparen.
Der zweite Mikrocontroller auf dem Nucleo Biard ist der ST-Link. Den 
kannst du abtrennen und einzeln verwenden. Im Gegensatz zu den billigen 
China Clones enthält er zugleich einen USB-Uart Adapter. Kann ich nur 
empfehlen. Selbst wenn du den Haupt-Teil des Nucleo boarded weg wirfst, 
ist das immer noch eine sehr preisgünstige Sache. Und es wird schnell 
geliefert. Die Firma ST hat dazu einen Anazon Account.

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


Lesenswert?

alarmdin schrieb:
> Der USB-Serial-Adapter ist bereits bestellt. Sonst bestelle ich mir halt
> noch einen StLink mit. Aber zumindest beim AVR brauchte ich bisher noch
> nie einen Debugger.

Es ist aber nett und viel billiger als für den AVR. Einen ST-Link in der 
Bauform eines USB-Sticks verkauft dir der Chinese für €2,50.

> Beim Nucleo-Board weiß ich nicht, ob mir das wirklich etwas bringt. Da
> ist dann ja auch noch einmal ein anderer µC drauf

Häh? Es gibt ganz viele verschiedene Nucleo-Boards. Nimm einfach das mit 
dem STM32F103RB. Das ist fast der gleiche Chip wie auf dem Bluepill, nur 
mit mehr Pins. Ansonsten haben die Nucleos den ST-Link gleich drauf. Und 
der läßt sich dann auch zum J-Link umflashen. Das ist im wesentlichen 
eine Lizenzfrage. Lies halt mal bei Jegger auf der Website.

von alarmdin (Gast)


Lesenswert?

Stefanus F. schrieb:
> Lies die infos auf meiner Homepage. Die Unterschiede zwischen dem
> ST-Link vom Nucleo Board und den billigen Clones aus China habe ich dort
> beschrieben. Die CMSIS ist umfangreich weil der STM32 viele Register
> hat. Du kannst aber Files weglassen, die für andere STM32 Modelle
> gelten. Aber das macht dein Programm nich schlanker. Also würde ich mir
> die Mühe sparen.
> Der zweite Mikrocontroller auf dem Nucleo Biard ist der ST-Link. Den
> kannst du abtrennen und einzeln verwenden. Im Gegensatz zu den billigen
> China Clones enthält er zugleich einen USB-Uart Adapter. Kann ich nur
> empfehlen. Selbst wenn du den Haupt-Teil des Nucleo boarded weg wirfst,
> ist das immer noch eine sehr preisgünstige Sache. Und es wird schnell
> geliefert. Die Firma ST hat dazu einen Anazon Account.

Ich kam noch nicht dazu, die gesamte Webpage durchzulesen. Aber scheint 
tatsächlich viele nützliche Informationen zu enthalten. Wobei ich nicht 
glaube, dass ich den ST-Link abgelötet und dann wieder irgendwo 
aufgelötet bekomme.
Aber trotzdem sieht das Board, nach einem zweiten Blick, tatsächlich 
sehr attraktiv aus.

Axel S. schrieb:
> alarmdin schrieb:
>> Der USB-Serial-Adapter ist bereits bestellt. Sonst bestelle ich mir halt
>> noch einen StLink mit. Aber zumindest beim AVR brauchte ich bisher noch
>> nie einen Debugger.
>
> Es ist aber nett und viel billiger als für den AVR. Einen ST-Link in der
> Bauform eines USB-Sticks verkauft dir der Chinese für €2,50.

Nach ein bisschen Überlegen werde ich mir wohl ein Nucleo-Board zulegen. 
Die sind auch billiger als gedacht.

>> Beim Nucleo-Board weiß ich nicht, ob mir das wirklich etwas bringt. Da
>> ist dann ja auch noch einmal ein anderer µC drauf
>
> Häh? Es gibt ganz viele verschiedene Nucleo-Boards. Nimm einfach das mit
> dem STM32F103RB. Das ist fast der gleiche Chip wie auf dem Bluepill, nur
> mit mehr Pins. Ansonsten haben die Nucleos den ST-Link gleich drauf. Und
> der läßt sich dann auch zum J-Link umflashen. Das ist im wesentlichen
> eine Lizenzfrage. Lies halt mal bei Jegger auf der Website.

Tatsächlich. Ich dachte immer, dass darauf üblicherweise STM32F4 verbaut 
sind. Aber sind wenn dann wohl eher STM32F3. Ich sollte mich nächstes 
Mal wohl besser informieren.
Kann man den ST-Link auch umflashen, wenn man den nicht auslötet?

Danke für die Aufklärung!

von guest (Gast)


Lesenswert?

alarmdin schrieb:
> Wobei ich nicht
> glaube, dass ich den ST-Link abgelötet und dann wieder irgendwo
> aufgelötet bekomme.

Nix löten, einfach "abbrechen". Zumindest bei dem auf Stefanus Seite zu 
sehenden Nucleo-F103RB Board ist die Platine entsprechend vorgestanzt. 
Der kleinere obere Teil ist der ST-Link, der größere untere das 
eigentliche Board.

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


Lesenswert?

alarmdin schrieb:
> Kann man den ST-Link auch umflashen, wenn man den nicht auslötet?

Der hat einen Bootloader und wird auf dem gleichen Weg (per DFU) zum 
J-Link umgeflashed, auf dem sonst ein Update der ST-Link Firmware 
passiert. Man kann auch von J-Link wieder zu ST-Link zurück, wenn man 
das möchte.

guest schrieb:
> Nix löten, einfach "abbrechen".

Man muß den ST-Link nicht abbrechen, um ihn umzuflashen. Man muß ihn 
auch nicht abbrechen, um einen externen µC via SWD zu flashen oder zu 
debuggen. Einfach die beiden Jumper auf CN2 entfernen und schon sind 
ST-Link und der µC auf dem Nucleo-Board elektrisch getrennt (ja ok, 
außer GND und Vcc). Und dann kann man beliebige µC an die SWD Pins auf 
CN4 anschließen.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

> Wobei ich nicht glaube, dass ich den ST-Link abgelötet und dann wieder
> irgendwo aufgelötet bekomme.

Schau Dir das Board genau an. Du brauchst dazu nur ein Messer (oder Mut, 
einfach über die Tischkante brechen).

> Ich dachte immer, dass darauf üblicherweise STM32F4 verbaut
> sind. Aber sind wenn dann wohl eher STM32F3.

Gibt es ab 15€ mit STM32F103.

> Kann man den ST-Link auch umflashen, wenn man den nicht auslötet?

Na klar.

Du solltest wirklich meine Seite lesen, bevor du weitere Fragen stellst, 
die dort beantwortet sind.

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.