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?
Antworten:
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)
quelle
Eines der Probleme war also, wie Chris Stratton betonte:
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:
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.
Die Batch-Datei funktioniert voll und ganz so, wie ich es wollte! Der Befehl sieht jetzt so aus:
quelle
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.
quelle