STM32 & ST-LINK - Nach erfolgreicher Programmierung kann keine Verbindung zur MCU hergestellt werden

13

Ich habe mein eigenes Board mit STM32F7-45VGT6 gebaut. Ich habe es erfolgreich mit ST-LINK v2 programmiert (allerdings nicht mit dem Original) und kann jetzt nicht einmal eine Verbindung mit der MCU herstellen.

Ich verwende das ST-Link-Dienstprogramm von der ST- und SWD-Schnittstelle. Es kann vorkommen, dass ich SWD-Pins als Ausgabe verwende und sie in meinem Code als GPIO-Ausgabe einstelle. Kann es der Fall sein?

Trotzdem verbinde ich meinen Reset-Pin mit GND und setze im ST-Link-Dienstprogramm die Option "Unter Reset verbinden", aber es funktioniert nicht ... Was kann ich tun?

Im Internet habe ich etwas über die Verwendung von BOOT0 Pin gefunden, aber ich weiß nicht genau ...

zupazt3
quelle
"Es kann der Fall sein, dass ich SWD-Pins als Ausgabe verwende", das ist möglich, aber der einzige, der es wissen würde, sind Sie, es sei denn, Sie meinen eine beschädigte Ladung einer Firmware, die dies nicht absichtlich tut, sondern möglicherweise als Folge von der Fehler, der tatsächlich passiert. Im Allgemeinen kann dies wiederhergestellt werden, indem die anfängliche SWD-Verbindung mit dem aktivierten Hardware-Reset entweder manuell oder automatisch durchgeführt wird. Wenn Sie die SWD-Pins als E / A verwenden möchten, die einige Sekunden verzögert werden, bevor Sie diese Einstellung vornehmen, kann dies die Entwicklung erleichtern. Beachten Sie jedoch, dass Sie den Debugger dennoch nicht verwenden können.
Chris Stratton

Antworten:

20

Ich habe es geschafft, dieses Problem zu lösen. Wenn jemand auf ein ähnliches Problem stößt, habe ich Folgendes getan:

Ich habe ST-Link v2 und ST-Link Utility verwendet. In der Einstellung stelle ich "Connect under Reset" und die SWD-Schnittstelle ein (ich bin mir über die Frequenz nicht sicher).
Dann drücke ich die Reset-Taste auf meinem Board und klicke auf "Ziel" -> "Chip löschen". Kurz nach dem Klicken habe ich die Taste losgelassen. Der Chip wurde gelöscht, sodass ich meine MCU jetzt neu programmieren kann.


Wenn Sie SWD-Pins als Ausgang verwenden müssen, fügen Sie zu Beginn des Programms eine Verzögerung hinzu oder verwenden Sie einen Jumper, um das Setzen dieser Pins als Ausgänge zu deaktivieren / aktivieren.

zupazt3
quelle
Ja, das ist ziemlich zu erwarten, wenn Sie die SWD-Pins für einen anderen Zweck verwenden. Die Erfahrung zeigt, dass selbst STM32-Designs, die dies nicht absichtlich tun, gelegentlich in einem Modus "stecken bleiben" können, in dem die SWD-Pins nicht reagieren (beschädigtes Programm?) Und eine solche Behandlung für die Wiederherstellung erfordern.
Chris Stratton
1
Unter Linux habe ich diesen Bash-Befehl verwendet, um den Chip zu löschen: st-flash erase
nathan
Der Erase-Chip hat bei mir nicht funktioniert. Ich ging zu Ziel -> Sektoren löschen -> Alle auswählen -> Übernehmen. Danach habe ich wieder Zugang zu meinem Board. Ich bin nicht sicher, warum die Chip-Löschung nicht
gesagt hat
6

Damit die Verbindung unter Reset funktioniert, muss der ST-Link die Kontrolle über den Reset-Pin haben. Wenn Sie ihn mit Masse verbinden, hat der ST-Link keine Chance, das Ziel zum Laufen zu bringen und Zugriff darauf zu erhalten.


