Lo que estaba haciendo
Estoy usando un microcontrolador STM32 y para mi proyecto necesito poder enviar datos en momentos específicos del día (por ejemplo, a las 11 a.m. y a las 2 p.m.). El microcontrolador necesita saber qué hora es antes de que pueda lograr esto. Desafortunadamente, solo tengo una comunicación unidireccional y, por lo tanto, no puedo solicitar la hora actual de la red.
Por lo tanto, quiero establecer la hora actual, directamente después de que haya terminado la programación. Sabía que podía escribir datos en la memoria flash usando la interfaz de línea de comandos de la utilidad ST-LINK (ST-LINK_CLI) usando el siguiente comando:
ST-LINK_CLI.exe -w32 <Address> <data> -Rst
Escribí un script de prueba simple que escribe la marca de tiempo de Unix en alguna dirección que el código no usa actualmente.
Estaba a punto de escribir una función para leer la marca de tiempo y usarla para configurar la hora RTC. Hasta que leí lo siguiente en el Manual del usuario de la utilidad ST-LINK :
-w32 admite escribir en la memoria Flash, OTP, SRAM y registros R / W.
Cuando el manual dice que admite la escritura en los registros R / W, ¿significa esto que puedo acceder directamente a los registros RTC y configurarlos? Lo he intentado, pero parece que no puedo escribir en estos registros.
Preferiría usar este método si lo hace, ya que ya no necesitaría escribir una función específica para manejarlo en el microcontrolador. Esto significa que puedo configurar el tiempo RTC de cualquier microcontrolador que tengamos actualmente en uso, en lugar de tener que actualizar su código.
Lo que pretendía hacer
Para configurar los registros RTC, intenté hacer los siguientes pasos, como se describe en el Manual de referencia de STM :
- establecer el bit DPB en el registro PWR_CR
- escribir 0xCA en el registro RTC_WPR
- escriba 0x53 en el registro RTC_WPR
- detener el RTC configurando el bit INIT en el registro RTC_ISR
- seleccione el reloj de 1Hz escribiendo en el registro RTC_PRER
- cargar la hora actual escribiendo en el registro RTC_TR
- cargar la fecha actual escribiendo en el registro RTC_DR
- iniciar el RTC restableciendo el bit INIT en el registro RTC_ISR
Para acceder a los registros, he utilizado las siguientes direcciones:
- PWR_CR: 0x4000 7000
- RTC_WPR: 0x4000 2824
- RTC_ISR: 0x4000 280C
- RTC_PRER: 0x4000 2810
- RTC_TR: 0x4000 2800
- RTC_DR: 0x4000 2804
Qué salió mal
No puedo escribir en ninguno de estos registros. Con la utilidad ST-LINK, recibo el siguiente mensaje:
¡Ocurrió un error durante la escritura de memoria!
Usando el ST-LINK_CLI:
Escribiendo 0x00000100 en 0x40007000 ... ¡Error!
Leer estos registros no es un problema, pero no puedo escribirles usando la utilidad ST-LINK o su interfaz de línea de comandos.
La pregunta
¿Cómo puedo escribir en los registros R / W con la utilidad ST-LINK?
¿Hay algún tipo de protección contra escritura para permitir la escritura en los registros RTC que pasé por alto?