Forum: Mikrocontroller und Digitale Elektronik STM32 Softreset -> Bootloader


von Matthias N. (matt90)


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

von Jim M. (turboj)


Lesenswert?

Addresse 0x00 ist normalerweise nicht beschreibbar, d.h. die STR 
Instruktion generiert einen Fault. Boot0 ist IIRC ein Pin und kein 
beschreibbares Register.

von Uwe Bonnes (Gast)


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.

von Matthias N. (matt90)


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.

von Schaulus Tiger (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.