¿Unbrick MAX32660 que está programado para conducir el pin SWD?

Pensé que estaba siendo inteligente al reasignar mi salida UART al pin de salida SWD. No soy fanático de los depuradores (no escalan). Supuse que podía reprogramar mi MAX32660 manteniéndolo en reinicio, como se hace con los AVR, por ejemplo.

Bueno, resulta que ni OpenOCD ni PyOCD quieren hablar con el MAX32660 mientras está reiniciado. Por ejemplo, PyOCD dice "El estado del dispositivo es Restablecer". Ni siquiera puedo detener el dispositivo.

Es difícil creer que no hay forma de recuperar la función SWD. Pero en este hilo sobre otro brazo que (de manera similar al MAX32660) puede reasignar los pines SWD, afirman que el dispositivo solo se puede reprogramar si hay suficiente retraso entre el inicio del código de vector de reinicio y el momento en que reasigna los pines SWD. .

Estoy usando un MAX32660 EVSYS para programar la pieza. ¿Puede este programador (que solo admite SWD) desbloquear la pieza? ¿Podría un programador JTAG desbloquear la pieza?

Si tiene la configuración del depurador para controlar el reinicio del hardware , un comando como "restablecer detener" puede hacerlo. Luego borras el flash ofensivo. Esto funciona en ST, no estoy seguro de su parte, pero es probable que, dado que la funcionalidad de depuración proviene de ARM, sea la parte flash la que es el proveedor. Tenga cuidado, es posible que el depurador no esté impulsando el reinicio del hardware cuando cree que lo está... Pruebe con un osciloscopio sin ningún objetivo conectado para verificar. También vea si la herramienta de carga flash del proveedor tiene algún modo especial, ST tiene un "conectar bajo reinicio" en un menú de opciones.
@Chris. ¡Brillante! Pude borrar el flash a través de la siguiente secuencia: conecte a tierra el pin de reinicio usando el puente, luego en PyOCD: set nreset 0(y deje la ventana interactiva abierta), retire el puente, y en PyOCD: reset halt(y cierre PyOCD), y finalmente en openocd: flash erase_address 0 0x40000. No estoy seguro de por qué no pude hacerlo todo en un solo programa, pero espero no cometer el mismo error con demasiada frecuencia. Gracias.
Muchas configuraciones predeterminadas hacen un restablecimiento parcial del objetivo, puede requerir mucha persistencia lograr que se produzca un restablecimiento del hardware y probar el equipo para verificar que realmente es así. También hay algunos dongles SWD baratos en el mercado donde el encabezado de reinicio del hardware simplemente no está conectado donde el firmware del dongle cree que está...

Respuestas (3)

La solución de Chris (primer comentario) funcionó para mí.

Si tiene la configuración del depurador para controlar el reinicio del hardware, un comando como "restablecer detener" puede hacerlo. Luego borras el flash ofensivo. Esto funciona en ST, no estoy seguro de su parte, pero es probable que, dado que la funcionalidad de depuración proviene de ARM, sea la parte flash la que es el proveedor. Tenga cuidado, es posible que el depurador no esté impulsando el reinicio del hardware cuando cree que lo está... Pruebe con un osciloscopio sin ningún objetivo conectado para verificar. También vea si la herramienta de carga flash del proveedor tiene algún modo especial, ST tiene un "conectar bajo reinicio" en un menú de opciones.

Quería apoyar la solución de Chris y agregar algo de seguimiento para aquellos que usan Keil uVision (V5.36.0.0):

Deshabilité el SWD configurando el campo GCR_SCON.sw_dis en 1 a través de la siguiente interfaz proporcionada por el proyecto de muestra "GPIO (MAX32660_EVKIT)" de Maxim:

MXC_GCR->scon |= MXC_S_GCR_SCON_SWD_DIS_DISABLE;

Lo que da como resultado el siguiente error "Error de comunicación SWD/JTAG":Fallo de comunicación SWD/JTAG

Luego, para volver a poner el SWD en línea, en la configuración del depurador MAX32660_EVKIT CMSIS-DAP cambié Depurar => Opciones de conexión y reinicio => Conectar: ​​"Normal" a "bajo Restablecer".

Capturas de pantalla de las configuraciones relevantes a continuación:CMSIS-DAP_Cortex-M_Driver_Setup_Debug_under-Reset

CMSIS-DAP_Cortex-M_Driver_Setup_Flash-Download

Supuse que podía reprogramar mi MAX32660 manteniéndolo en reinicio, como se hace con los AVR, por ejemplo.

si no. ¡Lo que significa el pin de reinicio y qué es un modo de programación depende de cómo lo diseñe el fabricante!

Dado que los MCU ARM modernos tienden a ser mucho, mucho mejores que los AVR, muchos de ellos tienen un pin de arranque con el que puede seleccionar un gestor de arranque para iniciar y esperar comandos en, por ejemplo, UART y USB (!). Ese cargador de arranque solo puede ser deshabilitado por el ingeniero escribiendo en una dirección específica en flash.

Este es un método muy común para programar en producción. Otro método muy común es usar SWD y cargar firmware que, como el suyo, simplemente deshabilita SWD si no desea que las personas tengan una interfaz de depuración. (Por lo tanto, no creo que "los depuradores no escalan" sea una declaración verdadera. De hecho, SWD es algo bastante bueno y permite mucha programabilidad en el sistema, por ejemplo, cuando desea actualizar el firmware de su controlador de potencia en la placa base de su PC/portátil. Esto escala a un par de millones de unidades...)

De todos modos, su IC definitivamente tiene un gestor de arranque de este tipo; debería poder usarlo para cargar nuevo firmware en su dispositivo. Lea la Guía del usuario del cargador de arranque MAX32660 (UG6471).

El dispositivo solo se puede reprogramar si hay suficiente retraso entre el inicio del código de vector de reinicio y el momento en que reasigna los pines SWD.

Exactamente. El truco que hacen es: configurar un depurador para intentar depurar continuamente y luego liberar el reinicio. No hay garantía de que esto funcione en el primer intento, por lo que es posible que deba intentarlo varias veces.

Puede intentar soltar el pin de reinicio e inmediatamente marcar el reloj SWD.

Si eso no funciona en el primer intento, varíe el tiempo entre estos dos.

Hazlo tantas veces como sea necesario antes de que funcione. Puede tomar un par de miles de intentos hasta que las variaciones aleatorias lo hagan funcionar.

O bien, podría usar un reloj externo en lugar de un oscilador de cristal para cronometrar el núcleo, y simplemente dejar de cronometrarlo después de cronometrar un ciclo de reloj después de liberar el reinicio, luego intente hacer SWD; si eso no funciona, intente con dos ciclos de reloj, y así sucesivamente.

Tampoco es algo que una placa de evaluación hace fuera de la caja. Querría algo como una placa FPGA y tendría que escribir un extenso software de puerta de enlace o usar, por ejemplo, el marco de falla existente de Scanlime.

Esto podría funcionar, pero la solución de Chris (usar una forma del haltcomando que funciona mientras se afirma el restablecimiento) fue mucho más fácil. SWD escala a millones de unidades, sí. Pero si ya tengo otra forma de conectividad, puedo usarla para actualizaciones de firmware. Mi declaración fue que los depuradores no se escalan, lo cual es cierto (intente depurar cualquier cosa que involucre protocolos de red sin tcpdumpo alguna otra forma de registro de alto rendimiento).
@personal_cloud eso todavía no es cierto.