Verwenden des ST-LINK-Dienstprogramms zum Konfigurieren der RTC auf die aktuelle Zeit

9

Womit ich beschäftigt war

Ich verwende einen STM32-Mikrocontroller und muss für mein Projekt in der Lage sein, Daten zu bestimmten Tageszeiten (z. B. um 11 und 14 Uhr) zu senden. Der Mikrocontroller muss wissen, wie spät es ist, bevor ich dies erreichen kann. Leider habe ich nur eine Einwegkommunikation und kann daher die aktuelle Uhrzeit nicht vom Netzwerk anfordern.

Daher möchte ich die aktuelle Zeit direkt nach Abschluss der Programmierung einstellen. Ich wusste, dass ich mithilfe der Befehlszeilenschnittstelle des ST-LINK-Dienstprogramms (ST-LINK_CLI) mit dem folgenden Befehl Daten in den Flash schreiben kann:

ST-LINK_CLI.exe -w32 <Address> <data> -Rst

Ich habe ein einfaches Testskript geschrieben, das den Unix-Zeitstempel an eine Adresse schreibt, die derzeit nicht vom Code verwendet wird.

Ich wollte gerade eine Funktion schreiben, um den Zeitstempel zu lesen und damit die RTC-Zeit einzustellen. Bis ich im ST-LINK Utility-Benutzerhandbuch Folgendes gelesen habe :

-w32 unterstützt das Schreiben in Flash-Speicher-, OTP-, SRAM- und R / W-Register.

Wenn im Handbuch angegeben ist, dass das Schreiben in die R / W-Register unterstützt wird, kann ich dann direkt auf die RTC-Register zugreifen und diese einstellen? Ich habe es versucht, aber ich kann anscheinend nicht in diese Register schreiben.

Ich würde es vorziehen, diese Methode zu verwenden, da dies der Fall ist, da ich keine bestimmte Funktion mehr schreiben müsste, um sie auf dem Mikrocontroller zu handhaben. Dies bedeutet, dass ich die RTC-Zeit jedes derzeit verwendeten Mikrocontrollers einstellen kann, anstatt dessen Code aktualisieren zu müssen.


Was ich vorhatte zu tun

Um die RTC-Register einzustellen, habe ich versucht, die folgenden Schritte auszuführen, wie im STM-Referenzhandbuch beschrieben :

  • Setzen Sie das DPB-Bit im PWR_CR-Register
  • Schreiben Sie 0xCA in das RTC_WPR-Register
  • schreibe 0x53 in das RTC_WPR-Register
  • Stoppen Sie die RTC, indem Sie das INIT-Bit im Register RTC_ISR setzen
  • Wählen Sie den 1-Hz-Takt aus, indem Sie in das Register RTC_PRER schreiben
  • Laden Sie die aktuelle Zeit, indem Sie in das RTC_TR-Register schreiben
  • Laden Sie das aktuelle Datum, indem Sie in das Register RTC_DR schreiben
  • Starten Sie die RTC, indem Sie das INIT-Bit im Register RTC_ISR zurücksetzen

Für den Zugriff auf die Register habe ich folgende Adressen verwendet:

  • PWR_CR: 0x4000 7000
  • RTC_WPR: 0x4000 2824
  • RTC_ISR: 0x4000 280C
  • RTC_PRER: 0x4000 2810
  • RTC_TR: 0x4000 2800
  • RTC_DR: 0x4000 2804

Was schief gelaufen ist

Ich kann in keines dieser Register schreiben. Mit dem ST-LINK-Dienstprogramm erhalte ich die folgende Meldung:

Beim Schreiben des Speichers ist ein Fehler aufgetreten!

Verwenden der ST-LINK_CLI:

Schreiben von 0x00000100 um 0x40007000 ... Fehler!

Das Lesen dieser Register ist kein Problem, aber ich kann weder mit dem ST-LINK-Dienstprogramm noch mit der Befehlszeilenschnittstelle darauf schreiben.


Die Frage

Wie kann ich mit dem ST-LINK-Dienstprogramm in die R / W-Register schreiben?

Gibt es eine Art Schreibschutz, um das Schreiben in die RTC-Register zu ermöglichen, die ich übersehen habe?

Spectre208
quelle
Möglicherweise schreibgeschützt, sofern kein Schlüsselcode eingegeben wird.
Sparky256
Schön zu sehen, dass Sie aus den ersten Hinweisen selbst viel herausgefunden haben. Im Allgemeinen sollten Sie eine Lösung als Antwort und nicht als Bearbeitung der Frage veröffentlichen, und insbesondere, wenn Sie sie so weit selbst verfolgt haben, wäre es angebracht, Ihre Akzeptanz letztendlich dahingehend zu verschieben.
Chris Stratton
Ich habe es eigentlich nicht so gesehen! Ich habe das Gefühl, ich sollte es trotzdem tun, obwohl ich möchte, dass du auch ein paar Credits hast.
Spectre208
Wie lange nach der Programmierung muss Ihr Gerät ausgeführt werden und wie genau muss die Tageszeit sein? Ich mache mir nur Sorgen, dass es, egal wie genau Ihre RTC ist, irgendwann ein wenig driften wird, zumindest wenn es jahrelang verwendet wird und Ihre Timing-Anforderungen streng sind.
Timo
Es soll 10 Jahre lang mit einer einzigen Batterie betrieben werden. Das Zeitschema wird jedoch bereits durch eine Zufallszahl geringfügig geändert, um zu verhindern, dass alle Geräte ihre Daten auf einmal senden. Die RTC-Zeitdrift ist daher keine große Sache.
Spectre208

