El cargador de arranque salta al problema de la aplicación principal usando STM32 con Keil Uvision

Estoy desarrollando para STM32F0 usando Keil uVision.

Tengo un gestor de arranque personalizado cargado ejecutándose en la dirección 0x08000000. Necesito el cargador de arranque para saltar a mi aplicación principal que flasheo en la dirección 0x08003000. El objetivo final es permitir actualizaciones remotas de la aplicación principal. El código del gestor de arranque que salta a la aplicación es este:

__disable_irq();
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS+4);
Jump_To_Application = (pFunction) JumpAddress;
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
Jump_To_Application();

Recibo una falla grave en la línea Jump_To_Application(), con el mensaje "No se puede acceder a la memoria" dado por Keil.

Dentro de Keil, configuré la dirección de inicio de IROM1 en 0x08003000 en la configuración del proyecto de mi aplicación principal. Siento que el problema radica en algunas configuraciones adicionales dentro de Keil. Por ejemplo, ¿debería configurarse IROM2 en algo? ¿Debería ajustarse algo de los valores predeterminados en la configuración de Keil dentro del proyecto del gestor de arranque?

¿Alguien tiene alguna recomendación?

¿Tiene una solicitud válida en la dirección 0x08003000?
¿Puede agregar las partes relevantes de sus scripts de vinculación (cargador de arranque y aplicación).
Batuu: estoy usando STLink para actualizar la aplicación en 0x08003000.
rfkortekaas: supongo que Keil produce en función de la configuración de la GUI. En realidad, no configuro ningún script manualmente. ¿Qué archivos necesitas ver?

Respuestas (2)

Tuve el mismo problema: lo resolví comentando estas líneas:

__disable_irq();
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);

Algunos consejos para cualquiera que escriba un gestor de arranque por primera vez:

Convierte tu código en pequeñas secciones:

  1. En el primero, escriba un código parpadeante simple sin ninguna interrupción.
  2. uso de la capacidad de borrado de sectores y escriba su cargador de arranque y el código de la aplicación juntos en flash. Ahora solo debe intentar saltar desde el gestor de arranque en el código de la aplicación. Si funciona, significa que tu salto es correcto.
  3. Ahora intente recibir el código de su aplicación con USART (o con cualquier otro periférico) y escriba en flash. Debe funcionar, si no, significa que escribirlo flash es incorrecto (abra el archivo de código hexadecimal y compare los datos flash, la dirección flash y otras cosas con el archivo hexadecimal) (atención a la escritura little_endian)
  4. Ahora escriba un código parpadeante con temporizador e interrupción. Debe funcionar, si no, significa que el error está en saltar la tabla de vectores

Debe volver a configurar el desplazamiento de la tabla de vectores. El desplazamiento es la dirección de inicio de su aplicación.

El código de su cargador de arranque debería verse así:

__disable_irq();
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS+4);
Jump_To_Application = (pFunction) JumpAddress;
SCB->VTOR = APPLICATION_ADDRESS;
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
Jump_To_Application();

Y si usó STM32CubeMX para generar su código, debe agregar la misma línea de código al comienzo de main() de su aplicación:

 SCB->VTOR = APPLICATION_ADDRESS;

Debido a que el sistema reinicia el desplazamiento de la tabla de vectores, el desplazamiento debe reconfigurarse apuntando a la dirección de inicio de su aplicación.