SWD-Zugriff funktioniert nur über ProgrammerSocket

OP #8081045
Lesenswert?

Hallo liebe Community,

ich wollte den STM32L151RDT6 von einer bestückten Platine auslesen.
Auf der Platine gibt es Pads um den ST-Link zu verbinden.
Von den Pads gibt es Durchgang zu den Beinchen vom STM32.

Nachdem ich die Pads mit dem ST-Link verbunden hatte, wollte ich den Chip mit dem STM32CubeProgrammer auslesen.
Ich habe alle vorhandenen Modi (Normal, Hot plug, Under reset, ...) sowie "Reset Mode" (Software reset, Hardware reset, Core reset) versucht.
In keinem Fall konnte ich eine Verbindung zum STM32 herstellen.

Nachdem ich mehrere identische Platinen habe, habe ich von einer den STM32 ausgelötet und in einen "ProgrammerSocket" eingelegt.
Anschließend habe ich die PINs mit dem ST-Link verbunden und konnte den Chip direkt verbinden und auslesen (RDP Level 0).

Ich verstehe allerdings nicht, weshalb das beim bestückten Board nicht funktioniert hat.
Zusammen mit Claude hatte ich versucht eine Antwort auf diese Frage zu finden, allerdings sind wir beide am Ende unseres Lateins angelangt.

Zur Platine:
Die Platine selbst wird mit 3x AA-Batterien mit Strom versorgt.
Für die Programmierung/Konfiguration gibt es einen zusätzlichen USB-Anschluss.
Die Platine wird aktiv, wenn ein Knopf gedrückt wird (dann leuchten die LEDs für ein paar Sekunden und gehen kurz darauf wieder aus).
Wird das USB-Kabel angeschlossen bleiben die LEDs aktiv.
(Ich habe sowohl mit angeschlossenem USB-Kabel als auch ohne keine Verbindung herstellen können.)

Claude hatte mir dieses Forum empfohlen, da hier viele Experten unterwegs sind - vielleicht hat jemand von euch eine Idee, warum das mit der Verbindung beim verlöteten Chip nicht klappt.
Danke euch :)

Grüße
Lars

: Bearbeitet durch User
#8081050
Lesenswert?

Da dein Claude und du am Ende bist habe ich das für dich mal in ChatGPT gesteckt. Falls das nicht von ChatGPT gelöst wird kann ich das Ticket eskalieren und eine Taskforce mit Gemini, Siri, Copiliot, DeepSeek und LeChat sowie das ausgezeichnete Llama 3.1 8B in die Wege leiten.

Erstmal den ChatGPT-Experten zu Wort kommen lassen:

Nach deiner Beschreibung gibt es einige plausible Erklärungen. Der entscheidende Befund ist:

Der STM32 selbst ist in Ordnung, denn ausgelötet lässt er sich problemlos auslesen (RDP Level 0). Die SWD-Pins sind elektrisch verbunden, denn du hast Durchgang bis zum Controller gemessen. Das Problem entsteht also erst durch die restliche Schaltung auf der Platine.

Die wahrscheinlichsten Ursachen sind:

Ein anderes Bauteil treibt SWDIO oder SWCLK. (Am wahrscheinlichsten) SWDIO ist bidirektional. Wenn dort ein anderes IC, ein Display, ein Funkmodul oder Logikbaustein aktiv ist, kann der ST-Link keine Kommunikation aufbauen. Eine Durchgangsprüfung erkennt so etwas nicht. NRST wird von der Schaltung festgehalten. Wenn der Reset-Pin durch Supervisor-ICs oder andere Schaltungsteile beeinflusst wird, funktioniert selbst "Under Reset" oft nicht. BOOT0 oder Option Bytes sind nicht das Problem. Da der Chip nach dem Auslöten ohne Probleme erreichbar ist, kann man das praktisch ausschließen. Die Versorgung ist nicht so, wie der ST-Link sie erwartet. Der ST-Link misst VTarget. Wenn VDD instabil ist oder nur kurz anliegt (weil die Platine nach einigen Sekunden abschaltet), kommt keine Verbindung zustande. Der Debug-Port wird von der Firmware deaktiviert. Das ist beim STM32L1 zwar möglich, aber normalerweise verhindert "Connect under Reset" genau dieses Problem. Da auch dieser Modus nicht funktioniert, halte ich das für weniger wahrscheinlich. Die Pads sind nicht direkt mit SWD verbunden. Manche Hersteller führen zwar Testpads heraus, diese gehen aber über 0-Ω-Widerstände oder Lötbrücken. Es kann sein, dass zwar Durchgang besteht, die Leitung aber zusätzlich noch an andere Schaltungsteile angeschlossen ist. Was ich als Nächstes prüfen würde Oszilloskop an SWCLK und SWDIO. Sendet der ST-Link überhaupt Takte? Werden die Pegel von einem anderen Baustein heruntergezogen? NRST messen. Bleibt NRST dauerhaft High? Kann der ST-Link den Pin wirklich auf Low ziehen? Versorgung messen. Liegen während des Verbindungsversuchs stabile 3,0–3,3 V am STM32 an? Schaltplan oder Fotos der Platine ansehen. Oft erkennt man sofort, dass SWD-Leitungen noch an andere Bauteile angeschlossen sind. Was ich für die wahrscheinlichste Ursache halte

