Makefile stm32f1

Gast #5428932
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
Angehängte Dateien:
Gast #5428941
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).
Gast #5428961
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?
Gast #5428966
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...
Gast #5429127
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).
(Firma: fritzler-avr.de) #5429266
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.
Gast #5429510
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.
Gast #5429619
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.
Gast #5429724
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.
Angehängte Dateien:
Gast #5429788
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.
Gast #5429837
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.
Gast #5429840
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
Gast #5430724
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren