Fehler beim Kompilieren der Startdatei auf STM32

7

Ich versuche, benutzerdefinierte Interrupt-Handler für meinen Cortex M3 bereitzustellen (Referenzhandbuch hier ). ST stellt freundlicherweise eine Standardbibliothek zur Verfügung, die verschiedene Startdateien mit dem Namen "startup_stm32f2xx.s" enthält. Jeder befindet sich je nach IDE in einem anderen Ordner.

Jetzt verwende ich keine IDE (ich kompiliere direkt mit Yagarto, einer modifizierten Version der gcc-Toolchain). Ich habe bereits gefragt, welches Start-up ich verwenden soll. Nachdem ich jetzt alle verfügbaren Startdateien ausprobiert habe, erhalte ich immer den gleichen Fehler:

/startup_stm32f2xx.s:1:0: Fehler: Die Ziel-CPU unterstützt den ARM-Modus nicht

Eine schnelle Google-Suche zeigt, dass dies wahrscheinlich bedeutet, dass der Assembler-Code Anweisungen enthält, die mein ARM nicht verstehen kann. Dies ist überraschend, da der Code für mein Board bereitgestellt wurde.

Wie kann ich die Startdatei kompilieren, die den Interrupt-Vektor auf meinem STM32 definiert?

Bearbeiten: In jeder der Dateien startup_stm32f2xx.s:1:0steht der Beginn eines Kommentars. Außerdem benutze ich die Flagge -mcpu=cortex-m3. Hier ist die vollständige Fehlermeldung:

$ make all
arm-none-eabi-gcc -x assembler-with-cpp -c -g -mcpu=cortex-m3 -gdwarf-2 -Wa,-amhls=startup_stm32f2xx.lst   startup_stm32f2xx.s -o startup_stm32f2xx.o
startup_stm32f2xx.s:1:0: error: target CPU does not support ARM mode
makefile:46: recipe for target `startup_stm32f2xx.o' failed
make: *** [startup_stm32f2xx.o] Error 1
Zufälliges Blau
quelle
Ignorante Frage: Ist Yagarto mit der STM32-Toolchain kompatibel?
Clabacchio
Was meinst du damit STM32 toolchain? Es gibt nur eine STM32 standard library.
Randomblue
AFAIK-Mikrocontroller werden mit einem Toolset geliefert, mit dem die Binärdateien auf das Mikro geschrieben werden können. Ist die Bibliothek mit Ihrer Familie kompatibel?
Clabacchio
Um die Binärdateien auf den Mikroprozessor zu schreiben, verwende ich OpenOCD (über JTAG), das keine besondere Beziehung zum STM32 hat.
Randomblue

Antworten:

7

Möglicherweise benötigen Sie auch -mthumb -mno-thumb-interwork -mfpu=vfp -msoft-float -mfix-cortex-m3-ldrdals Compiler Optionen für arm-none-eabi-gcc. Verwenden Sie für den Assembler -mcpu=cortex-m3 -mthumbals Optionen.

Bearbeiten:

Die -mthumbSchalter gcc und der Assembler wechseln in den "Daumen" -Modus - sie generieren standardmäßig Anweisungen für den Armmodus, die auf Cortex M3 nicht funktionieren.

Da es keinen ARM-Modus gibt, benötigen wir kein ARM / Tumb-Interworking -mno-thumb-interwork.

Der Compiler, der -mfpu=vfp -msoft-floatfür die Gleitkommaunterstützung benötigt wird . Cortex M3 hat kein Hardware-Gleitkomma-AFAIK, zumindest ist mir kein Silizium bekannt, das sowohl Cortex M3 als auch Gleitkomma in Hardware enthält. Es gibt einige Cortex M4, die haben.

Die meisten Cortex M3- -mfix-cortex-m3-ldrdAnwendungen finden Sie in der Errata-Dokumentation für die Cortex M3-Kernversionen.

Weitere Informationen finden Sie in der GCC-Dokumentation und im ARM-Infocenter .

Turbo J.
quelle
3
Dies ist sehr wahrscheinlich wahr, aber bitte erklären Sie, was jeder von ihnen bedeutet und warum sie wichtig sind.
AngryEE
0

Überprüfen Sie, ob Sie den richtigen Assembler verwenden, um startup_stm32f2xx.o zu erstellen. Geben Sie Folgendes ein, um herauszufinden, für welche Architektur Sie zusammengestellt haben:

file startup_stm32f2xx.o

Sie sollten so etwas wie ARM-Elf Little Endian sehen. Wenn Sie dies nicht tun, sollten Sie Ihr Makefile / Build-Skript reparieren.

Toby Jaffey
quelle
Die Datei startup_stm32f2xx.owird nicht erstellt. Ich habe nur die .sDatei. Ich habe einen vollständigen Speicherauszug der obigen Fehlermeldung hinzugefügt.
Randomblue
0

Ich hatte das gleiche Problem, als ich von Em :: Blocks zu IDE-less-GCC-basierter Entwicklung wechselte. Seltsamerweise liefert ST Microelectronics Startdateien, die mit den Toolchains der größten IDEs kompatibel sind. Sie bieten jedoch keine, die mit GAS (dem GCC-Assembler) funktioniert.

Ich könnte mir helfen, nur die Startdatei zu verwenden, die in Em :: Blocks enthalten war.

Hier ist mein Beitrag zu Stack Overflow .

Multisync
quelle