Antworten:

4

Einige Register sind nur für eine bestimmte Zugriffsbreite zulässig (dh -w32 ist möglicherweise nicht korrekt) oder lesen die geschriebenen Werte möglicherweise nicht zurück, was zu Problemen bei der Überprüfung führen kann.

Möglicherweise gibt es auch Sequenz- oder Statusbeschränkungen für den Zugriff auf Objekte.

Eine Option, die die meisten denkbaren Probleme umgehen sollte, wäre die Erstellung eines winzigen Programms, um die Aufgabe zu erledigen, die mit der Ausführung im RAM verbunden ist. Sie können die Daten in ihre Binärdatei einfügen, nachdem Sie den Offset ermittelt, die geänderte Version hochgeladen und ausgeführt haben. Oder Sie lassen das Programm Werte aus einem RAM-Bereich außerhalb der Dateibereiche abrufen, die Sie vor dem Ausführen festlegen würden. Mit einer feinkörnigeren Steuerung des stlinks könnten Sie auch Werte in CPU-Registern übergeben, obwohl Sie möglicherweise (?) Das alternative Open-Source-Befehlszeilenprogramm anstelle von STs benötigen, um dies zu tun (diese kleine Routine in der RAM-Methode ist übrigens die Art und Weise, wie dieses Programm das Schreiben ausführt aufblitzen)

Chris Stratton
quelle
3

Eines der Probleme war also, wie Chris Stratton betonte:

Einige Register .. lesen möglicherweise die geschriebenen Werte nicht zurück, was zu Problemen bei der Überprüfung führen kann.

Dies bedeutete, dass die Überprüfung fehlschlug und der Fehler angezeigt wurde, obwohl der Schreibvorgang tatsächlich erfolgreich war.

Unten ist die Antwort, die ich bekomme, wenn ich das PWR_ISR-Register lese, das INIT-Bit setze und dann das Register wieder zurücklese:

0x4000280C: 00000027

Schreiben von 0x00000080 um 0x4000280C ... Fehler!

0x4000280C: 000000A7

Die Überprüfung des ST-LINK-Dienstprogramms überprüft, ob der in die Adresse geschriebene und aus der Adresse gelesene Wert übereinstimmt. In diesem Fall war der Schreibvorgang erfolgreich, obwohl die beiden Werte nicht übereinstimmen, da das INIT-Bit jetzt gesetzt ist.

Das andere Problem war, dass ich den Effekt des Schreibvorgangs nicht bemerken konnte. Während der Verbindung zum Mikrocontroller wird dieser vom ST-LINK (bekannt als "Connect under Reset") im Reset-Zustand gehalten. Ich musste die HOTPLUG-Verbindungsoption verwenden, die ohne Anhalten oder Zurücksetzen eine Verbindung zum Mikrocontroller herstellt.

Mit der Option "Connect under Reset" können Sie eine Verbindung zum Ziel herstellen, bevor Sie eine Anweisung ausführen. Dies ist in vielen Fällen nützlich, z. B. wenn das Ziel einen Code enthält, der die JTAG / SWD-Pins deaktiviert.

Mit der Option „HotPlug“ können Sie eine Verbindung zum Ziel herstellen, ohne anzuhalten oder zurückzusetzen. Dies ist nützlich, um RAM-Adressen oder IP-Register zu aktualisieren, während die Anwendung ausgeführt wird

Die Batch-Datei funktioniert voll und ganz so, wie ich es wollte! Der Befehl sieht jetzt so aus:

ST-LINK_CLI.exe -c HOTPLUG -w32 <Address> <data> -w32 <Address> <data> ...
Spectre208
quelle
1

Ich denke, was passiert ist, dass nach dem Schreiben ein Verifizierungslesen durchgeführt wird. Wenn dasselbe Register beim Lesen die aktuelle Zeit zurückgibt, obwohl Sie die RTC erfolgreich aktualisieren, wird der Debugger dies nicht erkennen. Dies erklärt weniger wahrscheinlich ein Problem mit dem Leistungsregister (es sei denn, der Debugger greift auch unter der Haube auf dieses Register zu). Überprüfen Sie den Lesewert manuell. Wenn ein größeres Problem aufgetreten ist, schlägt möglicherweise auch dieser Lesevorgang fehl. Probieren Sie auch die anderen Register in Ihrer Liste aus.

Sean Houlihane
quelle