Forum: Mikrocontroller und Digitale Elektronik STM32 mit J-Link hält nicht an Breakpoints


von Lars (Gast)


Lesenswert?

Hallo,

mein Projekt benutzt einen STM32F7 auf einer eigenen Platine. Bisher 
habe ich ein Nucleo mit ST-Link und SWD benutzt, aber mit dem Umzug auf 
meine eigene Platine funktioniert das Anhalten an Breakpoints nicht 
mehr.

Daraufhin bin ich zu Atollic Studio und J-Link gewechselt, aber das 
Problem tritt auch dort auf: Flashen funktioniert, aber beim Debuggen 
wird bei Erreichen eines Breakpunktes nur eine Fehlermeldung ausgegeben:
1
...
2
ERROR: Can not read register 43 (FPS10) while CPU is running
3
ERROR: Can not read register 44 (FPS11) while CPU is running
4
ERROR: Can not read register 45 (FPS12) while CPU is running
5
ERROR: Can not read register 46 (FPS13) while CPU is running
6
ERROR: Can not read register 47 (FPS14) while CPU is running
7
ERROR: Can not read register 48 (FPS15) while CPU is running
8
ERROR: Can not read register 49 (FPS16) while CPU is running
9
...

Ich benutze ein originales J-Link EDU. Mein Debug-Skript (generiert) 
sieht so aus:
1
# Default GDB command file (FLASH) for SEGGER J-LINK and STMicroelectronics STM32F722ZC microcontroller.
2
# Set character encoding
3
set host-charset CP1252
4
set target-charset CP1252
5
# Set JTAG speed to 30 kHz
6
monitor speed 30
7
# Set GDBServer to little endian
8
monitor endian little
9
# Reset the chip to get to a known state.
10
monitor reset
11
# Set auto JTAG speed
12
monitor speed auto
13
# Setup GDB FOR FASTER DOWNLOADS
14
set remote memory-write-packet-size 1024
15
set remote memory-write-packet-size fixed
16
# Enable flash download
17
monitor flash download = 1
18
# Load the program executable
19
load    
20
# Reset the chip to get to a known state. Remove "monitor reset" command 
21
#  if the code is not located at default address and does not run by reset. 
22
monitor reset
23
# Set a breakpoint at main().
24
tbreak main
25
# Run to the breakpoint.
26
continue

Ich benutze SWD mit zwei Leitungen, ohne Tracing. Der Konnektor 
entspricht den ST-Links auf Nucleo-Boards, also Vtref, SWDIO, SWCLK, 
NRST, GND.

Ist das ein generelles Problem mit meiner Platine oder nur ein 
Konfigurationsproblem?

von Lars (Gast)


Lesenswert?

Noch eine Anmerkung: Es sieht ja so aus, als ob die CPU nicht gestoppt 
werden könnte. Muß man bei den Interrupts und deren Prioritäten etwas 
beachten?

