STM32 Memory Map: Flash

Gast #5932099
Lesenswert?

Hey,

ich würde gerne konstante Werte in den Flash an eine bestimmte Adresse 
im Flash schreiben. Ich kenne den Controller nicht super gut, habe aber 
im Datenblatt geschaut und dort ist der Flash angegeben. Gibt es 
reservierte Bereiche auf dem Flash? zB Einstiegspunkte für Interrupt oÄ? 
Oder kann ich einfach an eine beliebige Adresse schreiben? (ganz an den 
Anfang) Danke :)
#5932114
Lesenswert?

Nein, ganz an den Anfang geht nicht (zumindest bei Cortex-M). Die ersten 
vier Byte müssen der initiale Stackpointer sein und die zweiten vier 
Byte müssen der Resetvector sein. Danach kommen die restlichen 
Interruptvektoren. Wenn du keine Interrupts benutzt, dann kannst du da 
theoretisch auch was anderes reinschreiben aber eben auch nur dann.
#5932166
Lesenswert?

Im Datenblatt steht im Kapitel "Nested vectored interrupt controller 
(NVIC)" nur die Anzahl. Die genaue Verwendung (ist bei jedem Chip 
anders) steht im passenden Reference Manual. Dabei muss man genau 
aufpassen, welches Manual zu welchem Chip gehört, die Zuordnung ist 
nicht 1:1. Welches RMxxxx gilt steht ganz am Anfang im Datenblatt. NVIC 
ist ein guter Suchbegriff zu dem Thema.

Ich hatte mir mal gemerkt:
1
Der F051 nutzt 32 Interrupts, dazu kommen die 16 Exceptions, die Tabelle
2
braucht also (32+16)*4 = 192 Byte. Das muss für alle M0 und M0+ Chips
3
reichen, weil die wohl max. 32 Interrupts können (begrenzt durch die Zahl
4
der NVIC_IPR Register).
5
Der M0+ hat optional ein VTOR, die Vector Table muss 256-Byte-aligned sein.
6
Der M3 und der M4 können 240 Interrupts (der F205 nutzt 81), die Vector
7
Table muss also 512- oder 1024-Byte aligned sein.
8
Laut ARMv7-M Architecture Reference Manual können die (und die ganz großen
9
sowieso) sogar 496 Interrupts und brauchen dann ein 2048-Byte Alignment.
So gesehen sollte man die unteren 2K nicht missbrauchen. Man kann aber 
zur Laufzeit eine andere Tabelle irgendwo im Flash benutzen (per VTOR 
Register; nicht beim M0). Dann reicht es, am Anfang nur 64 Byte oder 
noch weniger zu reservieren. Im Extremfall reichen die 4 Byte für den 
Reset-Vektor. Man kann den Stack Pointer ja auch selbst initialisieren.
#5932172
Lesenswert?

Welchen Compiler benutzt Du?

Beim GCC (LD) ist die Verwendung konstanter Flash Addressen alles andere 
als trivial.

Und ja, es kann außer den Interrupts noch weitere reservierte Flash 
Adressen geben. Genaueres geht nur wenn der OP Typ und Hersteller des µC 
angibt.

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