Forum: Mikrocontroller und Digitale Elektronik Probleme bei toolchain setup für STM32F4Discovery


von Jan (Gast)


Lesenswert?

Hallo zusammen!

Habe auf meinem Rechner mit Ubuntu 12.04LTS die toolchain für den 
STM32F407 gemäß 
http://www.mikrocontroller.net/articles/STM32F4-Discovery installiert, 
hat auch alles gut geklappt. Jetzt versuche ich das Beispiel zu 
kompilieren, leider hängt der Compiler bei einer der peripheral 
libraries:
1
Building file: /opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dcmi.c
2
Invoking: ARM Linux GCC C Compiler (Sourcery Lite Bare)
3
arm-none-eabi-gcc -DSTM32F40_41xxx -DUSE_STDPERIPH_DRIVER -DUSE_STM32_DISCOVERY -DHSE_VALUE=8000000 -I/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include -I/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/CMSIS/Include -I/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/inc -I"//home/jan/workspace/TemplateSTM32F407" -O0 -ffunction-sections -fdata-sections -Wall -Wa,-adhlns="StdPeriph/stm32f4xx_dcmi.o.lst" -c -fmessage-length=0 -MMD -MP -MF"StdPeriph/stm32f4xx_dcmi.d" -MT"StdPeriph/stm32f4xx_dcmi.d" -mcpu=cortex-m4 -mthumb -g3 -o "StdPeriph/stm32f4xx_dcmi.o" "/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dcmi.c"
4
Finished building: /opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dcmi.c
5
 
6
Building file: /opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c
7
Invoking: ARM Linux GCC C Compiler (Sourcery Lite Bare)
8
arm-none-eabi-gcc -DSTM32F40_41xxx -DUSE_STDPERIPH_DRIVER -DUSE_STM32_DISCOVERY -DHSE_VALUE=8000000 -I/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include -I/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/CMSIS/Include -I/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/inc -I"//home/jan/workspace/TemplateSTM32F407" -O0 -ffunction-sections -fdata-sections -Wall -Wa,-adhlns="StdPeriph/stm32f4xx_dma.o.lst" -c -fmessage-length=0 -MMD -MP -MF"StdPeriph/stm32f4xx_dma.d" -MT"StdPeriph/stm32f4xx_dma.d" -mcpu=cortex-m4 -mthumb -g3 -o "StdPeriph/stm32f4xx_dma.o" "/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c"
9
/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_fmc.c: In function 'FMC_NORSRAMDeInit':
10
Finished building: /opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c
11
 
12
/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_fmc.c:138:5: error: 'FMC_Bank1' undeclared (first use in this function)
13
Building file: /opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma2d.c
14
/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_fmc.c:138:5: note: each undeclared identifier is reported only once for each function it appears in
15
Invoking: ARM Linux GCC C Compiler (Sourcery Lite Bare)
16
/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_fmc.c:146:3: error: 'FMC_Bank1E' undeclared (first use in this function)
17
arm-none-eabi-gcc -DSTM32F40_41xxx -DUSE_STDPERIPH_DRIVER -DUSE_STM32_DISCOVERY -DHSE_VALUE=8000000 -I/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include -I/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/CMSIS/Include -I/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/inc -I"//home/jan/workspace/TemplateSTM32F407" -O0 -ffunction-sections -fdata-sections -Wall -Wa,-adhlns="StdPeriph/stm32f4xx_dma2d.o.lst" -c -fmessage-length=0 -MMD -MP -MF"StdPeriph/stm32f4xx_dma2d.d" -MT"StdPeriph/stm32f4xx_dma2d.d" -mcpu=cortex-m4 -mthumb -g3 -o "StdPeriph/stm32f4xx_dma2d.o" "/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma2d.c"
18
Finished building: /opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma2d.c
19
 