von Lars (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist das ganze Debug-Log, inkl. des Anfangs.

von Neverever (Gast)


Lesenswert?

SWDIO hat zwar einen internen Pullup, aber Segger empfiehlt trotzdem 
einen externen. Hast Du den dran?

Schaltplan fehlt!

von Lars (Gast)


Angehängte Dateien:

Lesenswert?

Neverever schrieb:
> SWDIO hat zwar einen internen Pullup, aber Segger empfiehlt trotzdem
> einen externen. Hast Du den dran?

Nein, dass kann ich gleich ausprobieren. Wobei das Flashen und das 
geflashte Programm ja problemlos funktionieren.

> Schaltplan fehlt!

Ja, hier ist der Anschluß für SWD. Die Leitungen gehen direkt zur MCU. 
Habe es mit und ohne dem eingezeichneten Pull-up an RESET ausprobiert.

Noch ein Hinweis: Der automatisch generierte Breakpoint in main() 
funktioniert, nur die von mir gesetzten nicht.

von Lars (Gast)


Angehängte Dateien:

Lesenswert?

Der Pullup bewirkt leider gar nichts.

Noch eine Beobachtung: Wenn ich weitere Breakpunkte in main() oder 
direkt aufgerufenen Funktionen setze, funktionieren diese wie gewohnt.

Nur wenn ich Breakpunkte in von EXTI Interrupts ausgelösten Funktionen 
setze, kommt es zu oben geschildertem Fehler.

Daher nochmal meine Frage: Kann es an den Einstellungen zu IRs und deren 
Prios liegen? Meine Konfiguration ist anbei.

von 123 (Gast)


Lesenswert?

Hallo,

ggf ist der debugmode der CPU von swd auf jtag umgestellt worden. (je 
nach CPU verwendet JTAG die gleichen pins wie SWD)
Die kleinen STM32 haben da ein paar register die das steuern. ggf die 
grossen auch.

Flashen geht, ... debuggen im startup Code auch bis zu ner bestimmten 
stelle dann ist ende. kann man ggf in den codegeneratoren von ST 
einstellen.

gruss

von Lars (Gast)


Lesenswert?

123 schrieb:
> ggf ist der debugmode der CPU von swd auf jtag umgestellt worden. [...]
> kann man ggf in den codegeneratoren von ST
> einstellen.

Das klingt zwar sehr zielführend, aber ich habe ein solches Register 
nicht in der Referenz finden können. Wo soll man das umstellen können - 
im Compiler?!

von 123 (Gast)


Lesenswert?

Hab grad mal den 1400 seiten Schmöker angelsen.
Es gibt anscheinend keine register die das steuern. beim F7 wird das 
über eine startup sequenz gemacht. Kapitel 34.3 SWJ debug port und 
folgend.

ggf pfuscht ein nReset da mit rein. und setzt etwas bei der erkennung 
zurück?

Prüf auch noch mal die Pin configuration für PA13 und PA14. da digbt es 
noch was mit eventout als alternativ function für die Pins. ggf wird 
umkonfiguriert und dann ist der SWD tot.

gruss

von Lutz (Gast)


Lesenswert?

Welche Hardware Version hat der j-link? Muss mindestens V9 sein.

von Lars (Gast)


Lesenswert?

Lutz schrieb:
> Welche Hardware Version hat der j-link? Muss mindestens V9 sein.

SEGGER J-Link Commander V6.34a (Compiled Aug  8 2018 16:31:54)
DLL version V6.34a, compiled Aug  8 2018 16:31:24

Connecting to J-Link via USB...O.K.
Firmware: J-Link V10 compiled Jul 23 2018 09:53:14
Hardware version: V10.10

von Lars (Gast)


Lesenswert?

123 schrieb:
> Es gibt anscheinend keine register die das steuern. beim F7 wird das
> über eine startup sequenz gemacht. Kapitel 34.3 SWJ debug port und
> folgend.

Ja, das habe ich auch gelesen.

> Prüf auch noch mal die Pin configuration für PA13 und PA14. da digbt es
> noch was mit eventout als alternativ function für die Pins. ggf wird
> umkonfiguriert und dann ist der SWD tot.

OK, aber was soll ich da überprüfen? Die werden beide als SYSxxx 
konfiguriert und nicht wieder geändert.

von Daniel V. (voda) Benutzerseite


Lesenswert?

Ganz doof gefragt: Sind Deine Timer richtig konfiguiert? Dieses Problem 
hatte ich auch mal mit einem STM32F4 und Keil mit einem original 
STLink/V2 und den Umstieg vom Nucleo auf eigener PCB. Bei mir war das 
der externe Quarz.

Gruß
Daniel

: Bearbeitet durch User
von Lars (Gast)


Lesenswert?

Daniel V. schrieb:
> Ganz doof gefragt: Sind Deine Timer richtig konfiguiert? Dieses Problem
> hatte ich auch mal mit einem STM32F4 und Keil mit einem original
> STLink/V2 und den Umstieg vom Nucleo auf eigener PCB. Bei mir war das
> der externe Quarz.

Was ist denn "richtig"? :-) Und welche Timer genau? Ich verwende nur 
SysTick, dessen IR eine niedrigere Prio hat als der IR meiner Funktion, 
die debuggen will und nicht kann.

