Ejecución continua después del ISP en la serie LPC81x

2

Estoy cargando software a través de un ISP serial en un microcontrolador de la serie LPC81x. Este es un chip Cortex-M0 +. Después de cargar el software, me gustaría iniciar la ejecución del software cargado sin tener que reiniciar la CPU externamente.

Hay un comando "Ir" en el ISP serial y el software "lpc21isp" lo usa como tal: "G 0 T \ r \ n". Sin embargo, esto no parece funcionar ya que tiene varios problemas:

  • La parte del programa que reside en la dirección 0x00000000 es la tabla de vectores de interrupción, no el código de programa. Iniciar la ejecución en modo pulgar en esa dirección solo va a fallar. Sin embargo, no sé qué hace realmente el comando "ir".
  • Alguien debe configurar el puntero de la tabla de interrupciones (VTOR), restablecer todas las configuraciones de pin e invocar el controlador de reinicio. Esto es muy diferente de iniciar la ejecución en una dirección determinada.
  • La documentación dice que no se admite el uso del comando "ir" en una dirección debajo de 0x00000200. En mi caso, al menos el controlador de reinicio reside debajo de esa dirección.

Estoy abierto a cualquier sugerencia que me permita continuar con la ejecución después del ISP.

Al igual que información adicional: la razón por la que deseo hacer esto es que no tengo líneas de comunicación de repuesto para restablecer o forzar el ISP. Sin embargo, puedo cambiar el poder al chip. Me gustaría que el chip se inicie incondicionalmente en modo ISP, por lo que puedo actualizar el software en cada arranque de chip si lo deseo.

    
pregunta Nakedible

3 respuestas

2

Tengo el mismo problema con el LPC 8xx en una aplicación, donde la única conexión al exterior es RX y TX, apagar y encender el pin de reinicio no es una opción. Abrí un caso de soporte en NXP. Mientras esperaba su respuesta, encontré la siguiente solución.

  1. Asegúrese de tener una función de reinicio por software en su código. P.ej. NVIC_SystemReset
  2. Vincule esta función a una ubicación fija en la memoria flash en la dirección 0x200 o superior. Mire en la documentación de su IDE / Linker cómo hacerlo.
  3. Después de la programación, ejecute el comando "Ir". Para 0x200 use "G 512 T".

Esto funciona bien para mí, pero no puedo entender por qué no han implementado un comando de reinicio en su cargador de arranque.

¿Puede especificar su propia dirección GO en lpc21isp? Si no, intente usar mxli, esto funciona bien para mí usando la opción -j [dirección].

También puedes ver el comando "reinvocar ISP" descrito en la sección IAP para ingresar al modo ISP desde la aplicación.

Recibí una respuesta de NXP:

  

Si conoce la dirección de su código de inicio (del mapa del vinculador),   Podría usar el comando GO para iniciar el código de usuario. La forma en que lo haces,   el uso de la función SystemReset es aún mejor, ya que genera un   reinicio real e inicia todos los valores de registro a sus valores por defecto. Ahí   no hay mejor manera de iniciar la ejecución del programa después de una actualización de firmware.

    
respondido por el Manu3l0us
1

Tengo el mismo problema. El comando ISP 'GO "no funciona para Cortex. De hecho, no puede funcionar, porque en un Cortex el SP inicial se carga desde una dirección particular, no está establecido por el código como para los chips ARM.

Mi solución es restablecer el chip para forzar un reinicio, eliminando (y volviendo a aplicar) la alimentación. Esa es la única forma real, porque (al menos en los chips que uso) el pin 'reset' se puede configurar como GPIO.

    
respondido por el Wouter van Ooijen
1

¿Usar el Watchdog no es una opción? El LPC81x cuenta con un watchdog que se puede configurar / deshabilitar y también contiene una bandera si el reinicio fue activado por un reset del watchdog.

    
respondido por el Tom L.

Lea otras preguntas en las etiquetas