Hallo, ich versuche gerade ein Beispielprogramm (Temperatursensor) von STM auf dem STM32L-Discovery zum Laufen zu bringen. Das Ganze läuft unter Linux Mint14. Die Toolchain habe ich mir wie hier: http://www.wolinlabs.com/blog/linux.stm32.discovery.gcc.html installiert. (einfacherheithalber erst einmal in das home) Das Blinky Beispiel für den STM32F4 läßt so sich auch übersetzen. Nur habe ich halt einen STM32L1. Die Librarys für den STM32L1 neben den Beipielen habe ich mir dann von der ST Seite heruntergeladen und das Makefile von wolinlabs darauf angepaßt. Einige includes mußte ich in die Sourcen noch hinzufügen. Die angefügten Dateien sind alle im gleichen Verzeichnis. Version arm-none-eabi-gcc: 4.7.4 20130913 Version arm-none-eabi-objcopy: 2.22.0.20130913 Wenn ich das Ganze via Makefile jetzt übersetze, scheint der Linker ein Problem zu haben. Die Ausgabe vom make sieht so aus: arm-none-eabi-gcc -g -O2 -Wall -Tstm32_flash.ld -mlittle-endian -mthumb -mcpu=cortex-m3 -mthumb-interwork -mfloat-abi=soft -I. -I../../Utilities/STM32L-DISCOVERY -I../../Libraries/CMSIS/Include -I../../Libraries/CMSIS/Device/ST/STM32L1xx/Include -I../../Libraries/STM32L1xx_StdPeriph_Driver/inc main.c system_stm32l1xx.c stm32l1xx_it.c ../../Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/st artup_stm32l1xx_md.s -o tempsensor.elf main.c: In function 'main': main.c:162:3: warning: pointer targets in passing argument 1 of 'LCD_GLASS_ScrollSentence' differ in signedness [-Wpointer-sign] In file included from main.h:29:0, from main.c:22: ../../Utilities/STM32L-DISCOVERY/stm32l_discovery_lcd.h:121:6: note: expected 'uint8_t *' but argument is of type 'char *' /tmp/ccKSy8F2.o: In function `getFactoryTSCalibData': /home/andy/stm32_discovery_arm_gcc/STM32L1_Discovery_Firmware_Pack_V1.0. 3/Projects/AN3964-Temperature_sensor/main.c:248: undefined reference to `DBGMCU_GetDEVID' /tmp/ccKSy8F2.o: In function `writeCalibData': /home/andy/stm32_discovery_arm_gcc/STM32L1_Discovery_Firmware_Pack_V1.0. 3/Projects/AN3964-Temperature_sensor/main.c:290: undefined reference to `DATA_EEPROM_Unlock' /home/andy/stm32_discovery_arm_gcc/STM32L1_Discovery_Firmware_Pack_V1.0. 3/Projects/AN3964-Temperature_sensor/main.c:293: undefined reference to `FLASH_ClearFlag' usw. usw. bis: /home/andy/stm32_discovery_arm_gcc/STM32L1_Discovery_Firmware_Pack_V1.0. 3/Projects/AN3964-Temperature_sensor/stm32l1xx_it.c:189: undefined reference to `EXTI_ClearITPendingBit' /home/andy/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7 .4/../../../../arm-none-eabi/lib/armv7-m/libg.a(lib_a-exit.o): In function `exit': exit.c:(.text.exit+0x16): undefined reference to `_exit' /home/andy/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7 .4/../../../../arm-none-eabi/lib/armv7-m/libg.a(lib_a-sbrkr.o): In function `_sbrk_r': sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk' collect2: error: ld returned 1 exit status make: *** [tempsensor.elf] Fehler 1 Was läuft da schief? Gruß Andreas
Moin, einfach die .h der StdPeriph_Driver einbinden reicht nicht. Du musst die nötigen .c Dateien auch übersetzen und einbinden. z.B. stm32l1xx_exti.c nicht compiliert/gelinkt -> EXTI Fehler usw.
Hallo, Danke, das war das Problem. Vom AVR bin es anders gewohnt. ;-) Jetzt bekomme ich immer noch Fehler, mit denen ich aber nichts anfangen kann. Hier scheint der Assembler Probleme zu haben. arm-none-eabi-gcc -g -O2 -Wall -Tstm32_flash.ld -mlittle-endian -mthumb -mcpu=cortex-m3 -mthumb-interwork -DUSE_STDPERIPH_DRIVER -mfloat-abi=soft -I. -I../../Utilities/STM32L-DISCOVERY -I../../Libraries/CMSIS/Include -I../../Libraries/CMSIS/Device/ST/STM32L1xx/Include -I../../Libraries/STM32L1xx_StdPeriph_Driver/inc main.c system_stm32l1xx.c stm32l1xx_it.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/misc.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_adc.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_aes.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_aes_util.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_comp.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_crc.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dac.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dbgmcu.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dma.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_exti.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_flash.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_flash_ramfunc.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_fsmc.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_gpio.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_i2c.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_iwdg.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_lcd.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_opamp.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_pwr.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_rcc.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_rtc.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_sdio.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_spi.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_syscfg.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_tim.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_usart.c ../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_wwdg.c ../../Utilities/STM32L-DISCOVERY/stm32l_discovery_lcd.c ../../Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/st artup_stm32l1xx_md.s -o tempsensor.elf main.c: In function 'main': main.c:162:3: warning: pointer targets in passing argument 1 of 'LCD_GLASS_ScrollSentence' differ in signedness [-Wpointer-sign] In file included from main.h:29:0, from main.c:22: ../../Utilities/STM32L-DISCOVERY/stm32l_discovery_lcd.h:121:6: note: expected 'uint8_t *' but argument is of type 'char *' /tmp/cctiL2qQ.s: Assembler messages: /tmp/cctiL2qQ.s:18: Warning: ignoring changed section attributes for .data /home/andy/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7 .4/../../../../arm-none-eabi/lib/armv7-m/libg.a(lib_a-exit.o): In function `exit': exit.c:(.text.exit+0x16): undefined reference to `_exit' /home/andy/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7 .4/../../../../arm-none-eabi/lib/armv7-m/libg.a(lib_a-sbrkr.o): In function `_sbrk_r': sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk' collect2: error: ld returned 1 exit status make: *** [tempsensor.elf] Fehler 1 Gruß Andreas
Bei mir klappts. Hast Du die newlib richtg installiert? Häng mal noch ein -lc als letztes an die CFLAGS.
Hallo, als newlib habe ich nur libnewlib-dev im repo gefunden und installiert. -lc habe ich jetzt auch an die Optionen angehängt. Das gibt leider keinen Unterschied in der Ausgabe von make. Gruß Andreas
Hallo, Danke! Das hat schon einmal geklappt. Jetzt bleibt nur noch: /home/andy/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7 .4/../../../../arm-none-eabi/lib/armv6-m/libc.a(lib_a-exit.o): In function `exit': exit.c:(.text.exit+0x18): undefined reference to `_exit' collect2: error: ld returned 1 exit status make: *** [tempsensor.elf] Fehler 1 Bis jetzt habe ich noch keine Lösung dafür gefunden. Bin aber noch am Suchen.... Gruß Andreas
Andreas B. schrieb: > Bis jetzt habe ich noch keine Lösung dafür gefunden. Bin aber noch am > Suchen.... Gut. Wenn Du bei den µC bleiben willst musst Du das lernen ;-) Aus: http://forums.leaflabs.com/topic.php?id=11574&page=2
1 | Add -nostartfiles to the LDFLAGSSTM32 definintion in the makefile to get rid of the __bss_start__, __bss_end__ and _exit errors. |
2 | You will get and linker error complaining about _init, define this somewhere: |
3 | void __attribute ((weak))_init(void){}; |
Musst Du nur anpassen. Wäre aber vielleicht doch nicht verkehrt eine komplette und funktionierende Entwicklungsumgebung zu schaffen...
Hallo, was -nostartfiles betrifft: Der Fehler ist weg, dafür bekomme ich dann: /home/andy/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7 .4/../../../../arm-none-eabi/lib/armv7-m/libg.a(lib_a-init.o): In function `__libc_init_array': init.c:(.text.__libc_init_array+0x40): undefined reference to `_init' collect2: error: ld returned 1 exit status make: *** [tempsensor.elf] Fehler 1 Edit: Sorry, den void __attribute ((weak))_init(void){}; habe ich überlesen. Jetzt geht es. Danke Dir! hp-freund schrieb: > Wäre aber vielleicht doch nicht verkehrt eine komplette und > funktionierende Entwicklungsumgebung zu schaffen... Das versuche ich ja gerade. ;-) Wenn Du eine Tip hast, wie ich das bewerkstelligen soll: Nur her damit. Das war bis jetzt der Versuch, der mir noch am aussichsreichsten erschien. Immerhin ging Blinky zu übersetzen. Soweit habe ich es bis jetzt noch nicht gebracht. Gruss Andreas (Unter Mint 15 Cinnamon übrigens das Gleiche Ergebnis)
:
Bearbeitet durch User
Andreas B. schrieb: > Wenn Du eine Tip hast, wie ich das bewerkstelligen soll: Nur her damit. Kommt darauf an ob Du eine funktionierende Linux gcc Umgebung hast. Ich habe das build-script auf die neuesten Versionen angepasst. Erste Tests hat der Cross-Compiler bestanden. Auch dein Projekt ;) Musst nur dein home anpassen (2 Zeilen am Anfang). Die Verzeichnisse müssen alle vorher angelegt und das $PREFIX/bin an den PATH angehängt werden. Das Ganze braucht keine root Rechte. Etwas Zeit und einige GB auf der Platte solltest Du aber mitbringen. Sonst geht Alles von allein... Viel Erfolg!
Hallo, die Linux gcc Umgebung läuft bei mir schon ewig. Mit den AVRs arbeite ich ja schon ein Weilchen problemlos. Ich probierere Dein Installationsscript mal aus. Danke Dir! Gruß Andreas
Hallo bitverdreher, mich würde schon noch interessieren ob Du mit dem script Erfolg hattest.
Hallo Hp-Freund, sorry (Ich war am WE unterwegs), Danke! Es hat gut geklappt. Ich mußte nur die Verzeichnisse manuell anlegen und den Kram vor den kompilieren hinkopieren. Ich wollte noch schauen, warum das Script das nicht macht. Ansonsten ist es ein Sript for Dummys. ;-) Das -nostartfiles im Make mußte ich hier aber auch drinlassen. Jetzt muß ich nur noch schauen, warum sich am Controller nichts tut. Das gibt vermutlich einen neuen Thread... Gruß Andreas
Hallo, jetzt schreibe ich doch mal in den bestehenden Thread, weil ich nicht weiß, ob das .bin nicht i.O. ist oder ein generelles flash Problem vorliegt. Das o.a. Programm habe ich jetzt in das discovery geflasht, aber es passiert nichts. Wenn ich die Pins berühre, dann tut sich am LCD etwas. Ich gehe also davon aus, daß die Ein- und Ausgänge noch floaten, also noch nicht einmal eine Initialisierung durchgeführt wird. Die Ausgabe von stlink: ~/stlink/st-flash write tempsensor.bin 0x8000000 2013-11-21T20:07:12 INFO src/stlink-usb.c: -- exit_dfu_mode 2013-11-21T20:07:12 INFO src/stlink-common.c: Loading device parameters.... 2013-11-21T20:07:12 INFO src/stlink-common.c: Device connected is: L1 Med-density device, id 0x10186416 2013-11-21T20:07:12 INFO src/stlink-common.c: SRAM size: 0x4000 bytes (16 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 256 bytes 2013-11-21T20:07:12 INFO src/stlink-common.c: Ignoring 1 bytes of Zeros at end of file 2013-11-21T20:07:12 INFO src/stlink-common.c: Attempting to write 65699 (0x100a3) bytes to stm32 address: 134217728 (0x8000000) 2013-11-21T20:07:12 WARN src/stlink-common.c: unaligned len 0x100a3 -- padding with zero Flash page at addr: 0x08010000 erased 2013-11-21T20:07:13 INFO src/stlink-common.c: Finished erasing 257 pages of 256 (0x100) bytes 2013-11-21T20:07:13 INFO src/stlink-common.c: Starting Half page flash write for STM32L core id 2013-11-21T20:07:13 INFO src/stlink-common.c: Successfully loaded flash loader in sram 513/513 halfpages written 2013-11-21T20:07:18 INFO src/stlink-common.c: Starting verification of write complete 2013-11-21T20:07:19 INFO src/stlink-common.c: Flash written and verified! jolly good! sieht eigentlich gut aus, abgesehen von einem Byte zuwenig. Irgendwie komme ich hier nicht weiter. Gruß Andreas
Hallo, ich bin immer noch nicht weiter gekommen. Wenn ich ein Binary aus dem Flash auslese und mit dem erzeugten Binary vergleiche, stimmen sie bis auf eine Ausnahme überein: Das erzeugte bin ist um 1 länger als das ausgelesene und enthält am Ende eine zusätzliche 0. Laut Ausgabe von stlink wird das ja ignoriert, sollte also nicht stören. Hat jemand mal ein lauffähiges .bin, was ich mal auf das Discovery laden könnte? Gruß Andreas
Hallo, Mal ein kurzer Statusbericht: Jetzt tut sich etwas, nachdem ich nicht mehr die startup_stm32l1xx_md.s aus dem TrueStudio Verzeichnis verwende, sondern aus gcc_ride7. (siehe makefile). Der Unterschied ist nur dass die gcc_ride7Version nach dem Systeminit noch ein /* Call static constructors */ bl __libc_init_array aufruft. Die Laufschrift " ** TEMPERATURE SENSOR EXAMPLE ** " geht jetzt einmal durch das Display. Dann erscheinen die beiden Sternchen der ersten Wiederholung und das war es dann. Hier schläft er und wacht scheinbar nicht mehr auf. Das .bin ist somit ok und das Problem scheint wohl eine fehlende Initialisierung (Takt, IRQ?) zu sein. Hat jemand eine Idee dazu, was noch fehlt? Gruß Andreas
Wirf mal den debugger an. Besonders in der Nähe von: sprintf()
Hallo, ich habe jetzt erst einmal etwas gebraucht, um mich mit dem gdb zurechtzufinden. Er läuft jetzt prima. Mit dem AVR hatte ich nie einen Debugger gebraucht. Dein Verdacht war richtig, es war der sprintf, wo er in eine exception hineinläuft. Ich hatte das Original von: > sprintf(strDisp, "%d °C", temperature_C ); zu: > sprintf(strDisp, "%ld °C", temperature_C ); weil der compiler gemeckert hatte, daß das Argument %d einen int_8 erwartet. Scheinbar ist der sprintf bei gcc anders implementiert. Hier muß ich mich erst einmal hineinfinden. Fortsetzung folgt..... Gruß Andreas
Hi, jetzt habe ich mal etwas herumgespielt. Das sprintf bekomme ich nicht zum laufen. Deshalb habe ich das mal mit Ltoa versucht. Da diese Funktion aber scheinbar nicht implementiert ist, habe ich sie aus einem Artikel hier kopiert und an die 32bit int angepasst. Das funkioniert soweit ganz gut. Wenn ich aber einen strcat versuche (hier wieder auskommentiert), fliege ich wieder auf die Nase.
1 | if (CurrentlyDisplayed == Display_TemperatureDegC) { |
2 | /* print average temperature value in °C */
|
3 | ItoA(temperature_C, strDisp); |
4 | // strcat(strDisp, " °C");
|
5 | |
6 | // sprintf(strDisp, "%ld °C", temperature_C );
|
7 | } else { |
8 | /* print result of ADC conversion */
|
9 | ItoA(tempAVG, strDisp); |
10 | // strcat(strDisp, " counts");
|
11 | |
12 | // sprintf(strDisp, "> %ld", tempAVG );
|
13 | }
|
Scheinbar gibt es hier grundsätzliche Probleme mit Stringfunktionen. Oder sitzt das Problem wieder mal zwischen meinen beiden Ohren? Gruß Andreas
Hallo, ich habe gestern das Ganze mit meinem STM32L-Discovery ausprobiert. Vermutlich liegt das Problem bei dem Toolchain-Script von oben. Es compiliert den Code zwar fehlerfrei, aber durch die multilib Option im script erzeugt es in der newlib arm und keinen thumb code. Vermutlich auch noch andere Probleme. Benuzt Du das? Wenn ja, versuch bitte eine andere toolchain. War ja auch erst mal nur zum testen gedacht ;-) Sry
Hallo, aua, ich dachte, Du arbeitest bereits erfolgreich mit dieser Toolchain. :-( Das war die erste Toolchain, die ich erfolgreich zum laufen gebracht habe. Ich habe da schon diverse Versuche hinter mir. Da wird diese Odysee wohl weitergehen..... Gruß Andreas
Meine Toolchain - die funktioniert - ist schon 2 Jahre alt. Ich hatte das script damals auch so angepasst mit den aktuellen Versionen. Wenn Du nichts besseres findest kann ich den Originalzustand wieder herstellen. Wenn ich mal aktualisiere würde ich vermutlich http://thetoolchain.com/ oder https://launchpad.net/gcc-arm-embedded benutzen.
Hier noch mal die Kurzversion mit fertigem gcc + Freunden. (DL 57MB) Funktioniert sogar mit unserem Board :)
1 | cd $install_dir |
2 | wget https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q3-update/+download/gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 |
3 | tar xjf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 |
4 | export PATH=$PATH:$install_dir/gcc-arm-none-eabi-4_7-2013q3/bin |
Hallo, super, diese Version funktioniert jetzt endlich. Danke Dir! Andreas
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.