von Lars (Gast)


Lesenswert?

Um die Fehlersuche etwas einzugrenzen nochmal etwas zum Kontext.

Diesen Hält-nicht-an-manchen-Breakpoints hatte ich schon einmal, und 
zwar auf einem Nucleo-Board mit ST-Link. Auch damals habe ich den Fehler 
nicht gefunden, sondern bin auf eine ältere Version meines Codes 
zurückgegangen, wo dieser Fehler noch nicht auftrat. Beim 
Weiterentwickeln der alten Version trat das Problem nicht mehr auf, bis 
jetzt.

Es wäre ein komischer Zufall, wenn es jetzt an J-Link liegen würde, oder 
meinem Board.

Leider kann ich diesmal auf keine ältere Version zurückgreifen, da dies 
die erste Version für das Board ist.

von Bastian (Gast)


Lesenswert?

Hi,

vielleicht eine doofe frage, der Jlink ist original?
Sehr ähnliche Probleme hatte/habe ich mit einem Clone weshalb dieser in 
die Tonne wandert.

Nucleoboard mit Jlink-Firmeware läuft tadellos.

von Dr. Sommer (Gast)


Lesenswert?

Was passiert wenn du einen manuellen Breakpoint machst?
1
__asm__ volatile ("bkpt");

von Lars (Gast)


Lesenswert?

Bastian schrieb:
> vielleicht eine doofe frage, der Jlink ist original?

Ja, ist J-Link EDU.

