STM32 Softreset -> Bootloader

OP #4128032
Lesenswert?

Hallo,

ich nutze eine STM32F439ZI und würde gerne durch einen Softreset in den 
Bootloader mode springen. Ist das überhaupt so möglich wie ich mir das 
denke?
1
    asm(
2
      "LDR     R0, =0x00000000 \n\t"
3
      "LDR     R1, =0x00000001 \n\t"
4
      "STR     R1, [R0]        \n\t"
5
    );
6

7
    NVIC_SystemReset();

Die Idee dahinter ist in das Boot0 Register eine '1' zu schreiben und 
dann einen Softreset durchzuführen. Dadurch sollte der STM dann in den 
Bootloader mode laufen.

Danke für eure Antworten

MaTT
Gast #4128047
Lesenswert?

Die Blackmagic Debug Probe macht das mit einem Vectorreset. Ein 
Vectorreset setzt nur den Kern zurueck, nicht die Peripherie.

include/cortexm.h:#define CORTEXM_AIRCR_SYSRESETREQ     (1 << 2)
include/cortexm.h:#define CORTEXM_AIRCR_VECTRESET               (1 << 0)

Dein Code oben macht einen Systemreset. Das setzt auch die Peripherie 
zurueck.

Mit dem Vectorreset kann man vorher in SYSCFG den Bootmodus setzen.
OP #4128060
Lesenswert?

Ich habe inzwischen auch von "sourcer32@gmail.com" folgendes probiert

Call reboot loader:
1
Reboot_Loader();

In the startup code:
1
.global Reboot_Loader
2
Reboot_Loader:
3
                LDR     R0, =0x40023844  // RCC_APB2ENR
4
                LDR     R1, =0x00004000  // ENABLE SYSCFG CLOCK
5
                STR     R1, [R0, #0]
6
                LDR     R0, =0x40013800  // SYSCFG_MEMRMP
7
                LDR     R1, =0x00000001  // MAP ROM AT ZERO
8
                STR     R1, [R0, #0]
9
                LDR     R0, =0x1FFF0000 // ROM BASE
10
                LDR     SP,[R0, #0]     // SP @ +0
11
                LDR     R0,[R0, #4]     // PC @ +4
12
                BX      R0

dann hängt das system und über USB kann ich trotzdem nicht auf den 
bootloader zugreifen.
Gast #4128474
Lesenswert?

Wahrscheinlich ist es etwas aufwändiger, beim F439 ganz besonders wegen 
der 2 Speicherbämke. Die Bootloader-App.Note AN2606 sagt:
1
user might execute Bootloader by performing a jump to
2
system memory from user code (refer to table 64 for system
3
memory address). Before jumping to Bootloader user must:
4
 * Disable all peripheral clocks
5
 * Disable used PLL
6
 * Disable interrupts
7
 * Clear pending interrupts
8

9
Note: For some products with dual bank mechanism, the jump to
10
      Bootloader might result in jumping again to user code
11
      (and thus Bootloader communication protocol is not executed).
12
      Please refer to product's "Dual Bank Boot Implementation"\
13
      flowchart for more details.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren