Forum: Mikrocontroller und Digitale Elektronik STM32 Memory Map: Flash


von Daniel (Gast)


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 :)

von Christopher J. (christopher_j23)


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.

von Stefan T. (Gast)


Lesenswert?

Danke, das hatte ich mir schon etwa gedacht. Doch woher hast du die 
Infos? Also wo steht das im Datenblatt geschrieben?

von Christopher J. (christopher_j23)


Lesenswert?

Die Infos sind aus dem "Definitive Guide to ARM Cortex-M3 [...]" von 
Joseph Yiu. Sollte sich auch in den Datenblättern von ARM finden lassen 
aber ich kann dir gerade nicht sagen wo.

PS:
Die Info findest du z.B. für einen Cortex-M4 im "Cortex-M4 Devices 
Generic User Guide" auf Seite 2-4.
http://infocenter.arm.com/help/topic/com.arm.doc.dui0553b/DUI0553.pdf

von Bauform B. (bauformb)


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.

von Jim M. (turboj)


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.

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.