Tengo una placa personalizada con una MCU STM32F103VE. Puedo conectarme bien usando la Utilidad ST-Link, e incluso tuve el código descargado unas cuantas veces (en la Utilidad ST-Link y CooCox), pero hoy comencé a tener problemas para borrar la memoria flash interna de la MCU.
Al realizar un borrado masivo (Objetivo - > Borrar chip en la Utilidad ST-Link), el registro muestra "Memoria flash borrada". Sin embargo, al leer la memoria, el contenido anterior aún está allí, incluso después de reiniciar MCU, reconectando el adaptador ST-Link e incluso reiniciando la computadora. Si trato de borrar sectores individuales (Objetivo - > Borrar sectores ... en la Utilidad ST-Link), esto es lo que obtengo en el registro de salida habiendo seleccionado todos los sectores para borrar:
17:55:27: la página de Flash 0 @ 0x08000000 no se borra. Verificar la protección de la memoria.
17:55:27: la página de Flash 1 @ 0x08000800 no se borra. Verificar la protección de la memoria.
17:55:28: página de Flash 2 @ 0x08001000 borrada.
17:55:28: Flash page 3 @ 0x08001800 borrado.
17:55:28: Se borró la página 4 @ 0x08002000 de Flash.
17:55:28: Flash page 5 @ 0x08002800 borrado.
17:55:28: página de Flash 6 @ 0x08003000 borrada.
17:55:28: Flash page 7 @ 0x08003800 borrado.
17:55:29: la página de Flash 8 @ 0x08004000 no se borra. Verificar la protección de la memoria.
17:55:29: la página de Flash 9 @ 0x08004800 no se borra. Verificar la protección de la memoria.
...
17:55:33: la página 33 de Flash @ 0x08010800 no se borra. Verificar la protección de la memoria.
17:55:33: la página 34 de Flash @ 0x08011000 no se borra. Verificar la protección de la memoria.
17:55:33: Flash page 35 @ 0x08011800 borrado.
17:55:33: Flash page 36 @ 0x08012000 borrado.
...
17:56:07: página flash 254 @ 0x0807F000 borrada.
17:56:07: Flash page 255 @ 0x0807F800 borrado.
Para que quede claro, esto no es un problema de bytes de opción; los relacionados con la protección de la memoria son claros ("Sin protección"), y de hecho, al intentar actualizar los bytes de opción, aparece un error que indica "Podría no establezca los bytes de opción. Por favor, reinicie el objetivo y vuelva a intentarlo "
Resulta que solo tuve un código escrito en la primera página (0x0800000 - 0x080007FF) y luego en las páginas 8 a 34 (0x08004000 - 0x080117FF). Así que, para empezar, las páginas que supuestamente se borraron estaban en blanco.
Ahora, como se muestra arriba, también hay un problema al borrar la página 1 (0x08000800 - 0x08000FFF). Originalmente, esta era una página en blanco, que al intentar un borrado como el anterior indicaba un borrado exitoso, pero decidí realizar un experimento que me convenció de que esto es un fallo de hardware: escribí un pequeño archivo .bin a partir de 0x08000800. Las primeras palabras de este archivo de 32 bits son:
0x20000808 0x08000255 0x08000251 0x08000251
0x08000251 0x08000251 0x08000251 0x00000000
0x00000000 0x00000000 0x00000000 0x08000251
...
Sin embargo, después de escribir esto en la página 1 originalmente en blanco y leer de la memoria, obtengo esto:
0xFDFFEFFF 0xFBFFFBFF 0xFFFFFFFF 0xDFFFFEFF
0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF 0xF7FFFFFF
0xFFFDFFFF 0xFFFFFBFF 0xFFFFFFFF 0xFFFFFFFF
...
A partir de este momento, al intentar borrar la página 1 (a través de Target - > Erase Sectors ...), se informó de un error en esta página, exactamente como se muestra arriba.
Con esto en mi mente, tengo dos preguntas:
-
¿Es esta MCU bloqueada de forma irrevocable? Esto no es solo una cuestión de piquetes, sino que se trata de una MCU BGA que fue soldada por reflujo y, al volver a trabajar, no es mi idea de diversión. Por lo tanto, estoy abierto a cualquier sugerencia para intentar desbloquearlo.
-
Si esto es un fallo de hardware, ¿cómo surgió, así que puedo intentar prevenirlo en el futuro? Aquí debo mencionar que esta placa tiene una arquitectura de potencia extraña, y debido a algunas partes soldadas incorrectamente, parece que pudo haber estado sujeta a voltajes especialmente bajos suministrados desde una celda de moneda (CR1220), que se descargó completamente (desde 3.0 V a 2.4 V) en el lapso de unas pocas horas (normalmente se alimenta desde un USB o una batería recargable de Li-Ion). Se colocó una segunda celda de monedas y, cuando me di cuenta de este problema de energía, ya había bajado a 2,7 V. Tengo una teoría de que el STM32 tiene algunos circuitos internos para generar el voltaje de programación requerido, pero necesita un mínimo El voltaje funcionó correctamente, y posiblemente estuvo sujeto a un voltaje más bajo que sobrecargó y dañó permanentemente el circuito. Tenga en cuenta que no tengo datos para respaldar esto, es solo una especulación descabellada.
EDIT : hay un detalle que olvidé mencionar, que no creo que sea la fuente del problema, pero quizás vale la pena mencionarlo: una de las últimas cosas que hice antes de la MCU fue bloqueado sin querer programar un archivo .bin en la dirección incorrecta (0x200 más allá de la dirección de inicio correcta) y, por lo tanto, puede haber intentado escribir más allá del final de la memoria flash (es decir, en las direcciones 0x08080000-0x080801FF). Si alguien piensa que esto puede ser lo que finalmente bloqueó a la MCU, hágamelo saber.