20
Building file: /opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_exti.c
21
Invoking: ARM Linux GCC C Compiler (Sourcery Lite Bare)
22
arm-none-eabi-gcc -DSTM32F40_41xxx -DUSE_STDPERIPH_DRIVER -DUSE_STM32_DISCOVERY -DHSE_VALUE=8000000 -I/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include -I/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/CMSIS/Include -I/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/inc -I"//home/jan/workspace/TemplateSTM32F407" -O0 -ffunction-sections -fdata-sections -Wall -Wa,-adhlns="StdPeriph/stm32f4xx_exti.o.lst" -c -fmessage-length=0 -MMD -MP -MF"StdPeriph/stm32f4xx_exti.d" -MT"StdPeriph/stm32f4xx_exti.d" -mcpu=cortex-m4 -mthumb -g3 -o "StdPeriph/stm32f4xx_exti.o" "/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_exti.c"
23
/opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_fmc.c: In function 'FMC_NORSRAMInit':
24
Finished building: /opt/STM32F4xx_DSP_StdPeriph_Lib_V1.2.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_exti.c

Da klappt irgendwas mit stm32f4xx_fmc.c nicht, gibt eine lange 
Fehlerliste... aber die angeblich undefinierten variablen sind alle in 
stm32f4xx.h definiert, der compiler findet die aber irgendwie nicht...
Im Preprocessor ist der richtige Typ (-DSTM32F40_41xxx) definiert denke 
ich, oder?

Wer kann mir da helfen? Sollte mein erstes Projekt mit dem STM32F4 
werden, aber schon ueber 200 errors ohne ueberhaupt eine Zeile 
geschrieben zu haben...

Danke!

Jan

von Jan (Gast)


Lesenswert?

Ein Fehler ist "'FSMC_Bank1' undeclared (first use in this function) 
stm32f4xx_fsmc.c", ist aber in stm32f4xx.h deklariert:
1
#if defined (STM32F40_41xxx)
2
#define FSMC_Bank1          ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE)
3
#define FSMC_Bank1E         ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE)
4
#define FSMC_Bank2          ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE)
5
#define FSMC_Bank3          ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE)
6
#define FSMC_Bank4          ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE)
7
#endif /* STM32F40_41xxx */

Verstehe absolut nicht warum der das nicht findet...

von W.S. (Gast)


Lesenswert?

Immer wieder das Gleiche.

Tja, ich kann nur sagen, daß ich mit Windows arbeite und mir für ein 
Projekt eine Batchdatei schreibe, wo Compiler, Assembler, Linker usw. zu 
Fuß aufgerufen werden. Wenn man das einmal zelebriert hat, klappt das 
immer und zuverlässig und man ist einen Sack voll Probleme los, die mit 
Makefiles, IDE's usw. daherkommen. Bei dir wäre das ein Shell-Script - 
und sowas hat man als Linuxer bittesehr zu können.

Vielleicht hapert's bei dir nur an irgendiner Case-Sensitivität oder 
daran, daß irgendeine Datei formell 'root' gehört oder mit dem elenden 
Link-Gewirre bei Linux der Compiler in's Leere oder ganz woandershin 
greift, wer soll das aus der Entfernung denn wissen?

Mein Rat, lade dir hier aus der Codesammlung mal die Lernbetty herunter 
und versuche die bei dir zu übersetzen. Wenn das klappt, dann findest du 
auch die Haken bei deinem Demo-Projekt.

W.S.

von Markus (Gast)


Lesenswert?

Dann wird entweder stm32f4xx.h nicht includiert oder ein #ifdef ist im 
Weg.

Wenn ich bei so was gar nicht mehr weiterkomme dann streue ich zum Test 
#error in die Header ein um zu sehen was überhaupt ausgewertet wird.

Bei meinen stm32-Projekten mit gcc unter Linux habe ich immer ein

CFLAGS += -include stm32f4xx_conf.h

im Makefile. Das sorgt dafür das immer alle relevanten Header da sind.

von W.S. (Gast)


Lesenswert?

Jaja, mit genug Erfahrung im Kreuz hat man ne ziemliche Anzahl von 
Tricks bei der Hand, um herauszufinden, wo es nicht läuft. Aber der Jan 
steht noch ganz am Anfang.

