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?