Quello che stavo facendo
Sto usando un microcontrollore STM32 e per il mio progetto devo essere in grado di inviare dati a orari specifici della giornata (diciamo, alle 11 e alle 14). Il microcontrollore deve sapere che ore sono prima che io possa raggiungere questo obiettivo. Sfortunatamente, ho solo una comunicazione a senso unico e quindi non posso richiedere l'ora corrente dalla rete.
Pertanto, voglio impostare l'ora corrente, subito dopo aver terminato la programmazione. Sapevo di essere in grado di scrivere dati sul flash utilizzando l'interfaccia della riga di comando dell'utilità ST-LINK (ST-LINK_CLI) utilizzando il comando seguente:
ST-LINK_CLI.exe -w32 <Address> <data> -Rst
Ho scritto un semplice script di test che scrive il timestamp Unix su un indirizzo non attualmente utilizzato dal codice.
Stavo per scrivere una funzione per leggere il timestamp e usarlo per impostare l'ora RTC. Fino a quando ho letto quanto segue nel Manuale dell'utente dell'utilità ST-LINK :
-w32 supporta la scrittura su registri di memoria Flash, OTP, SRAM e R / W.
Quando il manuale dice che supporta la scrittura nei registri R / W, significa che posso accedere direttamente ai registri RTC e impostarli? Ho provato, ma non riesco a scrivere a questi registri.
Preferirei utilizzare questo metodo se lo fa, in quanto non avrei bisogno di scrivere una funzione specifica per gestirlo più sul microcontrollore. Ciò significa che posso impostare l'ora RTC di qualsiasi microcontrollore attualmente in uso, invece di dover aggiornare il loro codice.
Cosa intendevo fare
Per impostare i registri RTC, ho provato a fare i seguenti passi, come descritto nel Manuale di riferimento STM :
- impostare il bit DPB nel registro PWR_CR
- scrivere 0xCA nel registro RTC_WPR
- scrivere 0x53 nel registro RTC_WPR
- arrestare RTC impostando il bit INIT nel registro RTC_ISR
- selezionare l'orologio 1Hz scrivendo nel registro RTC_PRER
- caricare l'ora corrente scrivendo nel registro RTC_TR
- caricare la data corrente scrivendo nel registro RTC_DR
- avviare RTC ripristinando il bit INIT nel registro RTC_ISR
Per accedere ai registri, ho utilizzato i seguenti indirizzi:
- PWR_CR: 0x4000 7000
- RTC_WPR: 0x4000 2824
- RTC_ISR: 0x4000 280C
- RTC_PRER: 0x4000 2810
- RTC_TR: 0x4000 2800
- RTC_DR: 0x4000 2804
Cosa è andato storto
Non sono in grado di scrivere in nessuno di questi registri. Con l'utilità ST-LINK, ricevo il seguente messaggio:
Si è verificato un errore durante la scrittura della memoria!
Utilizzando ST-LINK_CLI:
Scrittura 0x00000100 su 0x40007000 ... Errore!
La lettura di questi registri non è un problema, ma non posso scriverli utilizzando l'utilità ST-LINK o la sua interfaccia a riga di comando.
La domanda
Come posso scrivere nei registri R / W usando l'utilità ST-LINK?
Esiste un tipo di protezione dalla scrittura per consentire la scrittura nei registri RTC che ho ignorato?