Wenn Sie den BOOT0-Pin beim Einschalten hochziehen, startet die MCU im internen Bootloader und Sie können über mehrere serielle Protokolle darauf zugreifen (weitere Informationen finden Sie im Referenzhandbuch).

Im Bootloader sollten die SWD-Pins verfügbar sein, um Zugriff zu erhalten, aber ich bin mir nicht 100% sicher.

Der ST Flash Loader Demonstrator ist ein Tool, mit dem Sie das Mikro über die UART-Schnittstelle löschen / programmieren können. Wenn Sie auf keinen der UARTs Ihres Mikros zugreifen können, funktioniert diese Lösung nicht für Sie.

Arsenal
quelle
Ich kann auf USART3 zugreifen, das vom Bootloader unterstützt wird, also werde ich das später versuchen - es wird schwierig, da BOOT0 an GND auf der Leiterplatte gebunden ist ... Aber ich möchte wissen, was falsch ist. Was habe ich falsch gemacht? Ich habe SWD / JTAG-Pins als Ausgänge in meiner main () -Funktion gesetzt. Im Handbuch heißt es jedoch, dass beim Zurücksetzen alle Pins ihre Standardfunktion haben und sofort verwendet werden können. Warum kann ich Flash beim Zurücksetzen nicht löschen? Ich habe auch den U-LINK 2-Programmierer und uVision 5 getestet. Ich hoffe, dass - irgendwie versehentlich - keine Schutzstufe eingestellt wurde. Ich habe keine solchen Bits gesetzt, aber gibt es eine Möglichkeit zu testen, ob Schutzbits in Ordnung sind?
zupazt3
@ zupazt3 Ich will nicht unhöflich klingen, aber bitte lies meinen ersten Satz noch einmal. Es enthält eine Antwort auf das Problem mit der Verbindung unter Zurücksetzen. Wenn Sie es nicht verstehen, schreiben Sie einen genaueren Kommentar.
Arsenal
Aber ich binde es nicht die ganze Zeit :) In meinem ersten Beitrag habe ich gemeint, dass ich es AUCH direkt an GND gebunden habe, um zu prüfen, ob das helfen würde. Aber normalerweise binde ich NRST nicht an GND, sondern an einen Programmierer, sodass es die Kontrolle über das Zurücksetzen hat. Und es wird immer noch keine Verbindung hergestellt. Ich habe auch versucht, U-Link 2 und Keil uVision 5 zu verwenden, aber mit dem gleichen Ergebnis. Was kann der Grund sein?
zupazt3
@ zupazt3 das war aus deiner frage nicht ganz klar. Möglicherweise hilft es, die SWD-Uhr zu erhöhen, da die Verbindung hergestellt werden kann, bevor das Ziel auf Ausgabe umschaltet. Aber ich habe versehentlich die SWD-Pins auf Ausgang gesetzt und konnte keine Verbindung zu meinem Ziel herstellen. Nur mit dem BOOT0 konnte ich sie wiederherstellen, wenn Sie sie direkt (ohne Widerstand) mit Masse verbunden haben zäh.
Arsenal
1
Ich habe es endlich geschafft, den Chip zu löschen! Mit dem ST-Link-Dienstprogramm - Ich habe die Reset-Taste gedrückt, auf "Vollständig löschen" und die Freigabetaste geklickt und es hat sich irgendwie selbst gelöscht und jetzt funktioniert es. Ich habe das schon einmal versucht, aber erst jetzt hat es funktioniert.
zupazt3
3

Wenn Sie stmcubemx verwenden, müssen Sie das serielle Kabel auf der Registerkarte stmcube pinout konfigurieren. Klicken Sie auf der Registerkarte Pinbelegung auf SYS und ändern Sie die Debug-Option in serielles Kabel. Es behebt mein Problem und vielleicht auch Ihr Problem.

