Forum: Mikrocontroller und Digitale Elektronik Eclipse OpenOCD STM32 Nucleo F1 blinkt nicht


von T.Baumbach (Gast)


Angehängte Dateien:

Lesenswert?

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!

von hp-freund (Gast)


Lesenswert?

Warum von der Konsole?

Probiere mal:

run

oder

continue

von T.Baumbach (Gast)


Angehängte Dateien:

Lesenswert?

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 :-(

von T.Baumbach (Gast)


Lesenswert?

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...

von hp-freund (Gast)


Lesenswert?

T.Baumbach schrieb:
> undefined debug reason 7 - target needs reset

von T.Baumbach (Gast)


Lesenswert?

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)

von T.Baumbach (Gast)



Lesenswert?

...

außerdem sehe ich, wenn ich CubeMXtest Debug anklicke unten:

>Function "main" not defined.

(siehe Screenshot)

von hp-freund (Gast)


Lesenswert?

Was hast Du für eigenartige PC Adressen?

Ausführung im RAM?

Alles etwas merkwürdig.

von T.Baumbach (Gast)


Lesenswert?

Hallo hp-freund,

> Ausführung im RAM?

Wo siehst Du das denn bitte?

Und wo wird das eingestellt? In den Debugger-Settings?

von Programmierer (Gast)


Lesenswert?

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...

von T.Baumbach (Gast)


Lesenswert?

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?

von T.Baumbach (Gast)


Lesenswert?

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?

von Programmierer (Gast)


Lesenswert?

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.

von Programmierer (Gast)


Lesenswert?

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.

von T.Baumbach (Gast)


Lesenswert?

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?

von Programmierer (Gast)


Lesenswert?

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.

von T.Baumbach (Gast)


Lesenswert?

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?

von ./. (Gast)


Lesenswert?

DB: 7  Ordering information scheme

Pin count
T = 36 pins
C = 48 pins
R = 64 pins
V = 100 pins

von T.Baumbach (Gast)


Angehängte Dateien:

Lesenswert?

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?

von ./. (Gast)


Lesenswert?

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.

von hp-freund (Gast)


Lesenswert?

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.

von T.Baumbach (Gast)


Lesenswert?

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?

von Programmierer (Gast)


Lesenswert?

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.

von T.Baumbach (Gast)


Lesenswert?

>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!

von Programmierer (Gast)


Lesenswert?

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.

von hp-freund (Gast)


Lesenswert?

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.

von T.Baumbach (Gast)


Lesenswert?

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!

von hp-freund (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.