ARM Cortex M3-Firmware

Zunächst einige Hintergrundinformationen.

Es gibt ein Produkt (einen Sensor), das von einem fernöstlichen Hersteller gekauft wurde, segne seine weißen Baumwollsocken, der den STM32F103V-Mikrocontroller verwendet. Die ursprünglich gelieferte Firmware hat zusammen mit allen Updates einige böse Fehler, die das Produkt in zufälligen Abständen in einen Ziegelstein verwandeln (und es wird erwartet, dass das Produkt monatelang ohne Ausfallzeiten funktioniert).

Am Anfang waren sie reaktionsschnell und bereit, Unterstützung zu leisten; Nach dem Kauf wird auf keine der gesendeten E-Mails geantwortet.

Die Lösung besteht also darin, die Firmware selbst neu zu schreiben.

Jetzt zum Problem.

Der Mikrocontroller hat bereits einen Bootloader und auf den Boards ist kein JTAG-Port verfügbar. Gibt es eine Möglichkeit, aus den bin-Dateien, die ich habe, herauszufinden, wie die Startadresse der Firmware lautet? Aufgrund des Bootloaders ist es nicht 0x00000000. Gibt es noch etwas, das ich beim Schreiben der Firmware beachten sollte (dh bestimmte Einstellungen für Register usw.)?

Kannst du Informationen zum Bootloader geben? Sie sprechen von einem benutzerdefinierten, nicht von STMicro, das sich bereits im ROM der MCU befindet, oder? Wer hat es entwickelt? Dieselbe Firma?
Zum Bootloader liegen mir keine Informationen vor und die Geräte wurden mit einer Windows-Anwendung ausgeliefert, die den Firmware-Upload übernimmt. Kein Hinweis auf den Entwickler der Firmware-Upload-Anwendung (hat allerdings einige chinesische Schriftzeichen) und wird mit einer DLL geliefert, die von ST stammen kann (STUARTBLLIB.dll).
@Iulian - "böse Fehler, die das Produkt in zufälligen Abständen in einen Baustein verwandeln [...] die Lösung besteht darin, die Firmware selbst neu zu schreiben". Ich empfehle, offen über die mögliche Ursache und Lösung zu bleiben. Angenommen, die Hänger treten auf mehreren Geräten auf, dann könnten die Hänger neben der Firmware auch durch (a) Hardware-Designfehler im Gerät und/oder (b) etwas Spezifisches für Ihre Verwendung der Geräte verursacht werden, einschließlich, aber nicht beschränkt auf , Probleme mit der Stromversorgung. Es wäre schade, wenn Sie die Firmware neu schreiben und immer noch das gleiche Problem haben! Können Sie einen Weblink für das Gerät freigeben?
@SamGibson: Danke für den Hinweis. Ich bin zu diesem Schluss gekommen, indem ich das Produkt auch an einem gefilterten Netzteil auf der Bank ausprobiert habe und als Ergebnis je nach Firmware-Version unterschiedliche Steine ​​​​hatte (einer von ihnen wird sich über den Haufen beschweren, während andere nichts sagen). Trotzdem schließe ich die Hardware nicht vollständig aus, da ich auch einige zusätzliche Drähte hinzufüge, um weitere Überprüfungen durchzuführen. Wird online nach dem Produkt suchen und einen Link bereitstellen.
Wie wird das Board für den Upload mit dem PC verbunden? Der werkseitige Bootloader auf dem STM32F103 unterstützt eine UART-Verbindung, aber keine USB-Verbindung. Die von Ihnen erwähnte DLL deutet darauf hin, dass der UART-Bootloader möglicherweise verwendet wird, aber wenn Sie eine Verbindung über USB herstellen, wäre der Bootloader stattdessen etwas Benutzerdefiniertes. Sie sollten dies auch feststellen können, indem Sie die Umreifung der Boot-Modus-Pins bestimmen. Für die Entwicklung benötigen Sie ein Board, auf dem Sie die beiden SWD-Pins aufnehmen, es sei denn, sie verwenden die BGA-Version, die mit Sorgfalt und Vergrößerung möglich sein sollte.

Antworten (2)

Ich empfehle Ihnen, sich ein gleichwertiges Teil und ein Breakout-Board zu besorgen. Sie sollten nur Strom und Masse und vdda benötigen. Holen Sie sich das kleinere Paket, wenn Sie es vorziehen (billiger Breakout). Eine andere Option ist ein Nucleo-Board, und Sie möchten vielleicht das Debug-Ende davon sowieso, möchten den SWD / Debugger trennen, damit Sie das erreichen können, wonach ich suche ...

Die Teile sind von ST mit einem Bootloader vorprogrammiert. Sie schnallen boot0 richtig an und können dann über uart programmieren. Sie sollten jederzeit in der Lage sein, die swd-Schnittstelle (jtag-ish) zu verwenden. Ich verwende das obere Ende dieser Boards, um andere Chips zu programmieren, sie möchten jedoch das mbed-Ding verwenden und wie ein USB-Stick einhängen, und Sie ziehen die Datei per Drag & Drop. nicht die Erfahrung, nach der Sie in einer kontrollierten Umgebung suchen möchten, mit openocd oder etwas ähnlichem über swd, um mit einem dieser Teile umzugehen. daher die Idee, ein Discovery Board oder einen Breakout oder etwas anderes zu bekommen. sollte Sie insgesamt nicht mehr als 20 Dollar kosten, vielleicht 10 Dollar, je nachdem, welchen Weg Sie einschlagen.

