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
(.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
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).
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...
(.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?
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...
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).
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ß.
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.
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.
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.
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.
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.
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
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
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.
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.