Nebenbei gesagt, würde ich mit dem Entwickeln unter Linux erst garnicht 
anfangen, sondern mir notfalls nen Zweit-PC mit Windows zulegen und dort 
entweder die Keil-Demo oder die IAR-Demo installieren. Meine Erfahrung 
mit dem GCC, präziser mit dem ARM-GCC sind miserabel, dort lauern noch 
viel häßlichere Fallstricke, die man nur per Reassembler herauskriegt, 
siehe 'exportierte labels in thumb code'.

W.S.

von holger (Gast)


Lesenswert?

@Jan

Klopp die STM32F4xx_DSP_StdPeriph_Lib_V1.2.0
in die Tonne und nimm eine ältere Version.

Alternativ: Hör nicht auf den Schwätzer W.S.

Lösch die stm32f4xx_fmc.c einfach, benne sie um so das sie beim
compilieren nicht verwendet wird oder wenn du Eclipse
benutzt Date anklicken, rechte Maustaste:

Resource Configurations-> Exclude from Build und dann
Select All anklicken.

von holger (Gast)


Lesenswert?

Korrektur (scheiß Laptop Tastatur)

Lösch die stm32f4xx_fmc.c einfach, benenne sie um so das sie beim
compilieren nicht verwendet wird oder wenn du Eclipse
benutzt Datei anklicken, rechte Maustaste:

usw.

von Dr. Sommer (Gast)


Lesenswert?

Jan schrieb:
> Ein Fehler ist "'FSMC_Bank1' undeclared (first use in this function)
Bitte die ERSTEN Fehlermeldungen posten, nicht die Folgefehler. Dein 
genannter Fehler ist etwas unwahrscheinlich. Das #define muss außerdem 
-DSTM32F4XX sein und nicht -DSTM32F40_41xxx - zumindest bei den mir 
bekannten StdPeripheral Library Versionen.

W.S. schrieb:
> Projekt eine Batchdatei schreibe, wo Compiler, Assembler, Linker usw. zu
> Fuß aufgerufen werden
Und wenn du ein großes Projekt hast wartest du jedes Mal brav eine halbe 
Stunde bis alles compiliert ist? Ne, besser gleich richtig mit 
makefiles.

W.S. schrieb:
> die mit
> Makefiles, IDE's usw. daherkommen. Bei dir wäre das ein Shell-Script -
> und sowas hat man als Linuxer bittesehr zu können.
Ein makefile ist ein Shellscript mit extra-Intelligenz, die diverse 
Probleme löst. Bei den IDE-Problemen kann ich dir allerdings zustimmen 
(dass das noch passiert).

W.S. schrieb:
> Vielleicht hapert's bei dir nur an irgendiner Case-Sensitivität
Nö, nicht bei der StdPeripheral (unter Windows kanns genausogut an der 
Case-Insensitivität hapern)
> oder
> daran, daß irgendeine Datei formell 'root' gehört
Nope, das gäbe andere Fehler
> oder mit dem elenden
> Link-Gewirre bei Linux der Compiler in's Leere
Windows hat jetzt auch Links.
>oder ganz woandershin
> greift, wer soll das aus der Entfernung denn wissen?
Ach das kann unter Windows natürlich grundsätzlich nicht passieren. ...

W.S. schrieb:
> Mein Rat, lade dir hier aus der Codesammlung mal die Lernbetty herunter
Aber nur, wenn du besonders schlechten Code-Stil lernen willst, der 
W.S. hat da ein wahres Kunstwerk fabriziert. Man kann nur hoffen dass er 
damit nicht schon eine Generation von Anfängern mit infiziert hat.
> und versuche die bei dir zu übersetzen. Wenn das klappt, dann findest du
> auch die Haken bei deinem Demo-Projekt.
Er wird ein -I oder -D Flag vergessen haben. Mit der richtigen 
Fehlermeldung zuerst wäre das einfacher herauszufinden.

W.S. schrieb:
> Nebenbei gesagt, würde ich mit dem Entwickeln unter Linux erst garnicht
> anfangen, sondern mir notfalls nen Zweit-PC mit Windows zulegen und dort
> entweder die Keil-Demo oder die IAR-Demo installieren.
Kann aber keine neuen C++ Standards :-/ ... Das lustige ist, dass an den 
Unis gerne mal geraten wird Linux in einer VM zu installieren, um dort 
vernünftig C++ coden zu können...
> Meine Erfahrung
> mit dem GCC, präziser mit dem ARM-GCC sind miserabel, dort lauern noch
> viel häßlichere Fallstricke, die man nur per Reassembler herauskriegt,
> siehe 'exportierte labels in thumb code'.
Kann dafür aber auch mehr, gell.

