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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.