STM32F4 Programm im RAM ausführen

OP #3488718
Lesenswert?

Hallo alle zusammen,

ich experimentieren gerade mit einem STM32F429. Ich benutze CoIDE. Jetzt 
würde ich gerne, um den Flash zu schonen, meine Programme ersteinmal im 
RAM ausführen.
Leider kann ich nicht herausfinden, wie das mit CooCox funktioniert. 
Gibt es da irgendwo Infos?

Gruß
Sam
#3488995
Lesenswert?

du musst:

- linker-file anpassen (dein Programm in den RAM linken)
Ich weiß nicht ob Coocox da nachgebessert hat, in den Versionen die ich 
benutzt habe waren Speicher-Anpassungen etwas tricky (ich habe mir eine 
kopie des linkerfiles gemacht und dann in dieser Einstellungsseite 
umgeändert). Evtl reicht bei dir die Anpassung auf der Einstellungsseite 
aus...

- bootpin richtig setzen (BOOT0, BOOT1; bitte im Datenblatt / Refman. 
die richtige Beschaltung nachlesen)
OP #3489097
Lesenswert?

Den Standard Radiobutton "Debug in RAM" habe ich schon auf alle 
erdenklichen weisen ausprobiert, hat leider nur zu Müll auf dem Display 
und sonst nichts geführt.

Phantomix Ximotnahp schrieb:
> du musst:
>
> - linker-file anpassen (dein Programm in den RAM linken)
> Ich weiß nicht ob Coocox da nachgebessert hat, in den Versionen die ich
> benutzt habe waren Speicher-Anpassungen etwas tricky (ich habe mir eine
> kopie des linkerfiles gemacht und dann in dieser Einstellungsseite
> umgeändert). Evtl reicht bei dir die Anpassung auf der Einstellungsseite
> aus...
>
> - bootpin richtig setzen (BOOT0, BOOT1; bitte im Datenblatt / Refman.
> die richtige Beschaltung nachlesen)

Auch eine Anpassung des linker-files hat zu keinem anderen Ergebnis 
geführt, es kam genau das selbe dabei heraus.

Ist die Beschaltung der Bootpins zwingend, auch wenn ich nicht resetten 
können will? (Nur Debuggen am Rechner auswählen)
Gast #3489277
Lesenswert?

Samuel C. schrieb:
> Ist die Beschaltung der Bootpins zwingend, auch wenn ich nicht resetten
> können will? (Nur Debuggen am Rechner auswählen)

 Du hast Code, Metadaten, Interruptvektoren, usw. im Flash. Woher soll 
der Controller wissen, wo er die Dinge findet und von wo gestartet wird? 
Bootpins sind die Lösung.
(Firma: EleLa - www.elela.de) #3489309
Lesenswert?

Die Interruptvectoren stehen immer am Anfang. Beim Linken im RAM werden 
die an Adresse 0x20000000 gelinkt, durch die Boot-Pin Konfiguration 
"RAM" wird der RAM Bereich mit der Adresse 0x20000000 auch an Adresse 
0x00000000 gespiegelt, denn nach dem Reset liest die CPU ab Adresse 
0x00000000 in der Vectortabelle.
Man könnte das Programm also auch ab Adresse 0x00000000 linken und in 
das Ram ab Adresse 0x20000000 rein schreiben, das würde genau so laufen.
(Firma: EleLa - www.elela.de) #3489337
Lesenswert?

Die Boot-Pin Beschaltung ist hier beschrieben:
http://www.mikrocontroller.net/articles/STM32#Bootmodi
oder in der Doku.

Der gelinkte Code müsste dann mit der Vector-Tabelle ab Adresse 
0x20000000 sein, das kann man in der .map Datei kontrollieren.

Ich habe das noch nie genutzt, ich flashe immer meine Controller. Bisher 
ist mir noch keiner Kaputt gegangen.
OP #3489344
Lesenswert?

Markus Müller schrieb:
> Die Boot-Pin Beschaltung ist hier beschrieben:
> http://www.mikrocontroller.net/articles/STM32#Bootmodi
> oder in der Doku.

Habe ich schon aus dem Datenblatt geholt, aber danke :)


> Der gelinkte Code müsste dann mit der Vector-Tabelle ab Adresse
> 0x20000000 sein, das kann man in der .map Datei kontrollieren.

Ja, ist er auch, war er ständig. Habe gerade etwas im Forum der IDE 
ausgegraben, scheint ein Bug in der derzeitigen Version zu sein. Dann 
hoffe ich mal, dass es nach dem nächsten Update anders aussieht.


> Ich habe das noch nie genutzt, ich flashe immer meine Controller. Bisher
> ist mir noch keiner Kaputt gegangen.

Habe ich bisher auch, aber die Flashzellen des STM32F4 halten scheinbar 
nur 100 Zyklen, und da ich doch einige male am Tag flashen würde will 
ich lieber auf Nummer sicher gehen :)
Gast #3489399
Lesenswert?

Zum Booten steht im Datenblatt noch:

>Note:
>When the device boots from SRAM, in the application initialization
>code,you have to relocate the vector table in SRAM using the NVIC exception 
>table and the offset register.

Weiß zwar nicht was das heißt aber hört sich wichtig an ;=)
Gast #3489474
Lesenswert?

Aus system_stm32f4xx.h :
1
  /* Configure the Vector Table location add offset address ------------------*/
2
#ifdef VECT_TAB_SRAM
3
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
4
#else
5
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
6
#endif
7
}

Vector table offset register (VTOR): 0xE000ED08
(Firma: EleLa - www.elela.de) #3489485
Lesenswert?

Bei mir sieht die Vectortabelle so aus:
1
const intvec_elem AppVectors[] __attribute__ ((section(".vectors"))) =
2
{
3
  {(intfunc) STACK_TOP},  // stack pointer
4
  {(void *)main},
5
  {NMIException},
6
  {HardFaultException},
7
  {MemManageException},
8
: : :

Und im Linker-Script steht wohin die section .vectors hin kommt. Der 
Stack-Pointer steht da natürlich auch gleich mit drin.

Ich gehe mal davon aus, dass Coocox das von alleine macht, wenn man es 
entsprechend konfiguriert.
Bei Coocox ist das wohl in einer Startup-Assembler Datei, ich habe das 
in C geschrieben und nutze kein Coocox.
Ich habe in meinem Programm gleich 2 solche Vector-Tabellen, eine für 
den Bootloader und eine für die Applikation, beides in einem Projekt. 
Ist ein wenig kniffelig, aber geht.
OP #3489499
Lesenswert?

Markus Müller schrieb:
> Und im Linker-Script steht wohin die section .vectors hin kommt. Der
> Stack-Pointer steht da natürlich auch gleich mit drin.
>
> Ich gehe mal davon aus, dass Coocox das von alleine macht, wenn man es
> entsprechend konfiguriert.
> Bei Coocox ist das wohl in einer Startup-Assembler Datei, ich habe das
> in C geschrieben und nutze kein Coocox.
> Ich habe in meinem Programm gleich 2 solche Vector-Tabellen, eine für
> den Bootloader und eine für die Applikation, beides in einem Projekt.
> Ist ein wenig kniffelig, aber geht.

Ich werde wohl einfach warten müssen, bis der STM32F429 offiziell 
unterstützt wird^^

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