von Lars (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Was passiert wenn du einen manuellen Breakpoint machst?
>
1
__asm__ volatile ("bkpt");

Genau das gleiche, also ERROR: Can not read register 15 (R15) while CPU 
is running. :-(

von 123 (Gast)


Lesenswert?

Hallo

SYS ist OK aber AF0 oder AF15? AF0 ist OK AF15 nicht.

Segger und Cortex können nur eine begrenzte anzahl an breakpoints. 
werden mehr eingestellt, läuft der einfach drüber. die CDT meckert dann.

Kannst du deinen code überhaupt debuggen? ggf mal versuchen stück für 
stück durch den code zu gehen und rauszubekommen wo die kiste 
wegschmiert. wenn es reproduzierbar ist. aber dabei aufpassen das du nur 
eine begrenzte anzahl an breakpoints hast.
- treten irgendwelche exceptions auf die einen reset auslösen.
- watch dog ist hoffentlich nicht scharfgeschalten ( böse beim debuggen)
- pin reconfiguration siehe oben
- clock umstellungen die daneben gehen
- Pll configurationen die nicht funktioniert hat

Funktioniert auch der halt aus der IDE nicht?

von Lars (Gast)


Lesenswert?

123 schrieb:
> Hallo

Herzlichen Dank für Deine Ideen! Ich habe dabei etwas ganz grundlegendes 
herausgefunden.

Der oben beschriebe Fehler tritt nicht bei Erreichen eines Breakpoints 
auf, sondern einfach bei Erreichen einer gewissen, unbekannten Stelle!

Im TrueStudio wird kein BP angezeigt, ich habe den STM32 mit dem J-Link 
Commander komplett "erased" und neu geflasht. Ich denke also, daß keine 
BP mehr gesetzt sein dürften - trotzdem der Fehler.

Das macht die Sache für mich aber noch misteriöser ...

Wenn ich das Programm nicht im Debug-Modus ausführe, hängt mein Programm 
an vermutlich der gleichen Stelle, weswegen ich ja debuggen wollte.

> Kannst du deinen code überhaupt debuggen? ggf mal versuchen stück für
> stück durch den code zu gehen und rauszubekommen wo die kiste
> wegschmiert.

Im Debug-Modus bin ich vom BP in main.c mal weitergesteppt. Mein Code 
sieht so aus:
1
int main(void)
2
{
3
  SCB_EnableICache();
4
  SCB_EnableDCache();
5
  HAL_Init();

Ich bin in SCB_EnableDCache hängen geblieben, ohne Fehlermeldung, aber 
mein grüner Balken im Code war einfach weg. Debug-Modus war an, aber 
Single Step oder ||-Knopf funktionierte nicht.

Aber die eigentlich Frage ist: Wie kann Code einen Debugger so aus dem 
Konzept bringen, daß er sich aufhängt? Was sollte ich im Debugger 
vielleicht deaktivieren? (So viele Optionen hat Atollic da nicht.)

von Opti Mator (Gast)


Lesenswert?

Lars schrieb:
> Aber die eigentlich Frage ist: Wie kann Code einen Debugger so aus dem
> Konzept bringen, daß er sich aufhängt?

Frage mal die Optimierungs-Stufen deines Projekts für den Compiler.

Wegg-optimierte Code-Zeilen können schlecht "ge-breakt" werden.
(wegg vs Weg)

von Lars (Gast)


Lesenswert?

Opti Mator schrieb:
> Frage mal die Optimierungs-Stufen deines Projekts für den Compiler.
>
> Wegg-optimierte Code-Zeilen können schlecht "ge-breakt" werden.
> (wegg vs Weg)

Bringt nix. War -Os für Compiler und -g für Debugger.

Habe jetzt auch -Og und -g3 ausprobiert, kein Erfolg.

von Lars (Gast)


Lesenswert?

123 schrieb:
> Prüf auch noch mal die Pin configuration für PA13 und PA14. da digbt es
> noch was mit eventout als alternativ function für die Pins. ggf wird
> umkonfiguriert und dann ist der SWD tot.

*ARRRGHH!* Ich bin so dumm, und ihr so clever!

Natürlich steht in meinem Code ganz verschämt
1
GPIOA->ODR = data;
2
GPIOA->MODER = DATA_MODER;

und irgendwo anders
1
#define DATA_MODER   0x00005555

was die SWD-Pins plattmacht.  m)

Fall gelöst! Herzlichen Dank an alle, die die Geduld mit mir nicht 
verloren haben. :-)

von Opti Mator (Gast)


Lesenswert?

Lars schrieb:
> Fall gelöst! Herzlichen Dank an alle, die die Geduld mit mir nicht
> verloren haben. :-)

Du wolltest ja nur dass wir in diesem Sommerloch nicht gänzlich
geistig dahinsiechen.

von Johannes S. (Gast)


Lesenswert?

Lars schrieb:
> *ARRRGHH!*

Danke für die Aufklärung, man hätte die Nachwelt ja auch dumm sterben 
lassen können.
Da der Breakpoint beim main() noch funktionierte hätte man sich doch 
auch an die Stelle vorarbeiten können an der der Debugger sich abklemmt?
Bei einigen µC sägt man sich auch bei einigen deep sleep Modi ab, das 
könnte vielleicht auch mal ausgelöst werden ohne das man damit rechnet.

von 900ss (900ss)


Lesenswert?

Lars schrieb:
> Fall gelöst

Freut mich.
Schöner Fehler, wer kennt ähnliches nicht? :-)

von Lars (Gast)


Lesenswert?

Johannes S. schrieb:
> Da der Breakpoint beim main() noch funktionierte hätte man sich doch
> auch an die Stelle vorarbeiten können an der der Debugger sich abklemmt?

Schwierig, da außer der Initialisierung alles Interrupt-getrieben ist, 
und das Debuggen schon nach dem ersten Interrupt kaputt 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
Noch kein Account? Hier anmelden.