dili
quelle
Dies könnte zwar ein Problem sein. Wenn das Belassen der SWD-Pins im Einschaltstandard des SWD-Modus nicht die Standardeinstellung dieser Software-Suite ist, handelt es sich wahrscheinlich um einen ziemlich schwerwiegenden Usability-Fehler, der einen Fehlerbericht und eine Korrektur erfordert. Sind Sie sicher, dass Sie die Einstellungen nicht von ihren ursprünglichen Werten geändert haben oder mit einem bestimmten Projekt begonnen haben, bei dem diese Pins nicht standardmäßig verwendet werden müssen?
Chris Stratton
Ich habe zuerst nur meine Pins als SYS_SW gesetzt ... aber sie sind orange gefärbt. Hatte auch Probleme beim Verbinden mit dem Chip nach dem Hochladen des Codes. Wenn ich den Debug-Modus in SYS-Serial Wire ausgewählt habe, wird der Chip nach dem Flashen normal verbunden.
GTU
1

Ich habe Code auf mein eigenes STM32F427-Board heruntergeladen. Dann kann ich mit dem ST-LINK-Dienstprogramm keine Verbindung mehr zu meinem Board herstellen. Ich denke mein Code vermasselt die Debug-Port-Pin-Konfigurationen (? Kann nicht bestätigen). Was ich getan habe, ist Folgendes, um die Verbindung herzustellen und mein Board neu zu programmieren:

  1. Öffnen Sie das ST-LINK-Dienstprogramm und bereiten Sie sich im Menü "Ziel" auf "Verbinden" vor.
  2. Schalten Sie Ihr Board ein (in meinem Fall verwende ich ein USB-Kabel) und klicken Sie gleichzeitig im ST-LINK-Dienstprogramm auf "Verbinden".

Mit diesem Trick habe ich 2 Bretter restauriert. Hoffe das hilft. --Bob

Bob Liu
quelle
1

Wie Dili sagte:

Wenn Sie stmcubemx verwenden, müssen Sie das serielle Kabel auf der Registerkarte stmcube pinout konfigurieren. Klicken Sie auf der Registerkarte Pinbelegung auf SYS und ändern Sie die Debug-Option in serielles Kabel. Es behebt mein Problem und vielleicht auch Ihr Problem.

STM32CubeMx konfiguriert den Debug-Port nicht standardmäßig, daher funktioniert ST-Link nicht mehr, sobald Sie Ihren Code flashen. Sie müssen den Chip beispielsweise mit dem ST-Link-Dienstprogramm löschen. Um mich mit der MCU zu verbinden, musste ich beim Einschalten den BOOT0-Pin hochziehen, um den Bootloader zu aktivieren. Gehen Sie dann zum Tarjet-Menü und löschen Sie den Chip .

Pablo Soria
quelle
0

Um die MCU neu zu programmieren, halten Sie die Reset-Taste gedrückt und wählen Sie im ST-Link-Dienstprogramm die Option „Mit Gerät verbinden“ oder drücken Sie in Ihrer IDE (z. B. Keil) auf „Download“ und lassen Sie die Reset-Taste los.

Misagh
quelle
-1

Die Boot-Pins (in einigen Versionen Bits) können den Start des Debuggers verhindern. Stellen Sie sicher, dass Sie das Startmuster beim Start nicht implementieren (bestimmtes Binärmuster an den Pins boot0 und boot1), da sonst Ihre MCU in den Startzustand versetzt wird.

Lior Bilia
quelle
Ich habe den Boot0-Pin an GND gebunden ... Ich bin mir nicht sicher, was Sie geschrieben haben, weil ich - wie gesagt - meinen Flash erfolgreich programmiert habe und das Programm sich immer noch auf der MCU ausführt - ich kann einfach keine Verbindung zur MCU mit ST herstellen -Link über SWD-Schnittstelle. Beim Zurücksetzen sollte das Booten nicht ausgeführt werden und die Pins sollten sich im Standardzustand befinden, sodass ich nicht verstehe, warum keine Verbindung hergestellt wird.
zupazt3
Bist du dir da sicher? Welche Kombination würde Ihrer Meinung nach die SWD auf eine Weise deaktivieren, die durch die Manipulation des Resets nicht außer Kraft gesetzt werden kann?
Chris Stratton