Hallo, ich bin (immernoch) Anfänger im Bereich ARM Programmierung. Ich habe das STM Nucleo-Board STM32F103RB und habe ein einfaches Blink-Programm für meinen STM32F103RBT6 erstellt. Als IDE habe ich Eclipse verwendet und die GNU-ARM-Tools usw. installiert. Compilieren hat funktioniert (siehe eclipse_main.png). Dann habe ich mit OpenOCD 'per Hand' in der DOS-Box die *.elf-Datei auf das Nucleo-Board geflasht. (siehe openOCD_DOS.png). Leider blinkt die LED nicht. :-( Wie kann ich jetzt den Fehler eingrenzen? Danke!
Warum von der Konsole? Probiere mal: run oder continue
Hallo hp-freund, danke. >Warum von der Konsole? Ich habe es auch mal aus Eclipse probiert da blinkt auch nichts. Dann wollte ich den OpenOCD-Debugger aus Eclipse heraus nutzen um dem Problem näher zu kommen, der sagt mir aber immer: >Function "main" not defined (siehe main_not_defined.png) Und ich weiß leider nicht wie ich dieses 'main not defined'-Problem beheben soll :-(
Hier noch das Output von OpenOCD in der Eclipse console:
1 | Open On-Chip Debugger 0.9.0 (2015-05-19-12:06) |
2 | Licensed under GNU GPL v2 |
3 | For bug reports, read |
4 | http://openocd.org/doc/doxygen/bugs.html |
5 | Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD |
6 | adapter speed: 1000 kHz |
7 | adapter_nsrst_delay: 100 |
8 | none separate |
9 | srst_only separate srst_nogate srst_open_drain connect_deassert_srst |
10 | Started by GNU ARM Eclipse |
11 | Info : Unable to match requested speed 1000 kHz, using 950 kHz |
12 | Info : Unable to match requested speed 1000 kHz, using 950 kHz |
13 | Info : clock speed 950 kHz |
14 | Info : STLINK v2 JTAG v24 API v2 SWIM v11 VID 0x0483 PID 0x374B |
15 | Info : using stlink api v2 |
16 | Info : Target voltage: 3.268993 |
17 | Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints |
18 | Info : accepting 'gdb' connection on tcp/3333 |
19 | Info : device id = 0x20036410 |
20 | Info : flash size = 128kbytes |
21 | undefined debug reason 7 - target needs reset |
22 | target state: halted |
23 | target halted due to debug-request, current mode: Thread |
24 | xPSR: 0x01000000 pc: 0xb9337822 msp: 0x4c05b510 |
25 | semihosting is enabled |
26 | target state: halted |
27 | target halted due to debug-request, current mode: Thread |
28 | xPSR: 0x01000000 pc: 0xb9337822 msp: 0x4c05b510, semihosting |
29 | target state: halted |
30 | target halted due to breakpoint, current mode: Thread |
31 | xPSR: 0x61000000 pc: 0x2000003a msp: 0x4c05b510, semihosting |
32 | target state: halted |
33 | target halted due to debug-request, current mode: Thread |
34 | xPSR: 0x01000000 pc: 0xb9337822 msp: 0x4c05b510, semihosting |
35 | target state: halted |
36 | target halted due to debug-request, current mode: Thread |
37 | xPSR: 0x01000000 pc: 0xb9337822 msp: 0x4c05b510, semihosting |
38 | ===== arm v7m registers |
39 | (0) r0 (/32): 0x00000020 |
40 | (1) r1 (/32): 0x00000000 |
41 | (2) r2 (/32): 0x2000003C |
42 | (3) r3 (/32): 0x2000083C |
43 | (4) r4 (/32): 0x080005A0 |
44 | (5) r5 (/32): 0x200005E4 |
45 | (6) r6 (/32): 0x00000020 |
46 | (7) r7 (/32): 0x00000014 |
47 | (8) r8 (/32): 0xBF76FFDF |
48 | (9) r9 (/32): 0xFFBFFFFD |
49 | (10) r10 (/32): 0x304C7B35 |
50 | (11) r11 (/32): 0x9C473FE7 |
51 | (12) r12 (/32): 0xFFDFEFFF |
52 | (13) sp (/32): 0x4C05B510 |
53 | (14) lr (/32): 0xFFFFFFFF |
54 | (15) pc (/32): 0xB9337822 |
55 | (16) xPSR (/32): 0x01000000 |
56 | (17) msp (/32): 0x4C05B510 |
57 | (18) psp (/32): 0xB4221B6C |
58 | (19) primask (/1): 0x00 |
59 | (20) basepri (/8): 0x00 |
60 | (21) faultmask (/1): 0x00 |
61 | (22) control (/2): 0x00 |
62 | ===== Cortex-M DWT registers |
63 | (23) dwt_ctrl (/32) |
64 | (24) dwt_cyccnt (/32) |
65 | (25) dwt_0_comp (/32) |
66 | (26) dwt_0_mask (/4) |
67 | (27) dwt_0_function (/32) |
68 | (28) dwt_1_comp (/32) |
69 | (29) dwt_1_mask (/4) |
70 | (30) dwt_1_function (/32) |
71 | (31) dwt_2_comp (/32) |
72 | (32) dwt_2_mask (/4) |
73 | (33) dwt_2_function (/32) |
74 | (34) dwt_3_comp (/32) |
75 | (35) dwt_3_mask (/4) |
76 | (36) dwt_3_function (/32) |
Danke für jede Hilfe...
Hi, > keine Ahnung warum die Meldung erschienen ist, habe es nochmal gemacht, und da kam diese Meldung nicht mehr. Im Debug-Fenster erscheint immer: >No source available for "0xf3af4804" Hier nochmal der OpenOCD Output auf der Eclipse-Console:
1 | Open On-Chip Debugger 0.9.0 (2015-05-19-12:06) |
2 | Licensed under GNU GPL v2 |
3 | For bug reports, read |
4 | http://openocd.org/doc/doxygen/bugs.html |
5 | Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD |
6 | adapter speed: 1000 kHz |
7 | adapter_nsrst_delay: 100 |
8 | none separate |
9 | srst_only separate srst_nogate srst_open_drain connect_deassert_srst |
10 | Started by GNU ARM Eclipse |
11 | Info : Unable to match requested speed 1000 kHz, using 950 kHz |
12 | Info : Unable to match requested speed 1000 kHz, using 950 kHz |
13 | Info : clock speed 950 kHz |
14 | Info : STLINK v2 JTAG v24 API v2 SWIM v11 VID 0x0483 PID 0x374B |
15 | Info : using stlink api v2 |
16 | Info : Target voltage: 3.276467 |
17 | Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints |
18 | Info : accepting 'gdb' connection on tcp/3333 |
19 | Info : device id = 0x20036410 |
20 | Info : flash size = 128kbytes |
21 | target state: halted |
22 | target halted due to debug-request, current mode: Thread |
23 | xPSR: 0x01000000 pc: 0xb9337822 msp: 0x4c05b510 |
24 | semihosting is enabled |
25 | target state: halted |
26 | target halted due to debug-request, current mode: Thread |
27 | xPSR: 0x01000000 pc: 0xb9337822 msp: 0x4c05b510, semihosting |
28 | target state: halted |
29 | target halted due to breakpoint, current mode: Thread |
30 | xPSR: 0x61000000 pc: 0x2000003a msp: 0x4c05b510, semihosting |
31 | target state: halted |
32 | target halted due to debug-request, current mode: Thread |
33 | xPSR: 0x01000000 pc: 0xb9337822 msp: 0x4c05b510, semihosting |
34 | target state: halted |
35 | target halted due to debug-request, current mode: Thread |
36 | xPSR: 0x01000000 pc: 0xb9337822 msp: 0x4c05b510, semihosting |
37 | ===== arm v7m registers |
38 | (0) r0 (/32): 0x00000020 |
39 | (1) r1 (/32): 0x00000000 |
40 | (2) r2 (/32): 0x2000003C |
41 | (3) r3 (/32): 0x2000083C |
42 | (4) r4 (/32): 0x080005A0 |
43 | (5) r5 (/32): 0x200005E4 |
44 | (6) r6 (/32): 0x00000020 |
45 | (7) r7 (/32): 0x00000014 |
46 | (8) r8 (/32): 0xBF7EFFDD |
47 | (9) r9 (/32): 0xFFBFBFFC |
48 | (10) r10 (/32): 0x304C7B31 |
49 | (11) r11 (/32): 0x9C473FF7 |
50 | (12) r12 (/32): 0xFF9FEFFE |
51 | (13) sp (/32): 0x4C05B510 |
52 | (14) lr (/32): 0xFFFFFFFF |
53 | (15) pc (/32): 0xB9337822 |
54 | (16) xPSR (/32): 0x01000000 |
55 | (17) msp (/32): 0x4C05B510 |
56 | (18) psp (/32): 0x30221B6C |
57 | (19) primask (/1): 0x00 |
58 | (20) basepri (/8): 0x00 |
59 | (21) faultmask (/1): 0x00 |
60 | (22) control (/2): 0x00 |
61 | ===== Cortex-M DWT registers |
62 | (23) dwt_ctrl (/32) |
63 | (24) dwt_cyccnt (/32) |
64 | (25) dwt_0_comp (/32) |
65 | (26) dwt_0_mask (/4) |
66 | (27) dwt_0_function (/32) |
67 | (28) dwt_1_comp (/32) |
68 | (29) dwt_1_mask (/4) |
69 | (30) dwt_1_function (/32) |
70 | (31) dwt_2_comp (/32) |
71 | (32) dwt_2_mask (/4) |
72 | (33) dwt_2_function (/32) |
73 | (34) dwt_3_comp (/32) |
74 | (35) dwt_3_mask (/4) |
75 | (36) dwt_3_function (/32) |
...
außerdem sehe ich, wenn ich CubeMXtest Debug anklicke unten:
>Function "main" not defined.
(siehe Screenshot)
Was hast Du für eigenartige PC Adressen? Ausführung im RAM? Alles etwas merkwürdig.
Hallo hp-freund,
> Ausführung im RAM?
Wo siehst Du das denn bitte?
Und wo wird das eingestellt? In den Debugger-Settings?
hp-freund schrieb: > Ausführung im RAM? Das ist keine RAM-Adresse... Da wird irgendein Unsinn im Flash stehen und der Prozessor irgendwo ins Nirvana springen. Um die Korrektheit des Programms zu prüfen würde ich mal aus der .elf Datei eine .hex Datei machen (arm-none-eabi-objcopy -O ihex test.elf test.hex) und diese mit dem ST-Link-Utility flashen. Wenn es dann blinkt ist der Code korrekt und irgendwas in Eclipse/OpenOCD falsch eingestellt, sonst umgekehrt...
Eclipse erstellt mir die .hex-Datei. Habe die mit ST-Link Utility geflasht, aber es blinkt nichts. Deshalb habe ich ja gedacht probier mal zu debuggen, aber das geht ja leider auch nicht. Wie komme ich da nun weiter?
In Eclipse, muss ich denn zum Debuggen erstmal den Debug-Server starten? Und danach die Debug-Configuration ausführen? Oder wie läuft das korrekte Debuggen in Eclipse ab?
T.Baumbach schrieb: > Wie komme ich da nun weiter? Versuche erstmal ein funktionsfähiges Beispiel aufzutreiben und bringe das mit einer der Rundum-Sorglos-IDE's ans Laufen, wie z.B. Keil µVision oder Atollic Studio. Dann kannst du versuchen das mit OpenOCD zu flashen, und wenn das geht mit Eclipse. Das OpenOCD+ST-Link Gedöns ist ja leider nicht wirklich "stabil". Dein Program Counter sieht von Anfang an komisch aus. Sicher dass die BOOT-Pins richtig beschaltet sind? Alternativ: Setze einen Breakpoint beim Reset_Handler und schau ob der erreicht wird und laufe da schrittweise weiter, und schau wo es abstürzt.
T.Baumbach schrieb: > In Eclipse, muss ich denn zum Debuggen erstmal den Debug-Server > starten? Dein Debug-Server ist ja OpenOCD, den startet es ja scheinbar von selbst.
Das funktionsfähige beispile habe ich bereits am Laufen. Ich habe mit CooCox das Blink-Programm lauffähig. >Dein Program Counter sieht von Anfang an komisch aus. Sicher dass die BOOT-Pins richtig beschaltet sind? Da habe ich nichts selbst gemacht. Die Einstellungen kommen von CubeMX nach Auswahl des Nucleo-Boards werden da alle Einstellungen generiert. Es sind dieselben die ich für CooIDE verwende, und dort funktioniert ja alles. >Setze einen Breakpoint beim Reset_Handler und schau ob der erreicht wird und laufe da schrittweise weiter, und schau wo es abstürzt. Wie soll ich das bitte machen wenn der Eclipse Debugerr nihht geht? Nun wollte ich das Ganze halt mit Eclipse machen, aber ich weiß halt nicht wo der Fehler liegt. Da beim Flashen mit ST-Link die LED nicht blinkt muss der Fehler irgendwo im Programm liegen. Aber ich weiß halt nicht wie ich das eingrenzen kann. main.c ist genauso wie das bei CooCox. (Sind ja nur die zwei Zeilen im main.c-->while(1). Ich denke irgendwo in der Toolchain habe ich wohl inkorrekte Einstellungen und dann wird vielleicht etwas compliert was vom C-Code funktionieren müsste, aber halt nicht korrekt für das Board compiliert wird. Ich weiß aber nicht wo ich suchen soll/muss?
T.Baumbach schrieb: > Das funktionsfähige beispile habe ich bereits am Laufen. > Ich habe mit CooCox das Blink-Programm lauffähig. Das ist schonmal gut. Was passiert wenn du die .elf Datei von Coocox mithilfe von OpenOCD flashst? >>Dein Program Counter sieht von Anfang an komisch aus. Sicher dass die BOOT-Pins > richtig beschaltet sind? > > Da habe ich nichts selbst gemacht. Die Einstellungen kommen von CubeMX > nach Auswahl des Nucleo-Boards werden da alle Einstellungen generiert. > Es sind dieselben die ich für CooIDE verwende, und dort funktioniert ja > alles. Okay... >>Setze einen Breakpoint beim Reset_Handler und schau ob der > erreicht wird und laufe da schrittweise weiter, und schau wo es > abstürzt. > > Wie soll ich das bitte machen wenn der Eclipse Debugerr nihht geht? Rechtsklick auf die Zeilennummer neben der 1. Zeile nach dem Reset_Handler (in der startup-Datei), "Toggle Breakpoint", dann den Debugger starten. Wäre nicht das erste mal dass der Debugger das Programm zwar richtig startet (sieht so aus in dem Screenshot), es aber vor der main() im Reset_Handler schon abstürzt und der Debugger dann nichts sinnvolles mehr anzeigt. > Nun wollte ich das Ganze halt mit Eclipse machen, aber ich weiß halt > nicht wo der Fehler liegt. > Da beim Flashen mit ST-Link die LED nicht blinkt muss der Fehler > irgendwo im Programm liegen. Oder beim kompilieren, oder beim Flashen... > Aber ich weiß halt nicht wie ich das eingrenzen kann. > > main.c ist genauso wie das bei CooCox. > (Sind ja nur die zwei Zeilen im main.c-->while(1). Hah. Da sind noch einige mehr Zeilen versteckt in der Takt-Initialisierung und GPIO-Initialisierung, wo man schon einiges falsch machen kann... > Ich denke irgendwo in der Toolchain habe ich wohl inkorrekte > Einstellungen und dann wird vielleicht etwas compliert was vom C-Code > funktionieren müsste, aber halt nicht korrekt für das Board compiliert > wird. > > Ich weiß aber nicht wo ich suchen soll/muss? Du könntest ja mal den Build-Log zeigen und vielleicht sogar deine .elf Datei posten.
Hi, bevor ich die .elf-Datei poste, püfe ich nochmal mein Projekt. Ich bin nach folgendem Tutorial vorgegangen: http://klaus4.blogspot.de/2014/05/stm32f4-discovery-mit-opensource.html beim Punkt 'Alle unnötigen Header-Files im Verzeichnis' bin ich mir nicht sicher, welche datei ich includieren muss. Ich habe ja das Nucleo STM32F103 Board mit dem Cortex-M3 STM32F103RBT6. ich habe jetzt zwei Include-Dateien, wo ich nicht weiß welche ich includieren muss: 1. stm32f103x6.h 2. stm32f103xb.h Wofper steht hier das x jeweils? Welche muss ich nehmen?
DB: 7 Ordering information scheme Pin count T = 36 pins C = 48 pins R = 64 pins V = 100 pins
Hallo Gast,
ich habe 64 Pins, müsste also R sein. Aber das hilft mir nicht weiter ob
ich
1. stm32f103x6.h
oder
2. stm32f103xb.h
nehmen muss.
Habe es dann einfach getestet, bei stm32f103x6.h gab es einen Fehler in
main.c
>Symbol 'SysTick_IRQn' could not be resolved.
Bei der anderen Datei konnte ich ohne Fehler kompilieren.
.elf-Datei habe ich nun angehängt.
Wo sehe ich den Build-Log?
Wenn da schon DB (wie Datenblatt) nebst Kapitelnummer steht... Logischerweise steht da auch was "6" und "B" ist. So wird das nichts mit Dir. Wissen kann man nicht durch Rumprobieren ersetzen.
So krass wollte ich es nicht sagen, aber die Speicheraufteilung sollte schon bekannt sein. Wenn Du eine .lst Datei erstellst kannst Du den Programmverlauf mit den Speicheradressen nachvollziehen. Deshalb auch meine Frage nach der Ausführung im RAM.
Hi, habe das Datenblatt im Kapitel 7 gesehen, aber das half mir bei der Auswahl der include-Datei nicht weiter. Mein ARM ist STM32F103RBT6 Da könnte stm32f103x6.h also passen, wenn man das x als 'RBT' interpretiert. stm32f103xb.h könnte aber auch passen, wenn man x als R interpretiert und Package und 'Temperatur range' wegdenkt. Woher soll ich denn bitte wissen, wonach die Include-Datei benannt wird? Mit Package und Temperatuer range Informationen oder ohne. Und fragen hat ja noch nie geschadet - oder?
T.Baumbach schrieb: > Habe es dann einfach getestet, bei stm32f103x6.h gab es einen Fehler in > main.c Wenn dein Controller STM32F103R*B*T6 heißt, kann es doch nur die stm32f103x*b*.h sein, und nicht die stm32f103x*6*.h ... das "x" steht für "egal". T.Baumbach schrieb: > .elf-Datei habe ich nun angehängt. Die .elf Datei ist quasi leer, enthält weder ISR-Vektor noch Startup-Code noch main()-Funktion. Kein Wunder dass der Controller sofort abstürzt beim ausführen. Du hast vermutlich vergessen, die startup_XXX.S mit zu kompilieren. Sie muss .S und nicht .s heißen damit eclipse sie erkennt. > Wo sehe ich den Build-Log? Im Reiter "Console" in Eclipse.
>aber die Speicheraufteilung sollte schon bekannt sein. Soweit bin ich ja noch nicht. Ich habe das Tutorial durchgeführt um mit Eclipse erst mal eine lauffähige Umgebung zu erstellen. Mit dem Blink-Testprogramm wollte ich mich dann in die ARM-Programmierung einarbeiten. Was nutzt mir bitte das theoretische Wissen, wenn ich es nicht in der Praxis testen kann? Klar kann ich wieder CooCox nehmen, aber da wird halt soviel versteckt, was interessant ist. Wie kann ich bitte die .lst-Datei erstellen? Und woher bekomme ich das Build-Log um es hier zu posten? Danke!
T.Baumbach schrieb: > Und woher bekomme ich das Build-Log um es hier zu posten? In deinem allerersten Screenshot sieht man den Build log unten im Fenster. Da wo "Incremental Build of..." steht. Leider ist er nicht vollständig, weil du vorher schon mal kompiliert hattest. Klicke mit der rechten Maustaste auf das Projekt links und dann auf "Clean Project", und kompiliere erneut (Hammer-Symbol), und dann erscheint der komplette Build-Log in eben diesem Fenster.
T.Baumbach schrieb: > Wie kann ich bitte die .lst-Datei erstellen? Aus oben genannten Gründen funktioniert das sowieso nicht. Normal wird das in eclipse beim linker eingestellt, von der Kommandozeile:
1 | arm-none-eabi-objcopy -S CubeMXTest.elf > CubeMXTest.lst |
Dir fehlen aber die linker und startup Einstellungen.
Hallo, @Programmierer: >Die .elf Datei ist quasi leer, enthält weder ISR-Vektor noch Startup-Code noch main()-Funktion. Kein Wunder dass der Controller sofort abstürzt beim usführen. Du hast vermutlich vergessen, die startup_XXX.S mit zu kompilieren. Sie muss .S und nicht .s heißen damit eclipse sie erkennt. Das war das Problem, jetzt läuft alles und meine grüne LED blinkt. Danke! Das Programm läuft also, zumindest, wenn man das per ST-Link Utility überträgt. Jetzt werde ich mich erstmal damit beschäftigen, den OpenOCD Debugger ans Laufen zu bekommen. Ihr habt mir sehr geholfen, werde mich dann mal einlesen, habe hier dazu das Buch ARM CORTEX-M3 MIKROCONTROLLER 'EINSTIEG UND PRAXIS' liegen. Ist zwar für Atmel Cortex-M3 aber vieles kann ich sicher übernehmen. Danke nochmals an alle!
Sorry, habe oben einen Fehler gemacht. Es ist nicht objcopy zum .lst erstellen, sondern:
1 | arm-none-eabi-objdump -S CubeMXTest.elf > CubeMXTest.lst |
oder
1 | arm-none-eabi-objdump -h -S CubeMXTest.elf > CubeMXTest.lst |
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.