2 votos

STM32 bootloader romper en el problema de la dirección

Estoy escribiendo una pequeña aplicación para iniciar un gestor de arranque que comprueba condiciones simples y luego salta a la memoria de la aplicación. La aplicación parece estrellarse y no soy capaz de averiguar la razón y el depurador está lanzando:

Interrupción en la dirección "0x8000d00" sin información de depuración disponible, o fuera del código del programa.

Empecé el proyecto desde cero en STM32Cube IDE para el microcontrolador STM32F405 con 1Mb de flash. El gestor de arranque se inicia bien - parpadea un LED algunas veces y tiene que saltar a una aplicación que también parpadea el LED a diferentes frecuencias y lee la entrada del botón para cambiar el LED. En este momento, la secuencia del gestor de arranque se carga y luego se detiene - nada del código de la aplicación.

El gestor de arranque se encuentra en 0x08000000 y he asignado 64Kb. El espacio de la aplicación empieza en 0x08020000 y tiene asignados 768Kb.

Así es como estoy saltando al espacio de la aplicación desde el programa del cargador de arranque:

void (*app_reset_handler)(void) = (void*)(*((volatile uint32_t*) (0x08020000 + 4U)));
app_reset_handler();    

En mi programa de aplicación, he definido el campo de la dirección base de la flash:

#define VECT_TAB_OFFSET         0x00020000U

y definió las definiciones de memoria para el flash:

FLASH    (rx)    : ORIGIN = 0x08020000,   LENGTH = 768K

He seguido los mismos pasos para una implementación anterior en F401 que parece funcionar bien. ¿Alguna idea de cómo depurar este problema?

0voto

Bevan Puntos 20976

Esto es lo que me funciona en el STM32L4. Puede que te falte el paso de cambiar a la pila de la aplicación antes de saltar a la aplicación.

Otras cosas que hay que tener en cuenta: Mi aplicación está en un desplazamiento diferente al tuyo. El programa de arranque utiliza VECT_TAB_OFFSET de 0 mientras que la aplicación utiliza el offset. Asegúrese de que el archivo enlazador de su aplicación pone la tabla de vectores de reinicio al principio de la sección (es decir, lo primero en el offset).

#ifdef BOOT
#define VECT_TAB_OFFSET  0x00 /*!< Vector Table base offset field.
                                   This value must be a multiple of 0x200. */
#else
#define VECT_TAB_OFFSET  0x80000
#endif

#define MAIN_PROG_BASE_ADDR 0x08080000U

typedef void (*pFunction)(void);

void JumpToMainProgram()
{
    pFunction MainProgram = (pFunction)(*(uint32_t*)(MAIN_PROG_BASE_ADDR + 4));

    // Switch to main program's stack.
    __set_MSP(*((uint32_t*)(MAIN_PROG_BASE_ADDR)));

    // Jump to main program.
    MainProgram();
}

Mi programa de arranque primero valida la aplicación principal y luego simplemente llama al JumpToMainProgram() función.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X