Forum: Mikrocontroller und Digitale Elektronik STM32 Bootloader per Software aktivieren


von Michael B. (michael_b93)


Lesenswert?

Hallo zusammen.

Ich habe folgende Zielstellung:
Der STM32F103RC soll per Software in den Bootloader versetzt werden.
Ich programmiere die Firmware in C (und nötigenfalls auch etwas 
Assembler).

Nach durchsuchen diverser Foren, habe ich 2 Möglichkeiten gefunden dies 
zu bewerkstelligen und habe im Moment folgendes implementiert:

Funktion die Aufgerufen wird:
void swReset(void)
{
  __DSB();
  *((unsigned long *)(0x2000FFF0)) = 0xDEADBEEF;
  NVIC_SystemReset();
}

Dabei ist NVIC_SystemReset() folgende SW-Reset Funktion:
void NVIC_SystemReset(void)
{
  /* Ensure all outstanding memory accesses included
     buffered write are completed before reset */
  __DSB();

  /* Keep priority group unchanged */
  SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |
                 (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                 SCB_AIRCR_SYSRESETREQ_Msk);

  /* Ensure completion of memory access */
  __DSB();

  /* wait until reset */
  while(1);
}

Diese Funktion führt zum Aufruf vom Restart Handler, welcher dann an die 
nötige Zieladresse springt:
{
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main

                LDR        R0, = 0x2000FFF0
                LDR        R1, = 0xDEADBEEF
                LDR        R2, [R0, #0]
                STR        R0, [R0, #0] ; Invalidate
                CMP        R2, R1
                BEQ        Reboot_Loader

                LDR     R0, =__main
                BX      R0
                ENDP

; Reboot loader
Reboot_Loader    PROC
                 EXPORT    Reboot_Loader
                 LDR        R0, =0x1FFFF000
                 LDR        SP,[R0, #0]
                 LDR        R0,[R0, #4]
                 BX        R0
                 ENDP
}

Wie erwähnt, funktioniert dies auch eigentlich.

Boot1 ist über Widerstand an GND.
Boot0 hängt über einen Flipflop und etwas Zusatz an 2 Buttons, sodass 
Boot0 -> GND normal und nur wenn beide Buttons beim Einschalten der 
Stromversorgung betätigt sind wird Boot0 -> High und das Gerät geht "per 
Hardware" in den STM32 Bootloader.

Ich leide jedoch an einem eigenartigen Effekt, den ich nicht verstehe.
Wenn ich die Leiterplatte, auf der der STM verbaut ist, in ein Gehäuse 
Einbaue, kann ich die SW Methode nicht mehr verwenden, die HW Methode 
schon und auch sonst gibt es im Betrieb der Firmware keinerlei Probleme 
im Gehäuse.

Auf das Senden vom Init (0x7F) Kommando folgt im Gehäuse keine Antwort 
mehr vom STM32.
Die angeschlossenen Kabel sind die Selben, ich habe auch die Erdung des 
Gehäuses geprüft.
Keine Leiterbahn und kein Pin haben Kontakt zum Gehäuse, es treten auch 
sonst keine Effekte auf, wenn die LP im Gehäuse verbaut ist, auch EMV 
Prüfung hat sie im Gehäuse gemeistert.

Ich fürchte, dass Ihr mir jetzt auch nicht aus dem Stehgreif sagen könnt 
was das Problem ist, aber vielleicht hatte von euch schon einmal jemand 
ein Problem im Zuge von Restarts bei einem STM32, oder noch einen 
Vorschlag was ich prüfen sollte.

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.