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;-)
zu 1: Ja zu 2: Jein (als Stichwort zum Suchen: "BOOT0" und "BOOT1") Ansonsten: hier wird dich hier keiner wegen deines Alter ausschließen :-)
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
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
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.
Oh, vergessen: * Im Debugger den PC auf &Reset_Handler setzen (zB "set $pc=&Reset_Handler" im GDB) * Controller laufen lassen ("c" im GDB)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.