Utilizzo dell'utilità ST-LINK per configurare RTC sull'ora corrente


9

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?


Possibilmente protetto da scrittura a meno che non venga inserito un codice chiave.
Sparky256

Sono contento di vedere che hai capito molto dai suggerimenti iniziali. Generalmente dovresti pubblicare una soluzione come una risposta piuttosto che una modifica alla domanda, e specialmente quando l'hai perseguita fino a quel punto da solo, sarebbe opportuno spostare il tuo consenso a quello.
Chris Stratton,

In realtà non ci ho pensato in quel modo! Sento che dovrei ancora farlo, anche se mi piacerebbe che anche tu avessi dei crediti.
Spectre208,

Quanto tempo deve trascorrere dopo la programmazione del dispositivo e quanto deve essere precisa l'ora del giorno? Sono solo preoccupato che non importa quanto sia preciso il tuo RTC, alla fine andrà un po 'alla deriva, almeno se viene utilizzato per anni e i tuoi requisiti di tempistica sono rigorosi.
Timo,

Dovrebbe funzionare per 10 anni con una singola batteria .. Tuttavia, lo schema temporale è già leggermente modificato da un numero casuale per impedire a tutti i dispositivi di inviare i propri dati contemporaneamente. La deriva temporale RTC non è quindi un grosso problema.
Spectre208,

Risposte:


4

Alcuni registri sono legali solo per una larghezza di accesso specifica (ovvero, -w32 potrebbe non essere corretta) o potrebbero non rileggere i valori scritti che potrebbero causare un problema con la verifica.

Potrebbero esserci anche restrizioni di sequenza o di stato sull'accesso alle cose.

Un'opzione che dovrebbe aggirare la maggior parte dei problemi immaginabili sarebbe quella di creare un piccolo programma per fare il lavoro che sarebbe collegato per l'esecuzione nella RAM. È possibile sostituire i dati nel relativo file binario dopo aver capito l'offset, caricare la versione modificata ed eseguirlo. Oppure potresti fare in modo che il programma ottenga valori da una regione di RAM al di fuori delle estensioni del file, che imposteresti prima di eseguirlo. Con un controllo più preciso dello stlink potresti anche passare valori nei registri della CPU, anche se potresti (?) Avere bisogno del programma alternativo da riga di comando open source anziché di ST per farlo (questa piccola routine nel metodo RAM è tra l'altro come quel programma realizza la scrittura a lampeggiare)


3

Quindi, uno dei problemi era, come ha sottolineato Chris Stratton:

Alcuni registri .. potrebbero non rileggere i valori scritti che potrebbero causare problemi con la verifica.

Ciò significa che la verifica non è riuscita, causando la visualizzazione dell'errore, anche se l'operazione di scrittura è effettivamente riuscita.

Di seguito è la risposta che ottengo leggendo il registro PWR_ISR, impostando il bit INIT, quindi rileggendo nuovamente il registro:

0x4000280C: 00000027

Scrittura 0x00000080 su 0x4000280C ... Errore!

0x4000280C: 000000A7

La verifica dell'utilità ST-LINK verifica se il valore scritto nell'indirizzo e letto dall'indirizzo corrisponde. In questo caso, l'operazione di scrittura ha avuto esito positivo, anche se i due valori non corrispondono, poiché il bit INIT è ora impostato.

L'altro problema era che non potevo notare l'effetto dell'operazione di scrittura. Mentre è collegato al microcontrollore, viene mantenuto nello stato di reset da ST-LINK (noto come "connect under reset"). Avevo bisogno di utilizzare l'opzione di connessione HOTPLUG, che si collega al microcontrollore senza interruzione o ripristino.

L'opzione "Connetti in ripristino" consente di connettersi alla destinazione prima di eseguire qualsiasi istruzione. Ciò è utile in molti casi come quando la destinazione contiene un codice che disabilita i pin JTAG / SWD.

L'opzione "HotPlug" consente di connettersi alla destinazione senza arrestare o ripristinare. Ciò è utile per aggiornare gli indirizzi RAM o i registri IP mentre l'applicazione è in esecuzione

Il file batch funziona perfettamente come volevo! Il comando ora appare così:

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

1

Penso che ciò che sta accadendo sia che dopo la scrittura, viene eseguita una lettura di verifica. Se lo stesso registro restituisce l'ora corrente in una lettura, sebbene si riesca ad aggiornare RTC, il debugger non si renderà conto. È meno probabile che ciò spieghi un problema con il registro di potenza (a meno che il debugger non acceda anche a quel registro sotto il cofano). Controllare manualmente il valore letto. Se si fosse verificato un problema più significativo, anche questa lettura potrebbe non riuscire. Inoltre, prova gli altri registri nell'elenco.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.