STM32L031 wird nicht ausgeführt, nachdem das Debuggen beendet wurde

Ich verwende für meine Anwendung einen STM32L031 mit Eclipse. Im Debug-Modus funktioniert alles einwandfrei. Aber wenn ich den Debug-Modus stoppe oder das Gerät aus- und wieder einschalte, funktioniert der STM32L031 nicht mehr.

Ich hatte erwartet, dass es nach dem Herunterladen des Codes in den Chip funktionieren sollte, wenn ich ihn einschalte.

Und da ich kein Evaluierungsboard verwende, gibt es keine Reset-Taste, sodass ich es nicht zurücksetzen kann.

Wie kann man dieses Problem lösen? Oder gibt es eine Möglichkeit, den Chip zurückzusetzen, ohne dass die Reset-Tastenhardware erforderlich ist?

Was macht es, wenn Sie den Debug-Modus stoppen? Ich schätze, es gibt noch einige Haltepunkte im Code, die vor dem Zurücksetzen nicht bereinigt wurden.
Haben Sie den NRST-Pin so verdrahtet, dass ein normaler Start verhindert werden könnte? Verwenden Sie eine Art Semi-Hosting, das die normale Ausführung verhindern könnte (aufgrund fest codierter Haltepunkte)? Ist der Debugger noch verbunden, wenn Sie das Aus- und Wiedereinschalten durchführen?
Wenn Sie wahrscheinlich einen SMT-Widerstand an der NRST-Leitung haben, an den Sie einen kleinen Draht anlöten können, um ihn für einen Test-Reset nach unten zu ziehen. Oder (zumindest wenn Ihre Versorgung strombegrenzt ist) können Sie einfach etwas Geerdetes (oder über einen Widerstand mit niedrigem Wert) daran berühren.
Sie sollten in der Lage sein, den Debugger erneut an ein laufendes Ziel anzuhängen - dies hilft zu untersuchen, wo er feststeckt.
Angenommen, Sie haben einen Pullup-Widerstand auf der NRST-Leitung, nur kurz NRST gegen Masse. Wenn Sie dies nicht tun - fügen Sie ein 10kOhm hinzu. Und wie ist dein BOOT0 verkabelt?
"Ich hatte erwartet, dass es nach dem Herunterladen des Codes in den Chip funktionieren sollte, wenn ich ihn einschalte" - dies gilt nur, wenn Sie den Code in Flash hochladen und Ihre MCU so programmieren, dass sie davon bootet.

Antworten (2)

Eine Sache, die die Ausführung verhindern kann, ist, wenn Sie Semi-Hosting verwenden. Versuchen Sie in Ihren Projekteigenschaften, die folgenden zwei Symbole zu entfernen:

Geben Sie hier die Bildbeschreibung ein

Ich habe mehrere Projekte, und nur bei einigen muss Semi-Hosting entfernt werden. Ich habe noch nicht herausgefunden, warum es für einige notwendig ist und für andere nicht ...

Oh, und wenn das Aus- und Wiedereinschalten des Boards nicht funktioniert, würde ein Reset-Knopf auch nicht funktionieren.

Semihosting kommt ins Spiel, wenn Sie Funktionen verwenden, die Standard-E/A verwenden, wie printf(). Wenn Sie diese Funktionen nicht aufrufen, unterscheidet sich Ihre Anwendung mit und ohne Semihosting nicht.
@duskwuff Keine Erfahrung mit diesem Controller, aber AFAIK "gehostete Anwendung" in C bedeutet, dass Ihr Code mit beginnt main, im Gegensatz zu "nicht gehosteten" Anwendungen, die mit so etwas wie beginnen __program_start. Übrigens, wenn Sie ungehostet laufen, müssen Sie STDOUT selbst initialisieren, bevor Sie verwenden können printf, aber das ist möglicherweise nicht der einzige Unterschied.
@DmitryGrigoryev Stimmt, aber Semihosting ist eine ganz andere Sache. Das Aktivieren/Deaktivieren von Semihosting hat keinen Einfluss darauf, wie Anwendungen gestartet werden.

Bei Verwendung des Debuggers wird der Prozessor gezwungen, von einer bestimmten Region aus auszuführen.
Beim Power-On-Reset bestimmt der Bootloader, wo er starten soll. Einige Pins oder Flash-Positionen geben dem Bootloader Anweisungen.

stm32l031 Boot-Optionen