Keil uVision MDK-Lite, STM32F072B-Discovery-Karte und Flash-API

10

Ich verwende MDK-Lite Version 5.23 mit einer STMicroelectronics STM32F072B-Disco "Discovery" -Karte und versuche, das in den Discovery-Beispielen bereitgestellte Flash-Beispiel zu verwenden.

Ich habe dieses Board und diese Toolchain für andere Beispiele verwendet und einige SPI- und GPIO-Arbeiten codiert. Die IDE funktioniert wie ein Champion. Für dieses spezielle Projekt kann ich den Code jedoch erstellen und ausführen, indem ich die Schaltfläche zum Zurücksetzen herunterlade und verwende. Ich kann den Debugger nicht für das Projekt verwenden, sobald ich die Routine HAL_FLASHEx_Erase () verwende. Sobald ich diese Routine ausgeführt habe, öffnet die IDE ein Dialogfeld "Kein Zugriff auf Ziel. Debug-Sitzung wird beendet."

Ich weiß, dass es kein Programmierfehler ist, denn wenn ich den Code herunterlade und ihn dann durch Drücken der Reset-Taste ausführe, funktioniert er. Ich habe denselben Debugger mit einer TI-Karte verwendet und er konnte Flash programmieren und auch Flash-Routinen ausführen. Ich bin mir ziemlich sicher, dass ich den Teil von Flash, in dem der Code gespeichert ist, nicht lösche, also ist es nicht so.

Wenn ich in main.c über diese Zeile gehe

if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)

dann wird die Debug-Sitzung beendet. Wenn ich stattdessen in dieselbe Zeile gehe und dann jeden der Aufrufe in der Flash-Löschroutine überschreite, funktioniert dies und verlässt schließlich die Routine, und ich kann den Rest des Codes debuggen.

Netskink
quelle
Ich bin mir nicht sicher, aber möglicherweise wurde die USB-Seite des CMSIS-DAP aus- und wieder eingeschaltet. Diese Karte hat eine ziemlich komplexe Energieverteilung für die externen Debug-Komponenten. Kein Zugriff auf das Ziel bedeutet wahrscheinlich, dass die Verbindung (über eine serielle Leitung) zum DAP unterbrochen wurde.
Sean Houlihane
Sprechen wir über den integrierten ST-LINK / V2 als Debugger?
Bence Kaulics
Wenn Sie ein Code-Image freigeben können, kann möglicherweise eine andere Person dies überprüfen (und Hardwareprobleme ausschließen). Habe nur ein M7 Board selbst ...
Sean Houlihane
Bence Kaulics, der Debugger, der in das Disco-Board stm32f072B integriert ist. Es ist der ST-Link-Debugger und kein Keil ULINK2-Debugger, der ST-LINK / V2 ist. Ich habe einen dieser Keil USB-Debugger, aber er wird mit einem Flachbandkabel mit der Platine verbunden. Ich verwende den Mini-USB-ST-Link-Anschluss auf der Platine und keinen Flachbandkabelanschluss. Die Karte wird über den Mini-USB-Anschluss und nicht über ein separates Netzteil mit Strom versorgt.
Netskink
1
In Bezug auf das Codebeispiel. Die Probe wird von Discovery Repot von STMicro bereitgestellt. Der Pfad des Projekts im ST-Repot lautet Projects / STM32F072B-Discovery / Examples / FLASH / FLASH_EraseProgram. Ich verwende das MDK-ARM-Projekt in diesem Verzeichnis. Es schlägt in Zeile 108 fehl, wo es HAL_FLASHEx_Erase ()
netskink

Antworten:

7

Ich vermute, dass dies ein Netzteil ist, das auf einer bestimmten Ebene zusammenhängt. Entweder die externe Versorgung oder das On-Board-Schalten von Stromschienen.

Um das Szenario zu verdeutlichen, funktioniert das Debuggen nach einem Hardware-Reset einwandfrei. Wenn Ihr Ziel jedoch einen Flash-Block löscht, wird die Debug-Verbindung getrennt.

Beim Debuggen ist es nicht wichtig, dass der Code ordnungsgemäß ausgeführt wird. Sie können sich im Sperrzustand befinden, und das Anhalten des Debugs sollte weiterhin funktionieren. Das einzige, was auf der CPU-Seite das Debugging sperrt, ist ein blockierter AHB-Zugriff. Dies bedeutet, dass das Problem entweder bei der SWD-Schnittstelle zwischen dem STM32F7 und dem integrierten USB-SWD-Schnittstellenchip liegt (vermutlich auch bei einem STM32). Dieses Gerät verfügt über eine integrierte Stromschienenumschaltung, die mich beim ersten Gebrauch der Karte verwirrte.

Es ist erwähnenswert, dass das Löschen von Blitzen den Stromverbrauch des Geräts erhöht. Ist Ihr externes Netzteil dem Job gewachsen und können Sie eine Alternative verwenden?

Bearbeiten: Basierend auf Ihrem Feedback, dass das Überschreiten des fraglichen Codes zum Absturz des Debuggers führt, während dies bei Einzelschritten nicht der Fall ist, denke ich, dass Ihr Problem mit dieser Frage zusammenhängt .

Step-Over wird mithilfe eines Haltepunkts (und der Abfrage des Stopp-Status) implementiert, während Single-Step in der Hardware unterstützt wird. Dies erklärt immer noch nicht, warum der Debugger verwirrt zu sein scheint, lässt jedoch zu, dass der Debugger versucht, auf Code (von Flash) zuzugreifen, während der Flash-Controller aktiv ist.

Basierend auf diesen Beobachtungen würde ich vorschlagen, dass Sie nach dem Löschen einen Haltepunkt festlegen und versuchen, das Auslösen dieses Szenarios zu vermeiden.

Sean Houlihane
quelle
Richtig, es funktioniert gut, aber wenn ich einen Block lösche, wird die USB-Verbindung zum Debugger unterbrochen. Ich habe einen USB-Hub ohne Stromversorgung verwendet, daher schien dies logisch. Eine direkte Verbindung zum Computer und die Verwendung eines anderen Hubs führt jedoch zum gleichen Ergebnis.
Netskink
Wenn Sie während des Flash-Zugriffs Code ausführen, wird der AHB für eine Weile blockiert. Ich stelle mir vor, dass das Treten in diesem Szenario chaotisch sein könnte. stackoverflow.com/questions/3445598 bietet mehr.
Sean Houlihane