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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.