Wenn ich nur anhand deiner Beschreibung wetten müsste, würde ich auf ein anderes Bauteil auf der Platine tippen, das die SWD-Leitungen beeinflusst oder aktiv treibt. Das erklärt exakt, warum:

derselbe Controller ausgelötet problemlos funktioniert, RDP Level 0 vorliegt, aber auf der Platine überhaupt keine SWD-Verbindung zustande kommt.

Mich würde noch interessieren:

Um welche Platine handelt es sich (Fotos Vorder- und Rückseite)? Welche Spannung misst du direkt an VDD des STM32? Welchen ST-Link verwendest du (V2, V2-1 oder V3)?

Mit diesen Informationen lässt sich die Ursache meist deutlich eingrenzen.

: Bearbeitet durch User
OP #8081085
Lesenswert?

Guten Morgen zusammen ☕

vielen Dank für eure Antworten

N. B. schrieb:

Mich würde noch interessieren:

Um welche Platine handelt es sich (Fotos Vorder- und Rückseite)?
Welche Spannung misst du direkt an VDD des STM32?
Welchen ST-Link verwendest du (V2, V2-1 oder V3)?

Mit diesen Informationen lässt sich die Ursache meist deutlich eingrenzen.

Wow, das sind viele Ansätze die sehr spannend klingen.
Mit den einzelnen Punkten / Messungen werde ich mich später befassen.

Die Platine ist von einem elektronischen Türschloss, da habe ich bei eBay-Kleinanzeigen ein paar gekauft und würde gerne genauer verstehen wie du funktionieren.
Auf der Rückseite sind nur noch die Halter für die Batterien und die zwei Lötpunkte für die Antenne, daher habe ich dir nur die Vorderseite hochgeladen.
Wenn es dir hilft, dann könnte ich dir noch markieren, was PIN 1 ist und welche "Funktionen" die einzelnen goldenen Pads an der Oberenkante haben.

Die Spannung an VDD muss ich die nachliefern, da muss ich erst messen.

Ich habe den ST-Link V2.

Wastl schrieb:

Lars schrieb:

vielleicht hat jemand von euch eine Idee, warum das mit der Verbindung beim verlöteten Chip nicht klappt.

Es besteht ein Schaltungsfehler in deiner fertigen Schaltung.
Das festzustellen braucht es keine KI.

Ganz so einfach ist es leider nicht, denn die Platine selbst funktioniert :)

Jük P. schrieb:

Lars schrieb:

STM32L151RDT6 von einer bestückten Platine auslesen.

STM32L151RDT6 hat Schreibschutz aktiv) hE HA

Ob der einen Schreibschutz aktiv hat weiß ich nicht.
Mir ging es um's lesen und warum das nicht funktioniert.
Das bei mehreren identischen Platinen die Chips anders programmiert sein sollen, kann ich mir fast nicht vorstellen.

Angehängte Dateien:
#8081131
Lesenswert?

Lars schrieb:

Wenn es dir hilft, dann könnte ich dir noch markieren, was PIN 1 ist und welche "Funktionen" die einzelnen goldenen Pads an der Oberenkante haben.

Nett gemeint, ist aber nicht zwingen nötig.

NRST Pin 7, BOOT0 Pin 28, Pins 49/50 sind SWD, links von der USB Buchse, erste Reihe Pads, die zwei unteren goldenen Pads sind SWD.

Zeig mal ein Bild der Platine ohne MCU.

Das Dump der Firmware könnte man sich auch Anschauen, eventuell hat Pin 14 = PA0/WKUP1 einen Einfluss, hängt an einer MELF Diode (?) dessen Leiterbahn unter dem MCU verschwindet.

OP #8081182
Lesenswert?

Kilo S. schrieb:

Lars schrieb:

Wenn es dir hilft, dann könnte ich dir noch markieren, was PIN 1 ist und welche "Funktionen" die einzelnen goldenen Pads an der Oberenkante haben.

Nett gemeint, ist aber nicht zwingen nötig.

NRST Pin 7, BOOT0 Pin 28, Pins 49/50 sind SWD, links von der USB Buchse, erste Reihe Pads, die zwei unteren goldenen Pads sind SWD.

Zeig mal ein Bild der Platine ohne MCU.

Das Dump der Firmware könnte man sich auch Anschauen, eventuell hat Pin 14 = PA0/WKUP1 einen Einfluss, hängt an einer MELF Diode (?) dessen Leiterbahn unter dem MCU verschwindet.

Ich habe mir zu den einzelnen PADs andere Bezeichnungen dazu geschrieben, vielleicht bin ich da mit dem PIN 1 durcheinander gekommen :|
Das muss ich jetzt noch einmal durchschauen...

