Forum: Compiler & IDEs Makefile stm32f1


von Make (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche mich gerade an den STM32 Controllern. Ich habe hier dieses 
BluePill Board mit dem STM32F103C8.

Ich habe es geschafft mit Eclipse und dem GNU ARM Plugin ein Projekt 
dafür zu erstellen und auch die LED blinken zu lassen. Jedoch ist in dem 
vorhandenen Projektemplate im Erstell-Assistenten eine alte CMSIS 
Version dabei.
Damit funktioniert zum Beispiel der USB Teil nicht (Ich möchte damit das 
USB Tutorial hier im Wiki durcharbeiten).
Ebenfalls ist da die StdPeripheral Treiber und alles mögliche dabei, 
welches ich nicht verwenden will.

Deswegen habe ich versucht ein Bare Metall Template mit einem Makefile 
und nur der CMSIS Version (aktuelle aus en.stm32cubef1.zip von 
STMicroeletronics) zu bauen.

Wenn ich nun make aufrufen, dann bekomme ich folgende Error Meldung:
1
david@david-opensuse:~/Schreibtisch/stm32make> make
2
~/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/arm-none-eabi-gcc  -nostartfiles -Tlibs/STM32F103XB_FLASH.ld  libs/startup_stm32f103xb.s   -o libs/startup_stm32f103xb
3
/tmp/ccUJ7FAL.o: In function `LoopFillZerobss':
4
(.text.Reset_Handler+0x26): undefined reference to `SystemInit'
5
(.text.Reset_Handler+0x2e): undefined reference to `main'
6
/home/david/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/lib/libc.a(lib_a-init.o): In function `__libc_init_array':
7
init.c:(.text.__libc_init_array+0x44): undefined reference to `_init'
8
collect2: error: ld returned 1 exit status
9
<builtin>: recipe for target 'libs/startup_stm32f103xb' failed
10
make: *** [libs/startup_stm32f103xb] Error 1

Das Projekt habe ich angehängt.
Mein OS ist openSUSE Leap 42.3

Und gibt es für die STM32 auch so ein schönes Makefile Template wie 
dieses hier für AVR:
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Exkurs_Makefiles

Wäre nett, wenn mir jemand von euch weiterhelfen könnte

von Niklas Gürtler (Gast)


Lesenswert?

Du brauchst eine Funktion SystemInit, welche die Takte alle 
initialisiert... Die von Hand zu schreiben ist relativ lästig.
Daher folgede Möglichkeiten:
1. Du kannst die aktuelle CMSIS/HAL Library einfach in dein eclipse 
Projekt reinkopieren (aus dem CubeF1 Download Paket).
2. Du implementierst die SystemInit manuell oder mit der HAL neu, oder 
lässt sie aus STM32CubeMX generieren
3. Du nimmst das Beispielprojekt vom Tutorial, da ist ein 
eclipse-Projekt drin. Da ist übrigens eine manuelle Variante dieser 
Funktion drin, unter anderem Namen.
4. Du nimmst das TrueStudio und generiert das Projekt mittels 
STM32CubeMX, das geht eigentlich am Einfachsten (auch unter Linux).

von Make (Gast)


Lesenswert?

Aber die SystemInit Funktion ist doch schon unter "system_stm32f1xx.c" 
implementiert.
Fehlt mir da eine Verlinkung darauf?

von Niklas Gürtler (Gast)


Lesenswert?

Achso... Du hast die system_stm32f1xx.o offebar nicht mit gelinkt? Das 
-nostartfiles ist auch verkehrt wenn man den Standard Startupcode nimmt, 
der ruft __libc_init_array auf...

von Make (Gast)


Lesenswert?

Also ich hab jetzt das -nostartfiles entfernt und bekomme nun folgenden 
output:
1
david@david-opensuse:~/Schreibtisch/stm32make> make all
2
  CC src/main.c
3
  CC libs/CMSIS/system_stm32f1xx.c
4
~/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/arm-none-eabi-gcc  -Tlibs/STM32F103XB_FLASH.ld  libs/startup_stm32f103xb.s   -o libs/startup_stm32f103xb
5
/tmp/ccbjBOVf.o: In function `LoopFillZerobss':
6
(.text.Reset_Handler+0x26): undefined reference to `SystemInit'
7
(.text.Reset_Handler+0x2e): undefined reference to `main'
8
/home/david/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/lib/crt0.o: In function `_start':
9
(.text+0xec): undefined reference to `main'
10
/home/david/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit':
11
exit.c:(.text.exit+0x2c): undefined reference to `_exit'
12
collect2: error: ld returned 1 exit status
13
<builtin>: recipe for target 'libs/startup_stm32f103xb' failed
14
make: *** [libs/startup_stm32f103xb] Error 1

Er hat das SystemInit wohl immer noch nicht gefunden.
Ich dachte durch OBJS=$(SRCS:.c=.o) sollte er alle in SRCS angegebenen 
Quellen als Objektdateien haben?

von Niklas Gürtler (Gast)


Lesenswert?

1
~/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/arm-none-eabi-gcc  -Tlibs/STM32F103XB_FLASH.ld  libs/startup_stm32f103xb.s   -o libs/startup_stm32f103xb
Hier linkst du nur den Startupcode und sonst gar nix... Lass doch 
eclipse das makefile automatisch generieren, die aktuellen CMSIS-Version 
reinzukopieren ist einfach. Ich kann das makefile hier gerade nicht 
debuggen...

von Christopher J. (christopher_j23)


Lesenswert?

Make schrieb:
> Und gibt es für die STM32 auch so ein schönes Makefile Template wie
> dieses hier für AVR:
> https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Exkurs_Makefiles

Nicht besonders schön aber es funktioniert: 
https://github.com/ChristianRinn/bare_metal_stm32f103c8

von Doc Cortex (Gast)


Lesenswert?

Niklas Gürtler schrieb:
> Du brauchst eine Funktion SystemInit, welche die Takte alle
> initialisiert... Die von Hand zu schreiben ist relativ lästig.
> Daher folgede Möglichkeiten:


Was denn, die 15 Zeilen Code? Geht doch viel schneller und einfacher als 
Dein vorgeschlagenes Gedöns...


> 1. Du kannst die aktuelle CMSIS/HAL Library einfach in dein eclipse
> Projekt reinkopieren (aus dem CubeF1 Download Paket).
> 2. Du implementierst die SystemInit manuell oder mit der HAL neu, oder
> lässt sie aus STM32CubeMX generieren
> 3. Du nimmst das Beispielprojekt vom Tutorial, da ist ein
> eclipse-Projekt drin. Da ist übrigens eine manuelle Variante dieser
> Funktion drin, unter anderem Namen.
> 4. Du nimmst das TrueStudio und generiert das Projekt mittels
> STM32CubeMX, das geht eigentlich am Einfachsten (auch unter Linux).

von Nop (Gast)


Lesenswert?

Doc Cortex schrieb:

> Was denn, die 15 Zeilen Code?

Bißchen mehr ist das schon, wenn man das richtig macht. Außerdem beißen 
Regsiter bekanntlich, so daß man sich von denen fernhalten muß.

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


Lesenswert?

Nop schrieb:
> Außerdem beißen
> Regsiter bekanntlich, so daß man sich von denen fernhalten muß.

Nop hat mal wieder keine Ahnung, daher fasst er keine Register an ;)

Den CubeMX nutzt man für GENAU 2 Dinge:
- Die Peripherie klicken und gucken auf welchen Pin die rauskommt, wenn 
man das mit der Datenblattabelle macht bekommt man nen Föhn.
- Die PLL Variablen ausrechnen lassen fürn Takt.

von Nop (Gast)


Lesenswert?

Mw E. schrieb:

> Nop hat mal wieder keine Ahnung, daher fasst er keine Register an ;)

Dein Ironiedetektor hat Pfingsten nicht so gut verkraftet, ne? ^^

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


Lesenswert?

Naja bei dir weis man nie ob da mal wieder Murks gelabert ist oder obs 
Ironie ist.

von Make (Gast)


Lesenswert?

Christopher J. schrieb:
> Make schrieb:
>> Und gibt es für die STM32 auch so ein schönes Makefile Template wie
>> dieses hier für AVR:
>> https://www.mikrocontroller.net/articles/AVR-GCC-T...
>
> Nicht besonders schön aber es funktioniert:
> https://github.com/ChristianRinn/bare_metal_stm32f103c8

Ich hab jetzt das hier genommen und den STM32F103C8 Ordner von src ins 
Hauptverzeichnis kopiert und die CMSIS Dateien aktualisiert, sowie das 
Makefile für den verschobenen Ordner angepasst.
Damit hats geklappt und werde damit weiterarbeiten.

von Nop (Gast)


Lesenswert?

Mw E. schrieb:
> Naja bei dir weis man nie ob da mal wieder Murks gelabert ist oder
> obs Ironie ist.

Was daher kommt, daß Dein Gedächtnis auch nur lückenhaft funktioniert - 
sonst hättest Du Dich nämlich auch erinnert, daß ich kein Freund von HAL 
& Co bin.

Im Übrigen labere ich auch technisch gesehen keinen Murks, sondern 
allenfalls kontroverse, aber vertretbare Ansichten.

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

Make schrieb:
> Ich habe es geschafft mit Eclipse und dem GNU ARM Plugin ein Projekt
> dafür zu erstellen und auch die LED blinken zu lassen. Jedoch ist in dem
> vorhandenen Projektemplate im Erstell-Assistenten eine alte CMSIS
> Version dabei.

Make schrieb:
> (.text.Reset_Handler+0x26): undefined reference to `SystemInit'
> (.text.Reset_Handler+0x2e): undefined reference to `main'

und
> /home/david/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/../lib/gcc/arm-non 
e-eabi/7.2.1/../../../../arm-none-eabi/lib/libc.a(lib_a-init.o):  ...

Jawoll! Immer nach dem Motto: "warum einfach, wenn es auch kompliziert 
immer noch nicht geht"

Manchmal kommt mir angesichts derartiger Herangehensweise das große 
Kopfschütteln. Du bist also in der eigentlichen Sache überhaupt noch 
keinen einzigen Schritt vorangekommen, sondern kämpfst die ganze Zeit 
mit der IDE und irgendwelchen CMSIS-Versionen und Make und sonstigem 
Zirkus - anstatt wenigstens EINMAL zu lernen, wie du deinen Compiler und 
Linker aufrufst und welche Kommandozeilenparameter du ihm geben mußt. 
Und du glaubst, daß die IDE dir eine Hilfe sei - tatsächlich hat sie 
sich als Hemmschuh für dich erwiesen.

Dabei geht es eigentlich so einfach! Ich häng dir mal die 
GCC-Batch-Datei aus der Lernbetty dran. Da mußt du zwar drin 
herumeditieren, weil deine Quellen ja andere sind als die der Lernbetty, 
ebenso ist deine CPU nebst RAM/ROM-Layout anders, ebenso werden die 
Pfadangaben vom Windows-PC anders gehandhabt als auf deinem Linux-PC und 
schlußendlich mußt du aus ner Batchdatei ein Shellscript machen.

Sollte alles ja keine Thema sein für jemanden, der sich zum 
Programmieren anschickt. Also stell dich nicht so an.

W.S.

von Nop (Gast)


Lesenswert?

W.S. schrieb:

> Dabei geht es eigentlich so einfach! Ich häng dir mal die
> GCC-Batch-Datei aus der Lernbetty dran.

Das Problem hier war nicht die IDE oder das Makefile, weswegen ein 
Buildscript auch keine Lösung ist. Das Problem war, daß der OP nicht 
willens war, die Fehlermeldung des Linkers sinnerfassend zu lesen.

Wenn man vergißt, ein relevantes Quelltextfile einzubinden, wird ein 
Buildscript nämlich zu genau derselben Fehlermeldung führen. D'oh.

von Make (Gast)


Lesenswert?

W.S. schrieb:
> Und du glaubst, daß die IDE dir eine Hilfe sei - tatsächlich hat sie
> sich als Hemmschuh für dich erwiesen.

Hab ich hier geschrieben, dass ich ein Problem mit Eclipse habe?

Nein ganz im Gegenteil, mit Eclipse konnte ich das erzeugte Beispiel 
kompilieren und erzeugen.
Ich wollte aber ein bare-metall Projekt, welches ich auch ohne Eclipse 
nur mit Make kompilieren kann.

von Niklas Gürtler (Gast)


Lesenswert?

Make schrieb:
> Ich wollte aber ein bare-metall Projekt, welches ich auch ohne Eclipse
> nur mit Make kompilieren kann.

Eclipse generiert makefiles, welche dann auch ohne Eclipse nur mit make 
genutzt werden können. Die sind aber nicht besonders hübsch

von Make (Gast)


Lesenswert?

Niklas Gürtler schrieb:
> Eclipse generiert makefiles, welche dann auch ohne Eclipse nur mit make
> genutzt werden können.

Ich weiß aber den Grund hast du dir selber schon beantwortet:

> Die sind aber nicht besonders hübsch

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Make schrieb:
> Ich weiß aber den Grund hast du dir selber schon beantwortet:

Wenn die "Schönheit" einer Datei, welche man normalerweise nicht öffnet 
weil sie autogeneriert ist und funktioniert, relevant ist... Was schon 
eher ein Problem ist: Pfade sind darin hartkodiert, das makefile ist 
also nicht wirklich portabel.

von W.S. (Gast)


Lesenswert?

Make schrieb:
> Ich wollte aber ein bare-metall Projekt, welches ich auch ohne Eclipse
> nur mit Make kompilieren kann.

Dann kannst du zu wenig.

Also ICH kann meine Projekte übersetzen, ohne dazu Make oder eine IDE 
nötig zu haben. Das beredte Beispiel hab ich dir ja schon gepostet.

Aber wenn dir die einfach zu handhabende Version nicht recht ist, dann 
mach's eben so kompliziert wie du selber willst.

W.S.

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.