STM32 Wie booten von SRAM?

Gast #1721780
Lesenswert?

Hallo,
da ich jetzt nach 5 Wochen endlich mein DEV-Board von Futurlec bekommen 
habe, werde ich nun reichlichst die Register durchgehen. Dabei werden 
natürlich sehr viele (und vor allem sehr kleine!!!) Programmmversionen 
fällig, die ich, wenn möglich, aus Verschleißgründen nicht immer ins 
Flash programmieren will. Das hält zwar laut Datenblatt mindestens 
10.000 Zyklen aus, muß ja aber nicht sein, zumal der STM32 ja das booten 
aus dem SRAM unterstützt (über die Bootpins 0 und 1). Der Grund ist ja 
aber eigentlich auch egal.
Im Manual (13902) konnte ich nun unter 2.4 "Boot configuration" aber nur 
folgendes finden:
When booting from SRAM, in the application initialization code, you have 
to relocate the vector table in SRAM using the NVIC exception table and 
offset register.
Der offset vom SRAM beträgt 0x20000000, soweit ganz gut. Aber mehr Infos 
konnte ich nicht finden, wie man das machen soll. Auch Google war 
diesmal nicht mein Freund (außer das der GCC gerade hierbei irgendwie 
eine 17 byte offset-Fehler hatte ...). Das ganze sollte daher wohl eher 
am Ende meiner Übungen angesiedelt sein, nur ist es dann ja schon zu 
spät.
(Firma: EleLa - www.elela.de) #1722085
Lesenswert?

Einfach mal im Linker-File den ROM-Bereich ab 0x20000000 setzen und 
probieren?
Auch die Vector Table auf die Adresse verschieben (die .s Datei der 
FW-Lib), dann sollte es klappen...

Das andere Problem ist das Laden, da manche GDB Server automatisch den 
Flash-Bereich 0x08000000 kennen und einen Offset beim Schreiben machen. 
Wenn der nach 0x28000000 schreiben möchte, muss man lesen in der Doku 
des GDB Servers wie man dem die andere (richtige) Adresse beibiegen 
kann.

Ich hatte noch nicht das Bedürftnis, ist also nur geraten.
Gast #2258553
Lesenswert?

Während der Entwicklungsphase lass ich auch oft meinen Code im SRAM 
laufen. Ich kann allerdings nur erzählen, wie das unter IAR geht:

Dass das Linker File angepasst werden muss, ist klar und wurde schon 
gesagt. Als nächstes muss man dafür sorgen, dass die Interrupt Vektoren 
an der richtigen stelle gefunden werden. Dazu muss die richtige Adresse 
in SCB->VTOR geschrieben werden, BEVOR ein Interupt ausgeführt wird. 
Dies erledigt man in den ersten Zeilen des Programmcodes. Wenn man die 
ST-Lib verwendet, geht das ganz einfach über SystemInit() per #define 
VECT_TAB_SRAM.
Beim laden auf den Controller darf dann natürlich kein Flashloader 
verwendet werden - die Bytes müssen halt einfach 1:1 an die 
entsprechende Adresse geschrieben werden.

Wie nun der Start des Programms abläuft kann ich auch nicht sagen. Aber 
es funktioniert ganz einfach. Ich vermute, dass IAR einen JTAG soft 
reset auslöst und den Controller einfach zwingt, an der angegebenen 
Adresse zu starten - die Bootpins können ja per JTAG nicht umgeschalten 
werden. (Das könnte der knifflige Teil beim GDB werden....)

Ach ja: Nicht vergessen sollte man, dass der Code im internen SRAM mit 
anderer Geschwindigkeit läuft. Bei den F10X schneller, bei den F2XX 
erstmal langsamer (der Flash Accelerator funktioniert wirklich 
erstaunlich gut)

Dann hoffe ich mal, das hilft Dir ein wenig. Und wünsch Dir viel Spaß 
mit diesen wirklich gelungenen Controllern.
#2258609
Lesenswert?

Bei Keil geht das auch. In den Projektoptionen einfach bei IROM einen 
Teilbereich des SRAM eintragen. Bei IRAM einen anderen Teilbereich des 
SRAM eintragen. Dann teilen sich Programm und Daten den SRAM. 
Vectortabelle wie oben schon gesagt noch in den SRAM legen. Mache ich 
so:
1
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);   // RAM Vector Table ab 0x20000000 (Beispiel STM32F103RB)

Zum testen ideal, natürlich nur begrent nutzbar, wenn das Programm klein 
ist.
Gast #2259124
Lesenswert?

Hallo,
bitte beachtet beim STM32F das Problem des LDRD Befehls, ich weiss nicht 
ob der Fehlerfrei aus dem RAM ausgeführt wird ?
Die Ausführungszeiten sind aus dem RAM auch anders !
Normalerweise ist das einspielen ins RAM kein Problem, man braucht ja 
noch nicht einmal einen Flashloader. Mit ST-Link oder JLink oder 
ähnlichem über JTAG kein Problem, denn der Flashloader wird ja auch 
zuerst ins RAM eingespielt. Bei IAR gibt es sogar einen Flashloader der 
ins RAM einspielt.
Klar beim Linkerscriptfile einfach die neue Adresse angeben und die 
Register die noch geändert werden müssen übernimmt auch der Debugger, 
hierfür gibt es auch eine Art Scriptfile.
Gruß Sascha
#2259131
Lesenswert?

Sascha schrieb:

> bitte beachtet beim STM32F das Problem des LDRD Befehls, ich weiss nicht
> ob der Fehlerfrei aus dem RAM ausgeführt wird ?

Was hat denn das mit ROM/RAM zu tun? Der dokumentierte LDRD Bug kann 
auftreten, wenn darin das Basisadressregister auch in der Registerliste 
aufkreuzt und er mittendrin unterbrochen wird. Wo der Befehl steht 
erscheint mir dabei ziemlich irrelevant.
Gast #2259329
Lesenswert?

Der LDRD Bug tritt nur auf, wenn der Befehl über den System Bus geladen 
wurde. Das ist beim SRAM der Fall und da wäre es folglich möglich. Beim 
Flash wird er über den I-Bus geladen, da kann er also nicht auftreten.

Ich vertraue jedoch mal auf die Aussage, dass die Compiler die 
Befehlssequenz sowieso nicht mehr generieren.
Gast #2260637
Lesenswert?

Irrtum, habe vorgestern einige Routinen des IAR Compilers 
disassembliert, genau wegen dieser Frage, der Befehl wird weiterhin 
verwendet.
Weil es gibt ja auch andere Cortex M3 CPUs.
Ich denke die gehen nicht davon aus, dass die Application jemals SRAM 
oder DRAM sieht, sonder nur Flash !!!
Gruß Sascha

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren