Forum: Mikrocontroller und Digitale Elektronik STM32F4 Binärfile ins RAM schieben


von timertick_t (Gast)


Lesenswert?

Kann man Code für den internen RAM-Bereich des 407 erzeugen und diesen 
dann wie gewohnt per Reset starten anstatt ihn wie sonst üblich auf 
0x08000000 zu flashen? Hab schon viele Zyklen runter;-)

von Mike R. (thesealion)


Lesenswert?

zu 1: Ja
zu 2: Jein (als Stichwort zum Suchen: "BOOT0" und "BOOT1")

Ansonsten: hier wird dich hier keiner wegen deines Alter ausschließen 
:-)

von Heiko Jakob (Gast)


Lesenswert?

Ja das geht.

Aber immer daran denken:
- das dann weniger RAM zum arbeiten übrig bleibt.
- 0xF1E0F85F an 0x200001E0 schreiben damit das Startverhalten 
vergleichbar bleibt und der Resethandler an 0x20000004 angesprungen wird

von Little B. (lil-b)


Lesenswert?

Das überlege ich mir auch schon länger, da das Programm hoffentlich 
schneller ins RAM des STM geschrieben ist als ins flash.

Ich habe mir bisher nur konzeptionelle Gedanken dazu gemacht, aber 
vieleicht sind diese Hilfreich:

Zu allervorderst: Der STM kann Programme aus dem RAM ausführen und sogar 
direkt davon starten. Das können nicht alle Mikrocontroller, vor allem 
die kleinsten nicht.
Beim STM müssen einfach nur die beiden BootPins richtig eingestellt 
werden.
Jedoch sehe ich dabei ein gravierendes Problem:
Beim POR ist das RAM uninitialisiert. Davon zu starten kann böse in die 
Hose gehen. Um das zu verhindern, braucht es einen Bootloader im Flash, 
der das RAM initialisiert.

D.h.
1. Starten von Flash
2. RAM init (z.B. Image eines "while(1)"-Programms incl. 
InterruptVectorTabelle an Adresse 0x20000000 kopieren)
3. Bootpins umstellen
4. Reset (aber kein POR!)

Das ist aber wie gesagt nur ein grobes Konzept. Ob das tatsächlich 
funktioniert gilt es noch zu erforschen.

Wenn du eine saubere Lösung zum laufen griegst, kannst du vieleicht ein 
wiki-Artikel schreiben. würde mich freuen

von Dr. Sommer (Gast)


Lesenswert?

So geht's auch:
* Boot Pins auf Flash lassen
* Leeres Dummy Programm flashen
* Linkerscript so anpassen dass Adressen für den RAM verwendet werden, 
zB indem der Memory "FLASH" einfach ab 0x20000000 statt 0x08000000 
beginnt; Größe und Anfang des "echten" RAM entsprechend anpassen
* Zur Sicherheit am Anfang des Reset_Handler den SP auf _estack setzen
* Am Anfang der main () das VTOR setzen damit die Interrupts aus dem RAM 
ausgeführt werden
* Das generierte ELF File ganz normal starten; da die darin enthaltenen 
Adressen nun auf den RAM zeigen wird nicht geflasht sondern nur in den 
RAM kopiert. Im Debugger aber keinen Reset auslösen lassen.

von Dr. Sommer (Gast)


Lesenswert?

Oh, vergessen:
* Im Debugger den PC auf &Reset_Handler setzen (zB "set 
$pc=&Reset_Handler" im GDB)
* Controller laufen lassen ("c" im GDB)

von timertick_t (Gast)


Lesenswert?

Danke für die Infos. Das war schon sehr hilfreich, ich werd' an dieser
Stelle weiter schürfen.

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.