Hier erst einmal das Bild ohne MCU.

Angehängte Dateien:
#8081199
Lesenswert?

Die "O"s sind die Pads entsprechend dem Bild 003.jpg, daneben die Nummerierung für die "O"s. Das was man daraus erkennen kann sollte das hier sein (ohne Garantie, nur auf die Schnelle geschaut):

1
O O O O   0 1 2 3
2
O O O O   4 5 6 7 
3
    O O       8 9
4

5
0
6
1
7
2
8
3  PB3  - JTDO
9
4
10
5
11
6  PA13 - JTMS-SWDIO 
12
7  PA15 - JTDI
13
8
14
9  PA14 - JTCK-SWCLK
OP #8081205
Lesenswert?

Dieter S. schrieb:

Die "O"s sind die Pads entsprechend dem Bild 003.jpg, daneben die Nummerierung für die "O"s. Das was man daraus erkennen kann sollte das hier sein (ohne Garantie, nur auf die Schnelle geschaut):

Das würde zu meinem Bild passen :)

N. B. schrieb:

Mich würde noch interessieren:

Um welche Platine handelt es sich (Fotos Vorder- und Rückseite)? Welche Spannung misst du direkt an VDD des STM32? Welchen ST-Link verwendest du (V2, V2-1 oder V3)?

Ich habe jetzt auch wegen der Spannung geschaut.
Egal ob direkt am Chip oder an den Pads, es sind immer ca. 3 V.

Angehängte Dateien:
#8081363
Lesenswert?

Und wie lange bleibt das Gerät an wenn man den roten Knopf drückt? Falls das länger als ein paar Sekunden ist dann bitte die Messung an NRST wiederholen (mit/ohne Widerstand) wenn das Gerät an ist.

Wenn es nur für einen kurzen Moment an ist: eventuell funktioniert der Zugriff mit dem ST-Link wenn man es zum richtigen Zeitpunkt nach dem Einschalten versucht.

: Bearbeitet durch User
OP #8081368
Lesenswert?

Dieter S. schrieb:

Und wie lange bleibt das Gerät an wenn man den roten Knopf drückt? Falls das länger als ein paar Sekunden ist dann bitte die Messung an NRST wiederholen (mit/ohne Widerstand) wenn das Gerät an ist.

Wenn es nur für einen kurzen Moment an ist: eventuell funktioniert der Zugriff mit dem ST-Link wenn man es zum richtigen Zeitpunkt nach dem Einschalten versucht.

Wenn man das USB-Kabel anschließt, dann bleibt die Platine länger an.
Ansonsten nur sehr kurz.

Reset zu GND (ohne Widerstand mit USB-Kabel): 0,4V Reset zu Gnd (mit 4,7 kOhm und USB-Kabel): 0,15V

Das mit dem "Verbinden beim Einschalten" hatte ich mehrfach versucht, leider ohne Erfolg.

#8081375
Lesenswert?

Benedikt H. schrieb:

Was auch noch sein kann: SWD ist eigentlich ganz aus. Aber wenn die Firmware einen argen Fehler vorfindet (z.B. PN5180A "nicht da") macht sie SWD für Service auf. Wäre nicht das erste Mal, ist selbst in PayTv-Receivern schon passiert :D (dBox2, wer sich noch erinnert)

Das könnte man relativ einfach prüfen wenn der TO die Firmware hier hochlädt.

#8081464
Lesenswert?

Lars schrieb:

Die Platine ist von einem elektronischen Türschloss, da habe ich bei eBay-Kleinanzeigen ein paar gekauft und würde gerne genauer verstehen wie du funktionieren.

Da du erfolgreich die Firmware bereits vom Chip extraiert hast kannst eigentlich aufhören und jetzt das ganze durch Ghidra jagen zum verstehen was die machen.

Debug direkt auf der Platine ist da erstmal nicht relevant. Das wird erst später wieder wichtig sobald du mit dem ersten Blick auf den Firmware dumb durch bist.

Für die Platine: Hohl dein Oszi raus. Einmal sämtliche Datenleitungen und die Spannungsversorgung direkt am STM32 messen. Dann sieht man relativ schnell was los ist bzw. ob die Signale des Debuggers ankommen.

#8081656
Lesenswert?

Dieter S. schrieb:

Auf den ersten Blick gibt es in der Firmware nichts auffälliges das SWD deaktivieren würde.

Bei der Konfiguration über USB ist es übrigens möglich die Readout Protection des STM32 zu aktivieren, das wurde aber offensichtlich bei den Platinen (noch) nicht gemacht.

Gibts da potenziell einen Pinmux mit dem die Pins umgepinnt werden können?

Mir wurde woanders mal auf dem Weg ein SWD zugemacht. hatte aber glück dass der Code von externem Flash kam wodurch ich das ausknipsen konnte um mittels Debugging weiteres Verständnis der gedumpten Firmware zu bekommen.

Edit: @Lars: hier bitte auch einmal den Link

: Bearbeitet durch User

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren