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.)?
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.
schwach
Julian
SamGibson
Julian
Chris Stratton