Lo que estaba haciendo
Estoy usando un microcontrolador STM32 y para mi proyecto necesito poder enviar datos a horas específicas del día (por ejemplo, a las 11 am y las 2 pm). El microcontrolador necesita saber qué hora es antes de que pueda lograrlo. Desafortunadamente, solo tengo una comunicación unidireccional y, por lo tanto, no puedo solicitar la hora actual de la red.
Por lo tanto, quiero configurar la hora actual, directamente después de que termine la programación. Sabía que puedo escribir datos en la memoria flash utilizando la Interfaz de línea de comandos de la utilidad ST-LINK (ST-LINK_CLI) utilizando el siguiente comando:
ST-LINK_CLI.exe -w32 <Address> <data> -Rst
Escribí una secuencia de comandos de prueba simple que escribe la marca de tiempo de Unix en una dirección que no está actualmente en uso por el código.
Estaba a punto de escribir una función para leer la marca de tiempo y usarla para establecer la hora RTC. Hasta que leí lo siguiente en Manual del usuario de la utilidad ST-LINK :
-w32 admite la escritura en 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 no necesitaría escribir una función específica para manejarlo más en el microcontrolador. Esto significa que puedo establecer la hora RTC de cualquier microcontrolador que tengamos actualmente en uso, en lugar de tener que actualizar su código.
Lo que pretendía hacer
Para establecer los registros RTC, intenté hacer los siguientes pasos, como se describe en STM Reference Manual :
- establecer el bit DPB en el registro PWR_CR
- escriba 0xCA en el registro RTC_WPR
- escriba 0x53 en el registro RTC_WPR
- detenga el RTC estableciendo el bit INIT en el registro RTC_ISR
- seleccione el reloj de 1Hz escribiendo en el registro RTC_PRER
- cargue la hora actual escribiendo en el registro RTC_TR
- cargue la fecha actual escribiendo en el registro RTC_DR
- inicie el RTC restableciendo el bit INIT en el registro RTC_ISR
Para acceder a los registros, he usado 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
Lo que salió mal
No puedo escribir en ninguno de estos registros. Con la utilidad ST-LINK, recibo el siguiente mensaje:
¡Se produjo un error durante la escritura de memoria!
Utilizando el ST-LINK_CLI:
Escribiendo 0x00000100 en 0x40007000 ... ¡Error!
La lectura de estos registros no es un problema, pero no puedo escribir en ellos utilizando la utilidad ST-LINK o su interfaz de línea de comandos.
La pregunta
¿Cómo puedo escribir en los registros de R / W utilizando 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?