STM32 parece estar bloqueado irrevocablemente

4

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:

  1. ¿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.

  2. 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.

    
pregunta swineone

3 respuestas

3

Primero, el voltaje de programación, se da en la hoja de datos bajo las condiciones de operación de la memoria ( page 63 ):

  

Tensión de programación Vprog 2 - 3,6 V

Entonces, si leí su sugerencia correcta, ¿podría haber sido alimentada solo por esa celda de la moneda durante la programación? Esto podría ser muy malo por cierto. El controlador consume una corriente máxima durante la operación de escritura (solo el flash) de 7 mA. Una pequeña celda de monedas realmente no soporta bien las corrientes más altas y su voltaje, así como la capacidad disminuida, probablemente muy rápido. Dada la hoja de datos de un CR1220, la caída de voltaje en una batería llena sería de al menos 0.5 V si dibuja 7 mA a partir de él, por lo que comienza a aproximadamente 2,35 V, no mucho espacio para la cabeza.

Pero también me pregunto si su circuito está bien ahora. ¿Ha medido la corriente que extrae y verificó todos los voltajes y su estabilidad si dibuja corriente (conecte una década de resistencia y varíe un poco)?

Ahora hay una posibilidad sobre cómo podría salvar la pieza. Supongo que no funcionará ya que no tiene problemas para conectarse al dispositivo, pero de todos modos:

El F103 tiene un cargador de arranque incorporado al que se puede acceder si tira del pin BOOT hacia arriba durante el encendido. También necesitará acceso a UART1 para poder comunicarse con el cargador de arranque. Lea la sección 3.4 de manual de referencia . Otro buen recurso es este documento .

Si puede conectarse a él, hay una herramienta (STSW-MCU005STM32 y STM8 Flash loader demostrator (UM0462) disponible en ST, que permite interactuar con el gestor de arranque y borrar o programar el chip.

    
respondido por el Arsenal
1

Simplemente desactiva la tarjeta, coloca el pin de arranque en alto, alimenta la tarjeta, carga un programa utilizando SWD, desactiva el motor y baja el pin de arranque antes de volver a encenderlo.

    
respondido por el Scott Seidman
0

El flash de programación requiere voltajes más altos que los que normalmente suministras. En los viejos tiempos, solo se podía programar un dispositivo proporcionando vpp externamente. Hoy en día, las CPU generan ese voltaje internamente desde VDD.

La programación de flash es un proceso delicado. El algoritmo es algo así como: mida el tiempo que tarda el bit en volver a leer como el valor deseado y luego continúe programando dos veces más. Nuevamente, en los viejos tiempos, un programador tendría que implementar esto, pero ahora todo está integrado en la CPU. En el stm, la programación con vpp insuficiente resultará en un tiempo de espera. Por lo general, el circuito generador de vpp simplemente hace su mejor esfuerzo pero no muere. Entonces ... supongo que hay otra causa para la falla del hardware flash ...

    
respondido por el rew

Lea otras preguntas en las etiquetas