Forum: Compiler & IDEs Mappen von STM32 Flashspeicher auf eine Structure


von Harald (Gast)


Lesenswert?

Hallo,

Ich versuche gerade einen Bereich des Flashspeichers eines STM32F030 auf 
eine Structure zu mappen. Leider bisher ohne Erfolg und ich sehe den 
Wald wohl vor lauter Bäumen nicht.

Meine Struktur:
1
struct espConfig {
2
  unsigned char espName[32];
3
  unsigned char espAPName[32];
4
  unsigned char espAPPassword[32];
5
} espConfig;

Später versuche ich dann eine Speicheradresse zuzuweisen, ab der die 
Informationen im Flash gespeichert sind:
1
struct espConfig *eCfg = (struct espConfig *)0x08007C0A;

Wo liegt da gerade mein Fehler, dass es nicht funktioniert.

Vielen Dank für Tipps im voraus

von uff basse (Gast)


Lesenswert?

Harald schrieb:
> Wo liegt da gerade mein Fehler, dass es nicht funktioniert.

Was ist denn das "es" was nicht funktioniert. Was machst
du, was erwartest du und was ist dein Ergebnis?

von Harald (Gast)


Lesenswert?

Ich habe im Flash Speicher an der Position eine Zeichenkette stehen.
Wenn ich die Position it dem STM Link Utility auslese sehe ich die 
Zeichenkette.

Aber meine Struktur scheint auf den Anfang des Flashspeichers zu zeigen 
und nicht an die Adresse wie angegeben.

von Harald (Gast)



Lesenswert?

Man sieht es auch wenn ich einen Watch hinzufüge.
Die Variable eCfg enthält nur murks. Aber wenn ich im Watch Fenster Die 
Adresse mit dem Struct verknüpfe stehen die korrekten Daten drin.

von Klaus W. (mfgkw)


Lesenswert?

In deinem Bildchen steht was von "eCfg not in scope".
Stehst du in deinem Programm gerade woanders?

von Michael O. (michaelor)


Lesenswert?

Moin,

hm, ich würde das so tun...
1
struct {
2
  unsigned char espName[32];
3
  unsigned char espAPName[32];
4
  unsigned char espAPPassword[32];
5
} espConfig;
6
7
...
8
9
espConfig *eCfg = (espConfig*) 0x08007C0A;

Funktioniert so zuverlässig mit RAM und Registern (da die Elemente dann 
zusätzlich als volatile deklariert) und sollte so auch für den Flash 
funktionieren.

von Klaus W. (mfgkw)


Lesenswert?

nein, damit definierst du eine Variable espConfig (die dann eine struct 
ist).

Wenn du einen Typ espConfig haben willst, musst du in C schreiben:
1
typedef struct {
2
  unsigned char espName[32];
3
  unsigned char espAPName[32];
4
  unsigned char espAPPassword[32];
5
} espConfig;
6
...
7
espConfig *eCfg = (espConfig*) 0x08007C0A;

Wobei man dann eher als Typnamen espConfig_t statt espConfig nehmen 
sollte vielleicht.

von Rolf M. (rmagnus)


Lesenswert?

Klaus W. schrieb:
> In deinem Bildchen steht was von "eCfg not in scope".
> Stehst du in deinem Programm gerade woanders?

Sieht für mich auch so aus, als ob er gerade an einer Stelle steht, an 
der diese Variable eigentlich gar nicht existiert.

Übrigens:

Harald schrieb:
> Meine Struktur:
> struct espConfig {
>   unsigned char espName[32];
>   unsigned char espAPName[32];
>   unsigned char espAPPassword[32];
> } espConfig;

Damit erzeugst du den Datentyp espConfig und ein Objekt mit gleichem 
Namen von diesem Typ. Ist das so gedacht?

von Roland E. (roland0815)


Lesenswert?

Ich glaube mich zu erinnern, dass (zumindest beim KEIL) man die Variable 
als const deklarieren musste, dann hat der Kompiler die von selber in 
den Flash gepackt. Ganz ohne Kopfstände. Ob und wie er die dann ggf zur 
Verarbeitung in den RAM kopiert, liegt dann an der weiteren Verwendung.

Geht mbMn bei fast allen Architekturen, die Programm- und Datenspeicher 
nicht explizit trennen. Also nicht beim AVR...

von Walter T. (nicolas)


Lesenswert?

Roland E. schrieb:
> Ich glaube mich zu erinnern, dass (zumindest beim KEIL) man die Variable
> als const deklarieren musste, dann hat der Kompiler die von selber in
> den Flash gepackt.

Wenn ich aufgrund des Beispiel-Structs raten müsste, würde ich hier aber 
auf den Wunsch einer EEPROM-Emulation tippen, zu der auch eine 
Application Note existiert.

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.