Cargador de arranque interno STM32L073xx - Obtener problema de tamaño de flash

Recientemente traté de desarrollar una aplicación intermitente personalizada (basada en el módulo Python stm32loader) para microcontroladores STM32L073xx, pero me quedé atascado en un punto.

Esta biblioteca intenta obtener el tamaño de flash de thr micro porque para el mismo chip UID (0x447 - STM32L07x/L08x/L010) podemos tener diferentes tamaños de flash. La lib envía un comando para leer la memoria (cmd 0x11 0xEE) y aquí comienza mi problema:

  • el tamaño del flash se almacena en la dirección 0x1FF8007C (RM0367, sección 34.1.1)
  • el cargador de arranque interno permite leer la memoria en el rango de la memoria del sistema: 0x1FF00000 - 0x1FF01FFF (AN2606 Rev35, ch.56 "Parámetros del cargador de arranque dependientes del dispositivo", STM32 serie L0, PID 0x447)

Cuando trato de leer el tamaño del flash desde esta dirección, recibo la respuesta 0x1F (NACK) y no puedo continuar con el proceso.

Por supuesto, podría copiar el byte de tamaño de flash en algún lugar de la RAM antes de saltar al gestor de arranque del sistema o asumir algún tamaño de flash, pero entonces la aplicación no será robusta para todos los chips.

¿Cómo debe ser manejado de la manera adecuada? ¿Hay otra dirección donde se almacena el tamaño de flash?


Ahora puedo leer todo el contenido flash, pero hay un nuevo desafío. Intenté realizar un borrado masivo para preparar el flash para escribir contenido nuevo y sorpresa sorpresa... ¡el gestor de arranque devuelve NACK para cualquier tipo de borrado masivo!

Mi comunicación se ve así:

  • entrar en el gestor de arranque
  • enviar 0x7F, obtener 0x79 (ACK)
  • enviar 0x44 0xBB, obtener 0x79 (ACK) - Comando de memoria de borrado extendido

Ahora probé lo siguiente:

  • enviar 0xFF 0xFF 0x00, obtener 0x1F (NACK) - Borrado masivo
  • enviar 0xFF 0xFE 0x01, obtener 0x1F (NACK) - Banco 1 Borrar
  • enviar 0xFF 0xFD 0x02, obtener 0x1F (NACK) - Banco 2 Borrar

Ninguno de ellos funciona ... ¿alguna sugerencia?

Muestre las operaciones reales que intenta usar con todo detalle. ¿Alguna otra operación (como flashear) es un éxito?
¿Le gustaría ver el registro del analizador lógico/terminal? Es bastante simple. Durante el inicio, salto al cargador de arranque cuando se establece un número mágico en la RAM (lo compruebo antes de inicializar la RAM con datos). Luego, desde la aplicación de PC, ejecuto el script python que envía 0x7F para activar el canal de uso del cargador de arranque, tengo 0x79 (ACK), luego envío 0x11 0xEE, obtengo 0x79, envío 0x1F 0xF8 0x00 0x7C y CRC, luego obtengo del cargador de arranque 0x1F ( NAC). Si la dirección está dentro del rango definido, todo está bien. Si codifico el tamaño del flash y omito pedirlo, puedo, por ejemplo, leer todo el flash a través del comando de lectura del cargador de arranque.
@voldi Su pregunta de seguimiento debe publicarse como una nueva pregunta, en lugar de una edición.
Lo hice así pero alguien lo editó. Quería seguir resolviendo mis problemas.
Este no es un foro de discusión, las preguntas no se pueden ampliar con nuevos temas. Su problema original fue resuelto, ahora necesita una nueva pregunta en una nueva página.

Respuestas (1)

No está claro por qué la lectura de la dirección 0x1FF8007C no funciona, obtengo el mismo error.

Sin embargo, experimentar con un Nucleo-L073RZ muestra que permitirá leer 128 bytes comenzando en la dirección 0x1FF80000, que tendrá el valor de tamaño de flash que busca como su penúltima palabra de 16 bits.

Pensando que podría ser un problema de compensación, probé lecturas en 0x1FF80000 + [0x70, 0x60, 0x40], ninguna de las cuales funcionó. Por el contrario, la lectura en 0x800007c funciona, por lo que se permiten compensaciones en general. Y como el tamaño de lectura se envía después del punto en el que la dirección está NAK, no hay problema si se requiere una lectura de 32 o 16 bits.

De todos modos, leer un bloque de 128 bytes debería resolver su problema.

Otra idea sería comenzar en una dirección cerca de la parte superior del tamaño de flash más grande y leer hacia abajo hasta que deje de fallar. O puede cargar un pequeño código auxiliar en la RAM y ejecutarlo. Pero parece que leer 128 bytes será la solución más sencilla.

Aparte, usando https://github.com/florisla/stm32loader (que parece ser lo que está en pypi, no dijiste lo que estabas usando) descubrí que tenía que reiniciar el chip cada vez que invocaba el programa, por lo que aparentemente no está dejando el gestor de arranque en el estado correcto. Aún así, es una mejora con respecto a otra herramienta que probé hace unos meses, que se negaba a comunicarse con el gestor de arranque L07x, aunque estaba bien con el L05x...

Si uno realmente quisiera pasar una tarde descendiendo por una madriguera de conejo, probablemente sería posible establecer un punto de interrupción antes de enviar el byte CRC de la dirección y rastrear la operación del cargador de arranque hasta la lógica que genera el ACK o NAK, pero como está en la ROM, todos ustedes probablemente aprendería es precisamente lo que está o (aparentemente erróneamente) no está permitido.

su solución funciona y ya la implementé en lib (sí, estoy usando stm32loader de pypi). Es extraño que el cargador de arranque, que no es una versión beta, tenga ese tipo de limitación... De todos modos, ahora puedo leer todo el contenido flash, pero hay un nuevo desafío. Ver editar arriba.