Sobald Sie es mit einem Board erlebt haben, auf dem nichts anderes vor sich geht, können Sie dieses Wissen an Ihr Board in Circuit anpassen. Die UART-Pins können beispielsweise umfunktioniert werden, sodass Sie möglicherweise nicht auf den ST-Bootloader zugreifen können. Ich kann mir nicht vorstellen, dass die Swd-Pins umfunktioniert werden, sie würden eine Möglichkeit haben wollen, ein Firmware-Upgrade im Schaltkreis durchzuführen. Es ist möglich, dass sie die Teile für die Produktion vorprogrammiert haben, aber es ist auch möglich, dass sie sie im Schaltkreis programmiert haben. Es kann auch möglich sein, dass sie einmalig programmierbar sind, aber ich habe mir Ihre Teilenummer nicht so genau angesehen.

Wie Chris Stratton erwähnte, wird die Vektortabelle eine Liste von Adressen sein, beginnend mit einer Zahl vom Typ 0x2000x000, dann ungerade Zahlen, von einer Handvoll bis zu Dutzenden, möglicherweise zeigen viele von ihnen auf denselben Handler. 0x00000051 0x00000071, 0x00000103 usw. nicht unbedingt im Wert steigend. die vektortabelle usw. sind alle in den st- und arm-dokumenten darüber, was sie tun.

Ich denke, der Benutzer-Flash basiert auf 0x08000000, also kann es im Code darauf basierende Adressen geben. tatsächlich kann/sollte die Vektortabelle Vektoren in diesem Raum enthalten

08000000 <_start>:
 8000000:   20001000    andcs   r1, r0, r0
 8000004:   08000041    stmdaeq r0, {r0, r6}
 8000008:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800000c:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000010:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000014:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000018:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800001c:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000020:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000024:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000028:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800002c:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000030:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000034:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000038:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800003c:   08000047    stmdaeq r0, {r0, r1, r2, r6}

es sei denn, sie haben den eingebauten Bootloader übernommen (wenn möglich).

Schauen Sie sich die Pinbelegung des Pakets an und finden Sie heraus, wo sich die Swd-Pins befinden, und klingeln Sie diese auf der Platine aus. Ich wäre nicht überrascht, wenn es einige Pads gibt. Ein 10-Dollar-Nucleo-Board ist billiger als ein 15-Dollar-Stlink. Beide sind relativ billig. Ich bevorzuge den Nucleo-Pfad oder ein Discovery-Board und verwende das Front-End, um Teile in der Schaltung zu programmieren. ziemlich einfach mit openocd zu verbinden.

Sind Sie sicher, dass Sie nicht auf die SWD-Pins des Geräts zugreifen können? Es scheint unwahrscheinlich, dass der Hersteller ein Teil hat, das er nicht selbst debuggen kann. Es ist nicht so, als hätten sie sich bisher Sorgen um den Schutz ihres geistigen Eigentums gemacht. Stellen Sie sicher, dass der ST-Bootloader nicht auch reagiert. Vielleicht hat der Hersteller benutzerdefinierte Tools geschrieben, um eine Schnittstelle zu diesem Bootloader herzustellen.

Sie haben die bin-Datei disassembliert, nehme ich an. Haben Sie etwas entdeckt, das wie eine Vektortabelle aussieht? Im Gegensatz zu den Kernen der A-Klasse, die einen Block wiederholter LDR PC,[PC#0x20](oder ähnlicher) - gefolgt von einer Reihe von Adressen haben, ist die Vektortabelle in der M-Klasse immer eine Liste von Adressen mit gesetztem Bit 0 (wie bei jeder Verzweigung zu Daumen). Vor den Vektoradressen steht der Anfangswert des Stapelzeigers. Eigentlich sollte Ihnen jeder PC-relative Load-PC einige Hinweise geben, auch diese beziehen sich auf einen ungeraden Wert.

Ja, die MCU hat nur TCK und TDI als Testpunkte zur Verfügung und es gibt keinen anderen Anschluss auf der Platine. Danke für die Idee, mit dem ST-Bootloader zu überprüfen, werde das auch versuchen. Ja, ich habe die bin-Datei zerlegt und es gibt nichts, was wie eine Vektortabelle aussieht, wie Sie erwähnt haben.
SWD verwendet nur tck und tdi, nicht wahr? Wenn Sie keine SWD-Sonde haben, besorgen Sie sich ein 10-Pfund-Dev-Board mit einem an Bord.
Der Grund, warum Sie keine Vektortabelle gesehen haben, ist, dass dieser Beitrag eine falsch beschreibt. Es besteht nicht aus Verzweigungsbefehlen, es besteht aus rohen absoluten Adressen. Suchen Sie nach einem 16-Bit-Little-Endian-Wert von 0x0800 (dh 0x00 0x08), der mit Offsets der Firmware innerhalb der Flash-Region verschachtelt wird.
Bei allen Befehlsadressen in der Vektortabelle ist das LSB gesetzt (dies ist das T-Bit für den Handler) - Entschuldigung für den Fehler, wir werden ihn später beheben.
Tatsächlich verwendet SWD TCK als Taktgeber, aber TMS anstelle von TDI für bidirektionale Daten. Natürlich ist es möglich, dass das Plakat das verwechselt, was tatsächlich ausgebrochen ist.