Forum: Mikrocontroller und Digitale Elektronik STM32F446: JumpToApplication landet in Hard Fault


von Felix F. (wiesel8)


Lesenswert?

Hallo,

ich will mich gerade ins Bootloader-Thema bei ARMs einarbeiten. Also vom 
Bootloader eine Applikation flashen und diese natürlich starten.

Ich habe deshalb eine simple Anwendung erstellt, die eigentlich nichts 
macht, außer sich selbst wieder starten.
Leider funktioniert nicht mal das, da ich sofort im Hard-Fault lande. Da 
mein Breakpoint im ResetHandler nicht triggert, gehe ich davon aus, dass 
es schon beim Aufruf in die Applikation zu springen sofort zu einem 
Hard-Fault kommt.

Da sich der Code so tausendfach im Internet findet, weiß ich auch nicht 
was hier falsch sein könnte.
1
#define ApplicationAddress       ((uint32_t)0x08000000)
2
3
typedef  void (*pFunction)(void);
4
5
pFunction Jump_To_Application;
6
volatile uint32_t JumpAddress;
7
8
...
9
10
Printf("Starting the App...\r\n");
11
DelayMs(10);
12
13
JumpAddress = 0x08000000+4;
14
Jump_To_Application = (pFunction)JumpAddress;
15
16
// Disable all interrupts and systick
17
NVIC_DisableInterrupts();
18
19
/* initialize USER APP Stack Pointer */
20
//__set_CONTROL(0); // Change from PSP to MSP
21
__set_MSP(*(volatile uint32_t*)ApplicationAddress);
22
23
Jump_To_Application();

mfg

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Warum legst du den Stackpointer (MSP) ins Flash?
Beim ersten Schreibzugriff fliegts dir dann um die Ohren.
Bzw beim ersten Zugriff davor, denn da ist nichts.
Der Stack sollte ans Ende des SRAM1

Diese Beispiele funktionieren, weil der Bootloader das Programm in den 
SRAM läd und DAVOR Platz fürn Stack lässt.
Du willst den Code aber ausm Flash ausführen.

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Felix F. schrieb:
> Da sich der Code so tausendfach im Internet findet, weiß ich auch nicht
> was hier falsch sein könnte.

Ohne Optimierung liest er eine Stackvariable ein, stellt aber vorher den 
SP um -> Peng.

Abhilfe: JumpToAddess ist eine statische oder globale Variable.

Der Optimizer sollte das allerdings in ein Register packen.


Ansonsten: Im Debugger einzelne Instruktionen durchsteppen und 
nachschauen was in den Registern so steht.

von Jim M. (turboj)


Lesenswert?

Mw E. schrieb:
> Warum legst du den Stackpointer (MSP) ins Flash?

Macht er nicht, er liesst den SP von der Vektor Tabelle aus. Da sollte 
der auch drin stehen...

von Felix F. (wiesel8)


Lesenswert?

Hallo,

habe die Sprungadresse falsch "berechnet".
So funktionierts nun:
1
Jump_To_Application = (pFunction) (*(uint32_t *)(0x08000000 + 4));

mfg

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

@Jim M
arghs sternchen übersehen :/

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.