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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Felix F. (wiesel8)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
@Jim M
arghs sternchen übersehen :/

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.