Forum: Mikrocontroller und Digitale Elektronik stm32 sram + internram


von Ersi (cell85)


Lesenswert?

Hallo Forum,

eine kleine Frage. Wenn ich einen STM32F4 habe mit externen SRAM und ich 
zusätzlich den internen benutzen möchte, ist es erforderlich noch was 
anzugeben?
Oder schreibt er nur in den externen (Bank … bis …) und der interne 
bleibt ungenutzt?
Mein Ziel wäre es wenn er selbst bei Überschreiten des internen Rams in 
den externen wechselt.
Aber das müsste doch schon direkt so sein oder? Für was hat er denn 
sonst eine lückenlose Adressierung? Bzw. der erste Bereich wäre ja das 
interne RAM und darauf folgt das SRAM.

VG
Ersan

von Linker (Gast)


Lesenswert?

Der STM32 hat einen linearen Adressraum. Das heißt aber nicht, dass 
hinter jeder Adresse auch etwas steckt. Im Datenblatt findest du die 
Memory Map. Das externe RAM wird dort irgendwo eingeblendet. Das hängt 
von deiner Hardware ab.

Die unterschiedlichen Bereiche im Speicher gibst du im Linker Script 
(ARM nennt es scatter file) an. Über die Angabe der Speicherklasse 
kannst du im Programm die Variablen gezielt im gewünschten Speicher 
ablegen, oder du überlässt es dem Locator.

von Jan B. (berge)


Lesenswert?

Hi Ersan,

nein, schau mal im Datenblatt. Der FSMC bildet den SRAM in einem 
speziellen Speicherbereich ab 0x6000000 ein.
Damit darin Werte landen, muss du deinem Compiler mitteilen, dass es 
überhaupt Speicher an dieser Adresse gibt. Das müsstest du im Makefile 
bzw. in den Projekteinstellungen konfigurieren.

Ich gehe aber mal davon aus, da der interne SRAM ja schon recht groß 
ist, du große Datenpakete o.ä. in den externen legen willst. Da kannst 
du dir auch behelfen, dass du die Adresse dann explizit angibst. 
Allerdings musst du das Speichermanagement dann selbst machen, sprich, 
drauf achten, wo du was hinschreibst ;)

Liebe Grüße,

Jan

von Ersi (cell85)


Lesenswert?

Jan Berg schrieb:
> Hi Ersan,
>
> nein, schau mal im Datenblatt. Der FSMC bildet den SRAM in einem
> speziellen Speicherbereich ab 0x6000000 ein.
> Damit darin Werte landen, muss du deinem Compiler mitteilen, dass es
> überhaupt Speicher an dieser Adresse gibt. Das müsstest du im Makefile
> bzw. in den Projekteinstellungen konfigurieren.


Genau hab die Adressbereiche in der Scatterfile angegeben.

Ich ging davon aus das der Mem.Locator automatisch die Speicherbereiche 
so verwaltet das wenn ich ein 300kb großes Paket in den Ram schreibe 
(Firmware update) nicht erst das interne Ram befüllt und dann das 
externe sondern direkt auf das externe schreibt. ...
Macht er aber nicht, er befüllt scheinbar doch erst das interne und dann 
geht er auf das externe.
Nur wenn ich explizit hinter der variable den speicherbereich angebe und 
diesen von anfang an reserviere gehts.

von Linker (Gast)


Lesenswert?

Wie soll es denn sonst gehen? Woher soll der Linker wissen, was du 
willst?

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.