Usando la utilidad ST-LINK para configurar el RTC a la hora actual

10

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?

    
pregunta Spectre208

3 respuestas

3

Entonces, uno de los problemas fue, como señaló Chris Stratton:

  

Es posible que algunos registros ... no vuelvan a leer los valores escritos, lo que podría causar un problema con la verificación.

Esto significó que la verificación falló, lo que provocó que se mostrara el error, aunque la operación de escritura realmente tuvo éxito.

A continuación se muestra la respuesta que recibo al leer el registro PWR_ISR, establecer el bit INIT y luego volver a leer el registro:

  

0x4000280C: 00000027

     

Escribiendo 0x00000080 en 0x4000280C ... ¡Error!

     

0x4000280C: 000000A7

La verificación de la utilidad ST-LINK comprueba si el valor escrito en la dirección y leído de la dirección coincide. En este caso, la operación de escritura fue exitosa, a pesar de que los dos valores no coinciden, ya que el bit INIT ahora está establecido.

El otro problema fue que no pude notar el efecto de la operación de escritura. Mientras está conectado al microcontrolador, ST-LINK lo mantiene en estado de restablecimiento (conocido como "conectar bajo restablecimiento"). Necesitaba usar la opción de conexión HOTPLUG, que se conecta al microcontrolador sin detener o reiniciar.

  

La opción "conectar bajo reinicio" permite conectarse al objetivo antes de ejecutar cualquier instrucción. Esto es útil en muchos casos, como cuando el objetivo contiene un código que desactiva los pines JTAG / SWD.

     

La opción "HotPlug" permite conectarse al objetivo sin detener o reiniciar. Esto es útil para actualizar las direcciones RAM o los registros IP mientras se ejecuta la aplicación

¡El archivo por lotes funciona completamente como lo quería! El comando ahora se ve así:

ST-LINK_CLI.exe -c HOTPLUG -w32 <Address> <data> -w32 <Address> <data> ...
    
respondido por el Spectre208
5

Algunos registros solo son legales para un ancho de acceso específico (es decir, -w32 puede no ser correcto), o pueden no leer los valores escritos que podrían causar un problema con la verificación.

También puede haber restricciones de secuencia o estado para acceder a las cosas.

Una opción que debería solucionar la mayoría de los problemas concebibles sería crear un pequeño programa para hacer el trabajo que se enlazaría para ejecutarse en la RAM. Puede sustituir los datos en su binario después de averiguar el desplazamiento, cargar la versión modificada y ejecutarla. O puede hacer que el programa obtenga valores de una región de RAM fuera de las extensiones del archivo, que establecería antes de ejecutar. Con un control más preciso del stlink, también podría pasar valores en los registros de la CPU, aunque podría (?) Necesitar el programa de línea de comandos de código abierto alternativo en lugar de ST para hacer eso (esta pequeña rutina en el método RAM es, por cierto, la forma en que ese programa logra la escritura a flash)

    
respondido por el Chris Stratton
1

Creo que lo que está sucediendo es que después de la escritura, se realiza una lectura de verificación. Si el mismo registro devuelve la hora actual en una lectura, aunque logre actualizar el RTC, el depurador no se dará cuenta. Es menos probable que esto explique un problema con el registro de alimentación (a menos que el depurador también esté accediendo a ese registro debajo del capó). Compruebe el valor de lectura manualmente. Si hubiera un problema más importante, esta lectura también podría fallar. Además, pruebe los otros registros en su lista.

    
respondido por el Sean Houlihane

Lea otras preguntas en las etiquetas