STM32F7 Bootloader no puede saltar a la aplicación

0

Mi problema es que mi cargador de arranque no está saltando a la aplicación, o tal vez sí, pero luego regresa al cargador de arranque debido a una interrupción. Para darte algo con que trabajar, aquí hay información:

El código que salta a la aplicación

typedef void (*pFunction)(void);

pFunction Jump_To_Firmware;

void JumpToInternalFlashImage()
{
    Jump_To_Firmware = (pFunction) (*(uint32_t *)(0x08008000 + 4));

    __set_MSP(*(uint32_t*) 0x08008000);

    Jump_To_Firmware();

}

Cómo se ve main en la aplicación

int main(void)
{
    // Copy ISRs to RAM
    memcpy((uint8_t *)&_isr_vector_ram_start, (uint8_t *)&_isr_vector_flash_start, &_isr_vector_flash_end - &_isr_vector_flash_start);

    // Relocate the vector table
    SCB->VTOR = (uint32_t) &_isr_vector_ram_start;

    HAL_Init();

    SystemClock_Config();

    MX_GPIO_Init();
    MX_DMA_Init();
    MX_USART2_UART_Init();

    while (1)
    {
        HAL_UART_Transmit_DMA(&huart2, "hello", 5);

        uint32_t i =0;
        for(;i<1000000;i++);
}

Tal vez debería señalarse que este programa funciona bien si lo programo a través del enlace ST sin ningún código del cargador de arranque. Además, las partes importantes de este código deberían ser las primeras líneas en las que copio los ISR en la RAM y luego reubico el vector

El linkerscript se parece a lo siguiente para darle una idea de dónde provienen las direcciones (se ve igual en el cargador de arranque y en la aplicación)

/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = 0x20050000;    /* end of SRAM2 */

/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0;      /* required amount of heap  */
_Min_Stack_Size = 0x400; /* required amount of stack */

// There are more areas but these should be the only relevant ones
MEMORY
{
   FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024K
   RAM_ISR (xrw)   : ORIGIN = 0x20000000, LENGTH = 512
   RAM (xrw)   : ORIGIN = 0x20000200, LENGTH = 64K - 512
}

SECTIONS
{
    /* The startup code goes first into FLASH */
    .isr_vector :
    {
        . = ALIGN(4);
        _isr_vector_flash_start = .;
        KEEP(*(.isr_vector)) /* Startup code */
        _isr_vector_flash_end = .;
        . = ALIGN(4);
    } >FLASH

   ._isr_vector_ram (NOLOAD) :
   {
       . = ALIGN(4);
       _isr_vector_ram_start = .;
       KEEP(*(._isr_vector_ram)) /* Startup code */
       . = ALIGN(4);
   }>RAM_ISR
}

Mi problema es que cuando intento saltar a la aplicación no funciona

Las primeras direcciones de 0x8008000 (dirección de inicio de la aplicación) se ven como

Yaladirección0x08004DD1separecea

Lo que sucede es que siempre me quedo atascado cuando el contador del programa apunta a (no se mueve de esta dirección cuando intento avanzar)

0x8007770

y MSP

0x2004ffe0

en el output.map para el gestor de arranque puedo ver que 0x08007770 es

.text.Default_Handler
            0x08007770        0x2 startup/startup_stm32f746xx.o
            0x08007770                RTC_Alarm_IRQHandler
            0x08007770                EXTI2_IRQHandler
            0x08007770                TIM8_CC_IRQHandler
            0x08007770                DebugMon_Handler
            0x08007770                UART8_IRQHandler
            0x08007770                SPI4_IRQHandler
            0x08007770                TIM1_CC_IRQHandler
            0x08007770                DMA2_Stream5_IRQHandler
            0x08007770                HardFault_Handler
 and so on (the rest of the handlers )

¿Alguien sabe cuál es mi problema y cómo resolverlo? Por favor, siéntase libre de hacer preguntas si siente que no pude decirle algo

    
pregunta user3660570

1 respuesta

0

Debe ajustar las secuencias de comandos del vinculador para reflejar el hecho de que los programas deben cargarse en áreas de flash separadas. Por lo tanto, para el gestor de arranque que necesita

FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 32K

y para la aplicación:

FLASH (rx)      : ORIGIN = 0x08008000, LENGTH = 992K /* (992 = 1024 - 32 */
    
respondido por el berendi

Lea otras preguntas en las etiquetas