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 :)
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.
Danke, das hatte ich mir schon etwa gedacht. Doch woher hast du die Infos? Also wo steht das im Datenblatt geschrieben?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.