Atmel SAM3X8E conmutación de doble banco para arrancar diferentes comportamientos

Actualmente estoy trabajando con una placa Arduino Due que tiene un procesador Atmel SAM3X8E integrado. Lo estoy programando usando Atmel Studio (versión 7.0.1645) y el Marco de software de Atmel proporcionado (versión 3.28.1). El propósito del programa que se ejecuta en el SAM es obtener la funcionalidad de reprogramación. Por lo tanto, el programa obtiene la imagen de una PC host, la muestra bloque por bloque en el banco de flash no utilizado y verifica la imagen. Todo eso funciona bien, pero me encuentro con el mismo problema que esta publicación Atmel SAM3X el cambio de banco dual no funciona).

El Atmel SAM3X8E tiene dos bancos de flash de 256 kByte, Flash0 y Flash1. Mi aplicación cabe fácilmente en Flash0 y está programando la imagen recibida en Flash1. Mi idea es utilizar las funciones del SAM3X para arrancar desde el otro banco de flash (el valor predeterminado es Flash0). La hoja de datos del SAM3X establece en la página 35 que GPNVM Bits se pueden usar no solo para elegir la memoria de arranque (ROM o Flash) sino también para elegir el banco desde el que arrancar (Flash0 o Flash1). Si GPNVM2 está configurado, el µC se iniciará desde Flash1. Esto se logra al reasignar el diseño de la memoria. Por lo tanto, si GPNVM2 está configurado, Flash1 se asigna a la dirección 0x0008_0000 (mientras que Flash1 y Flash0 son continuos). Si GPNVM2 se borra, Flash0 se asigna a la dirección 0x0008_0000 (ahora Flash0 y Flash1 son continuos).

Lo que he hecho es manipular el bit GPNVM2 antes de reiniciar el procesador, pero no funcionó (la memoria no se reasignó correctamente). También estaba jugando con las opciones de Atmel Studio. Atmel Studio puede programar una aplicación para Bank0 o Bank1 utilizando las "Opciones de proyecto" -> "Herramienta" -> "Configuración del programa". Intenté programar mi aplicación con esta configuración en Bank1. Solo es posible si la casilla de verificación "Anular registro de desplazamiento de tabla de vectores (excepción_tabla)" está marcada y si el dispositivo está programado con "Iniciar depuración". Si el dispositivo está programado usando "Iniciar sin depuración", no arranca en absoluto, para que se inicie (recuerde que la aplicación se actualizó en Bank1, si la reasignación fue exitosa, Bank1 debe ubicarse en la dirección 0x0008_0000 donde originalmente se asignó Bank0 a ) Tuve que cambiar los bits de GPNVM manualmente (usando las herramientas "Herramientas" -> "Programación de dispositivos") para "arrancar desde el banco0". Entonces funcionó.

El comportamiento descrito me enseñó que debo haber fallado en manipular algunos registros. Obviamente, el "Anular registro de desplazamiento de tabla de vectores (except_table)" es importante, por lo tanto, también configuré el "Registro de desplazamiento de tabla de vectores (VTOR)" en la dirección de inicio de Flash1, lo que tampoco ayudó. Tengo la sensación de que me faltan algunas funciones o registros que tengo que llamar / manipular.

Para reprogramar el procesador, normalmente es necesario tener algún tipo de gestor de arranque en ejecución que esperaba evitar usar la mecánica de cambio de banco. ¿Alguien tiene alguna experiencia sobre este cambio de banco utilizando las funciones ASF o en general sobre el cambio de banco en un SAM3X?

¡Gracias de antemano

Respuestas a la pregunta(0)

Su respuesta a la pregunta