STM32F7 Bootloader kann nicht zur Anwendung springen

Mein Problem ist, dass mein Bootloader nicht zur Anwendung springt, oder vielleicht doch, aber dann wegen eines Interrupts zum Bootloader zurückspringt. Um Ihnen etwas zum Arbeiten zu geben, hier einige Informationen:

Der Code, der zur Anwendung springt

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();

}

Wie main in der Anwendung aussieht

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++);
}

Es sollte vielleicht darauf hingewiesen werden, dass dieses Programm gut funktioniert, wenn ich es über ST-Link ohne Bootloader-Code programmiere. Die wichtigen Teile dieses Codes sollten auch die ersten Zeilen sein, in denen ich die ISRs in den RAM kopiere und dann den Vektor verschiebe

Das Linkerscript sieht wie folgt aus, um Ihnen eine Vorstellung davon zu geben, woher die Adressen stammen (es sieht sowohl im Bootloader als auch in der Anwendung gleich aus).

/* 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
}

Mein Problem ist also, dass es nicht funktioniert, wenn ich versuche, zur Anwendung zu springen

Die ersten Adressen ab 0x8008000 (Startadresse der Anwendung) sehen aus

Geben Sie hier die Bildbeschreibung ein

Und bei der Adresse 0x08004DD1 sieht es so aus

Geben Sie hier die Bildbeschreibung ein

Was passiert ist, dass ich immer hängen bleibe, wenn der Programmzähler auf zeigt (er bewegt sich nicht von dieser Adresse, wenn er versucht, weiter zu gehen)

0x8007770

und MSP

0x2004ffe0

in der output.map für den bootloader kann ich sehen das 0x08007770 steht

.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 )

Weiß jemand was mein Problem ist und wie ich es lösen kann? Bitte zögern Sie nicht, Fragen zu stellen, wenn Sie das Gefühl haben, dass ich es verpasst habe, Ihnen etwas zu sagen

Sollte nicht ideklariert werden volatile, um zu vermeiden, dass die Schleife vom Optimierer des Compilers entfernt wird?

Antworten (1)

Sie sollten Ihre Linker-Skripte dahingehend anpassen, dass die Programme in getrennte Flash-Bereiche geladen werden sollen. Also, für den Bootloader, den Sie brauchen

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

und für die Bewerbung:

FLASH (rx)      : ORIGIN = 0x08008000, LENGTH = 992K /* (992 = 1024 - 32 */
Danke, das hat tatsächlich die Dinge geändert. Es funktioniert noch nicht, aber was passiert, wenn ich das mache, ist, dass sich die Adresse, die in den Bildern 0x08004DD1 ist, in 0x0800CDCD ändert und wenn ich zu dieser Adresse gehe, ist sie leer. Das bedeutet, dass es keine Daten von dieser Adresse gibt. Irgendwelche Ideen woran das liegt? Beim Programmieren verwende ich einfach eine Startadresse und inkrementiere dann mit 4 Bytes, bis die gesamte Bin-Datei programmiert ist
Wenn die Adresse leer ist, etwas mit dem Flash-Vorgang nicht stimmt oder die bin-Datei abgeschnitten wurde, würde ich dieses Problem zuerst debuggen. Beachten Sie auch, dass die tatsächliche Befehlsadresse um eins kleiner ist als der Zeigerwert.
Die Sache ist, dass meine Lösung zum Kopieren des ISR-Vektors memcpy((uint8_t *)&_isr_vector_ram_start, (uint8_t *)&_isr_vector_flash_start, &_isr_vector_flash_end - &_isr_vector_flash_start); basiert auf der Start- und Endadresse des Flashs. Passiert das wirklich, nachdem ich den Speicherbereich geändert habe?
Ja, sie sollten die richtigen Werte aus dem Linker-Skript erhalten, aber ich würde trotzdem mit einem Debugger nachsehen, um sicherzugehen.
Mir ist aufgefallen, dass, wenn ich die App über ST-Link programmiere und die Startadresse 0x08008000 wähle, es funktioniert und kein Code an der Adresse fehlt, auf die ich zuvor hingewiesen habe. Aber ich bin mir nicht sicher, wo das Problem liegen könnte. Da alle Daten aus der bin-Datei scheinbar im Flash sind, wenn ich den Bootloader verwende, ist jedoch klar, dass Daten auf den Speicheradressen fehlen. Wissen Sie, ob ST-Link etwas Besonderes tut, außer nur die BIN-Datei auf Flash zu kopieren?
ST-Link kopiert einfach die Bytes und verifiziert sie dann. Ich bin mit der F7-Serie nicht so vertraut, aber bei der F4 gab es viele Möglichkeiten, wo die Flash-Programmierung schief gehen konnte. Nun, das Problem "Zur Anwendung springen" ist anscheinend gelöst, vielleicht könnten Sie eine andere Frage zum Problem der Flash-Programmierung stellen.
Problem gelöst. Es war tatsächlich die Flashprogrammierung, die wegen überlaufender Puffer fehlschlug. Das Linkerscript könnte entweder 0x08008000 oder 0x08000000 sein, aber ich werde dies trotzdem als die richtige Antwort markieren