Hallo, ich versuche, float Zahlen mit einem stm32f107rc und der Cooide 1.7.0 und winarm 4.6.q4 auszugeben. Leider klappt das nicht, es kommt nur Müll raus. Welche Libs muss ich dazulinken und aus welchem Pfad? Oder erkennt das die IDE automatisch? Bei Atmel war auch Handarbeit notwendig... Hier der Compile-Aufruf: -mcpu=cortex-m3; -mthumb; -Wall; -ffunction-sections; -g; -Os; -mfloat-abi=soft; -DSTM32F107RC; -DSTM32F10X_CL; -I.; Und der Linker: -mcpu=cortex-m3; -mthumb; -g; -nostartfiles; -Map=led_blink.map; -Os; --gc-sections; -Lc:\program files (x86)\gnu tools arm embedded\4.6 2012q4\arm-none-eabi\lib\; -lm; -L${linkdir}; -T${linkdir}/arm-gcc-link.ld; Toolchain Path liegt auf: C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\bin Irgendwas ist da faul.
>Leider klappt das nicht, es kommt nur Müll raus.
Wobei kommt Müll raus? Wie sieht der aus?
Coocox sagt folgendes: "In project -> configuration click on the “Add” of the “linked libraries” box and put there a single m (Yes, a f&@^# single letter, an “m” without quotes)" Allerdings kann ich da kein "m" eingeben, sondern es wird ein Pfad zu einer Lib gefordert. Nun sind in dem GCCARM Paket sehr viele "libm.a" enthalten. Welche muss ich einbinden?
Hallo, ich glaube es war die Lib: arm-none-eabi\lib\fpu\libm.a Moritz
Ich habe folgende libs gefunden, das mit der fpu/lib.a werde ich mal probieren:
1 | C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\libm.a |
2 | C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv6-m\libm.a |
3 | C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7-m\libm.a |
4 | C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7-r\thumb\libm.a |
5 | C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7-r\thumb\fpu\libm.a |
6 | C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7-r\thumb\softfp\libm.a |
7 | C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7e-m\libm.a |
8 | C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7e-m\fpu\libm.a |
9 | C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7e-m\softfp\libm.a |
10 | C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\fpu\libm.a |
11 | C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\thumb\libm.a |
"FPU" im Sinne von Hardware-FPU bei einem STM32F1? Dem Linker keine absoluten Pfade geben, denn das ist der Anfang vielen Übels. Falls CoIDE den Linker via Compiler-Frontend (gcc) aufruft, wird intern automatisch Objectcode aus der richtigen Library gelinkt. Die Fragen von Holger sind noch unbeantwortet.
Klappt leider immer noch nicht. Vielleicht ist es auch kein Linker-Problem. Ich habe mal das Projekt (zum Compilieren mit Coocox und GCCARM 4.6 q4) sowie die main.c (zum Anschauen) angehängt. Ausgabe des Projekt ist:
1 | *** START *** |
2 | |
3 | SYSCLK: he default value |
4 | HCLK: K: he default value |
5 | PCLK1: : he default value |
6 | PCLK2: : he default value |
Also hier werden einige Zeichen verschluckt. Die angehängte LED sollte über TIM2 im Sekundentakt blinken, tut dies aber eher 20x (10x an, 10x aus) in 9 Sekunden (also fast doppelt so schnell). Interessanterweise ändert bei der TIM2 Konfiguration eine Änderung von TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1; auf TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV2; nicht die Blinkzeit.
> sprintf(buffer, "\nSYSCLK: %li \n", RCC_Clocks.SYSCLK_Frequency / 1000);
Nimm
sprintf(buffer, "\nSYSCLK: %d \n", RCC_Clocks.SYSCLK_Frequency /
1000);
Dein sprintf() kann kein %li, da geht nur %i.
Und floating point kann es auch nicht.
Ah, ok. Danke für die Info, werde ich mal probieren. Gibt es denn auch Libs, die floating point können, oder kann das die GCCARM Toolchain generell nicht? Im Coocox Forum scheint es ähnliche Probleme zu geben, allerdings habe ich auch noch keine Lösung dort gefunden.
holger schrieb: > Nimm > > sprintf(buffer, "\nSYSCLK: %d \n", RCC_Clocks.SYSCLK_Frequency / > 1000); Double ist doch auch floating point, oder?
It's magic.... mit %d funktioniert es :-) Ausgabe:
1 | SYSCLK: 72000 |
2 | HCLK : 72000 |
3 | PCLK1 : 36000 |
4 | PCLK2 : 72000 |
Jetzt muss ich nur noch schauen, warum der Timer zu schnell läuft. Wobei aber das Thema floating point damit noch nicht gelöst ist.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.