firmware ARM Cortex M3

4

Primero alguna información de fondo.

Hay un producto (un sensor) comprado a un fabricante del lejano oriente, que bendiga sus calcetines de algodón blanco, que usa el microcontrolador STM32F103V. El firmware que se suministró originalmente, junto con las actualizaciones, tiene algunos errores desagradables que convierten el producto en un bloque a intervalos aleatorios (y se espera que el producto funcione sin tiempo de inactividad durante meses).

Al principio, eran receptivos y estaban ansiosos por brindar apoyo; Después de la compra, no están respondiendo a ninguno de los correos electrónicos enviados.

Entonces, la solución es volver a escribir el firmware por mí mismo.

Sobre el problema ahora.

El microcontrolador ya tiene un cargador de arranque y no hay ningún puerto JTAG disponible en las placas. ¿Hay alguna forma de encontrar, desde los archivos bin que tengo, cuál es la dirección de inicio del firmware? Debido al gestor de arranque, no es 0x00000000. Además, ¿hay alguna otra cosa que deba tener en cuenta al escribir el firmware (es decir, ciertas configuraciones para registros, también)?

    
pregunta Iulian

2 respuestas

3

Te recomiendo que obtengas una parte equivalente y una tabla de ruptura. Solo deberías necesitar poder y tierra y vdda. obtén el paquete más pequeño si lo prefieres (más barato). otra opción es una placa de núcleo, y es posible que desees el final de la depuración de todos modos, querrás desconectar el swd / debugger para que puedas obtener lo que estoy buscando ...

las partes vienen preprogramadas desde ST con un cargador de arranque en ellas. Correas boot0 de la manera correcta y luego puedes programar a través de uart. en cualquier momento debería poder utilizar la interfaz swd (jtag-ish). Utilizo el extremo superior de estas tarjetas para programar otros chips, ellos quieren usar el dispositivo mbed y se montan como una unidad de disco y arrastran y sueltan el archivo. no es la experiencia que busca después de una experiencia de entorno controlado utilizando openocd o algo así en swd para tratar con una de estas partes. Por lo tanto, la idea de obtener un tablero de descubrimiento, o una ruptura u otro. no debería costarle más de $ 20 en total, tal vez $ 10 dependiendo de la ruta que tome.

una vez que lo experimentes con una placa que no tiene nada más que hacer, puedes adaptar ese conocimiento a tu placa en el circuito. los pines uart pueden ser reutilizados, por ejemplo, por lo que es posible que no pueda acceder al cargador de arranque principal. No puedo imaginar que los pines del swd sean reutilizados, querrían tener una manera de hacer una actualización del firmware en el circuito. Es posible que preprogramen las piezas para la producción, pero también es posible que las programen en circuito. También puede ser posible que se puedan programar una sola vez, pero no se veían tan de cerca en su número de referencia.

Como Chris Stratton mencionó que la tabla vectorial será una lista de direcciones, comience con un número de tipo 0x2000x000 y luego con números impares, desde un puñado hasta docenas, posiblemente muchos de ellos apuntando al mismo controlador. 0x00000051 0x00000071, 0x00000103, etc. no necesariamente incrementando su valor. La tabla de vectores, etc. están todas en los documentos st y arm en cuanto a lo que hacen.

Creo que el flash del usuario está basado en 0x08000000, por lo que en el código puede haber direcciones basadas en eso. en realidad, la tabla de vectores puede / debe contener vectores en ese espacio

08000000 <_start>:
 8000000:   20001000    andcs   r1, r0, r0
 8000004:   08000041    stmdaeq r0, {r0, r6}
 8000008:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800000c:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000010:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000014:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000018:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800001c:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000020:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000024:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000028:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800002c:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000030:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000034:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000038:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800003c:   08000047    stmdaeq r0, {r0, r1, r2, r6}

a menos que se hayan hecho cargo del gestor de arranque incorporado (si es posible).

mire el pinout del paquete y averigüe dónde están los pines de swd, y colóquelos en el tablero, no me sorprendería si hubiera algunas almohadillas. ir con una placa de núcleo de $ 10 es más barato que un enlace de $ 15, aunque ambos son relativamente baratos, prefiero la ruta del núcleo o una placa de descubrimiento y uso la parte frontal para programar partes en el circuito. bastante fácil de conectar con openocd.

    
respondido por el old_timer
5

¿Está seguro de que no puede acceder a los pines SWD en el dispositivo? Parece poco probable que el fabricante tenga una parte que no puedan depurar ellos mismos. No es como si hubieran mostrado alguna preocupación por proteger su IP hasta la fecha. Compruebe que el gestor de arranque ST no responde también. Tal vez el fabricante escribió herramientas personalizadas para interactuar con este gestor de arranque.

Supongo que has desensamblado el archivo bin. ¿Viste algo que parece una tabla vectorial? A diferencia de los núcleos de clase A que tienen un bloque de LDR PC,[PC#0x20] repetido (o algo similar), seguido de una cadena de direcciones, en la clase M, la tabla vectorial es siempre una lista de direcciones con el bit 0 establecido (igual que para cualquier rama al pulgar). Antes de las direcciones de vectores es el valor de puntero de pila inicial. En realidad, cualquier PC de carga relativa de PC debería darle algunas pistas, nuevamente, éstas harán referencia a un valor de número impar.

    
respondido por el Sean Houlihane

Lea otras preguntas en las etiquetas