STM32 Bootloader per Software aktivieren

OP #3193774
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.