Forum: Mikrocontroller und Digitale Elektronik MSP430 FRAM schreiben und lesen


von Frank B. (rank_b)


Lesenswert?

Hallo,

ich versuche gerade mit dem MSP430FR5994 etwas in dem FRAM zu schreiben 
und zu lesen. Soweit funktioniert das auch alles. Wenn ich aber den 
Prozessor neu starte bzw. mein Projekt, dann stehen im FRAM nur fur 
FFs... Meine Daten sind alle weg.
Es sind meie ersten Versuche mit dem FRAM, hab aber leider im Momet 
keine Idee woran es liegen könnte.


unsigned int *FRAM_write_ptr;
#define TEST_START 0x4500

void writeFRAMData()
{
   unsigned int i = 0;
   writedata = 10;
   FRAM_write_ptr = (unsigned int *)TEST_START;
   for ( i= 0; i<128; i++)
   {
      *FRAM_write_ptr++ = writedata;
      writedata++;
      _NOP();
  }

  _NOP();
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mal den Startupcode untersucht, den Dein Programm hat?

Der initialisiert das verwendete (F)RAM, Du wirst in den 
Linkereinstellungen angeben müssen, wieviel RAM er unangetastet lassen 
soll.

von Tobias K. (kurzschluss81)


Lesenswert?

Schau mal wo dein Speicherbereich liegt. Wenn du CCS Verwendest dann 
wird, je nach Einstellung, beim Start dein "normaler" Arbeitsspeicher 
Bereich resetet.
Es kann auch sein das dein Speicherbereich sich mit irgendetwas 
überschneidet.

Ich würde einen eigenen Datenbereich anlegen und deine Speicheradresse 
dorthin verlegen. Dann liegt dein Schreibbereich in einem Abschnitt des 
FRAM wo kein anderer Prozess drauf zugreift.

Der Reset deines Programmes wäre auch mal interessant.
Bist du sicher das du auch auf den FRAM schreibst und nicht in den RAM?

von Frank B. (rank_b)


Lesenswert?

Tobias K. schrieb:
> Schau mal wo dein Speicherbereich liegt. Wenn du CCS Verwendest dann
> wird, je nach Einstellung, beim Start dein "normaler" Arbeitsspeicher
> Bereich resetet.
> Es kann auch sein das dein Speicherbereich sich mit irgendetwas
> überschneidet.

ich verwende IAR. Sorry, hätte ich gleich dazu schreiben können.
Das Programm selber besteht nur aus der main Methode und writeFRAMData 
um das ganze mal zu testen.
Im IAR kann ich mir ja den FRAM anzeigen lassen, in welchem die Daten 
nach dem schreiben auch richtig stehen. Nach einem Neustart sind sie 
dann weg.
Ich habe mir ja auch extra das von TI mitgelieferte Beispiel angeschaut 
und den gleichen Speicherbereich zum schreiben genommen. Bei dem 
Beispiel verschwinden die Daten nach einem Neustart allerdings auch.


>
> Ich würde einen eigenen Datenbereich anlegen und deine Speicheradresse
> dorthin verlegen. Dann liegt dein Schreibbereich in einem Abschnitt des
> FRAM wo kein anderer Prozess drauf zugreift.
>
> Der Reset deines Programmes wäre auch mal interessant.
> Bist du sicher das du auch auf den FRAM schreibst und nicht in den RAM?

In der Definition zu dem Prozessor steht:
// Persistent memory (FRAM):       04000-0FFFF

und ich schreibe ja auch 0x4500.

Wenn ich im IAR einen Reset durchführe, dann bleiben die Daten erhalten.

: Bearbeitet durch User
von Tobias K. (kurzschluss81)


Lesenswert?

Frank B. schrieb:
> In der Definition zu dem Prozessor steht:
> // Persistent memory (FRAM):       04000-0FFFF
>
> und ich schreibe ja auch 0x4500.
>
> Wenn ich im IAR einen Reset durchführe, dann bleiben die Daten erhalten.

Deshalb meinte ich auch das du einen Extra Datenbereich definieren 
Sollst. Das kann man in der "irgendwas.cmd" machen.

Dann kannst du sicher sein das kein anderer Prozess auf diesen Bereich 
zugriff hat.
1
 SECTIONS
2
{
3
    .bss        : {} > RAM | RAM2           /* Global & static vars              */
4
    .data       : {} > RAM | RAM2           /* Global & static vars              */
5
    .TI.noinit  : {} > RAM | RAM2           /* For #pragma noinit                */
6
    .sysmem     : {} > RAM                  /* Dynamic memory allocation area    */
7
    .stack      : {} > RAM (HIGH)           /* Software system stack             */
8
    .asDATA     : {} > RAM2

der Bereich .asDATA ist ein selbst angelegter Bereich.
Der Dann folgendermaßen verwendet werden kann:
1
 #pragma DATA_SECTION(dummi_variable, ".asDATA")
2
uint16_t dummi_variable[64];


PS: Ich weis nicht ob das bei IAR Funktioniert. Dieses Beispiel ist aus 
einem Projekt mit CCS.

: Bearbeitet durch User
von Frank B. (rank_b)


Lesenswert?

Tobias K. schrieb:

>
> PS: Ich weis nicht ob das bei IAR Funktioniert. Dieses Beispiel ist aus
> einem Projekt mit CCS.

ok danke, ich schau mir das mal an.

von Tobias K. (kurzschluss81)


Lesenswert?

Und hast du es zum laufen bekommen?

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.