holger schrieb:
> Alternativ: Hör nicht auf den Schwätzer W.S.
Jawoll!

von Dr. Sommer (Gast)


Lesenswert?

Ah, habe jetzt erst die raffiniert versteckten Meldungen im OP gesehen. 
Das Problem ist schlicht und ergreifend dass der STM32F407VG keinen FMC 
hat, sondern nur einen FSMC. Daher darfst du die stm32f4xx_fmc.c nicht 
mit kompilieren. Du darfst dich bei den Genies bei ST bedanken. GCC & 
Linux hat damit, im Gegensatz zu W.S.' Wahn/Wunsch-fantasien, nichts mit 
zu tun.
Und tatsächlich gibts STM32F40XX nicht mehr, STM32F40_41xxx war wohl 
richtig.

von Jan (Gast)


Lesenswert?

Guten Morgen zusammen!

Vielen Dank für Eure Hilfe! Habe jetzt anscheinend einen Leidensgenossen 
gefunden: Beitrag "Re: Eclipse Linux STM32"
Gleiche Fehlermeldung wie bei mir, liegt das an ST? Die Jungs sind hier 
gleich nebenan, aber ich glaube die lassen mich nicht rein um zu meckern 
:) Juergen G. (jup) hat in dem o.g. thread ein schönes Template mit der 
Version 1.0.0 der StdPeripheralLib gepostet, kompiliert bei mir ohne 
Probleme! Damit kann ich arbeiten, jetzt sucht der Anfänger (also ich 
und sicher auch viele andere) eine gute Beschreibung wie man st-link in 
eclipse einbindet um zu flashen und zu debuggen... Wenn das dann auch 
noch läuft wäre es eine gute Basis um den STM32F4 besser kennen zu 
lernen :-)

Danke!

Jan

von Jan (Gast)


Lesenswert?

Ok, unter dem thread den ich da eben genannt habe steht wie man es mit 
openOCD macht, werde das versuchen!

Kann man damit rechnen das ST bald eine korrigierte Version rausbringt?

von dummy (Gast)


Lesenswert?

>Kann man damit rechnen das ST bald eine korrigierte Version rausbringt?

Woher soll das HIER jemand wissen? Frag ST.

von Dr. Sommer (Gast)


Lesenswert?

Jan schrieb:
> Kann man damit rechnen das ST bald eine korrigierte Version rausbringt?
ST interessiert sich nicht für Software-Fehler, das sieht man u.a. an 
der unendlich langen Errata-Liste: 
http://www.mikrocontroller.net/articles/STM32#Errata.2C_Tipps_und_Tricks 
- Software ist für ETechniker und ST ein notwendiges Übel...
Wie gesagt kannst du das auch selber korrigieren durch 
nicht-Mitcompilieren der stm32f4xx_fmc.c .

texane st-link einbinden geht so:
Im Terminal "st-util" ausführen
In Eclipse eine Debug "GDB Hardware Debugging" Konfiguration hinzufügen, 
arm-none-eabi-gdb als Debugger auswählen, als Host 127.0.0.1 und Port 
4242 eingeben

von Uwe (Gast)


Lesenswert?

Hallo,

ich hatte das gleiche Problem wie der TE! (Error: stm32f4xx_fmc.c ... 
'FMC_Bank1' undeclared...)

Habe die stm32f4xx_fmc.c , wie oben beschrieben, vom Compilieren 
ausgeschlossen (Eclipse):

holger schrieb:
> Resource Configurations-> Exclude from Build und dann
> Select All anklicken.

Allerdings bekomme ich jetzt eine neue Fehlermeldung:

Console:
make all
make: *** No rule to make target `stm32f4xx_fmc.o', needed by 
`myProject.elf'.  Stop.

Hat vielleicht jemand eine Idee wie man das in den Griff bekommt?

Grüsse
Uwe

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.