Forum: Mikrocontroller und Digitale Elektronik MSP430F5529 Flashpointer zu klein


von Dieter B. (barth)


Lesenswert?

Hallo Zusammen.
Ich versuche zur Zeit in den Flashspeicher meines MSP430F5529 zu 
schreiben.
Teilweise funktioniert es. Aber leider nicht immer.
Wenn die Adresse des zu beschreibenden Wertes einen Int (2Byte) also 
65536 überschreitet, speichert mein Pointer keine Werte mehr.
Egal von welchem Typ(Char, Int, Long).
Wie macht ihr das?
Ich habe die Codebeispiele von TI verwendet. Aber auch hier funktioniert 
das mit den höheren Adressen nicht mehr.
Danke für euro Hilfe

Mein Programm:


#include <msp430f5529.h>

unsigned int *adresse;
// Function prototypes
void write_SegC(void);

void main(void)
{
  WDTCTL = WDTPW+WDTHOLD;                   // Stop WDT
  while(1)
  {
     adresse = (unsigned int *) 0x4401;
     write_SegC();
    //adresse = write_SegC(adresse);
  }
}

//---------------------------------------------------------------------- 
--------
// Input = value, holds value to write to Seg C
//---------------------------------------------------------------------- 
--------
void write_SegC(void)
{

  unsigned int i;
  FCTL3 = FWKEY;                            // Clear Lock bit
  FCTL1 = FWKEY+ERASE;                      // Set Erase bit
  *adresse = 0;                           // Dummy write to erase Flash 
seg
  FCTL1 = FWKEY+WRT;                        // Set WRT bit for write 
operation
  for (i = 0; i < 128; i++)
  {
    *adresse++ = i;                   // Write value to flash
  }
  FCTL1 = FWKEY;                            // Clear WRT bit
  FCTL3 = FWKEY+LOCK;                       // Set LOCK bit
  //return adresse;
}

von Chris D. (m8nix)


Lesenswert?

Hi Dieter,

sieh dir mal die memory-organization im Dtenblatt an... 4 Bänke a' 32 
kB.

von Tx2000 (Gast)


Lesenswert?

Hallo

ist die CPU Auswahl bei deinem Compiler richtig? Der Compiler muss im 
MSP430X Modus sein und das Speichermodel muss auf large stehen damit die 
Pointer größer als 2Byte sind.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Zur Kontrolle: lass Dir mal im Debugger das Ergebnis von

   sizeof (int *)

anzeigen. Da muss was anderes als zwei ("2") rauskommen.

von unsigned (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> sizeof (int *)
>
> Da muss was anderes als zwei ("2") rauskommen.

Warum? 16 Bit Core, also 2 Byte pro Integer.

von Dosmo (Gast)


Lesenswert?

unsigned schrieb:
>> sizeof (int *)
>>
>> Da muss was anderes als zwei ("2") rauskommen.
>
> Warum? 16 Bit Core, also 2 Byte pro Integer.

Nicht Integer, sondern Zeiger auf Integer.
Wenn ein Zeiger nur 2 Byte groß ist, kann man nur 64k addressieren. 
Deswegen gibt es auch auf manchen System die FAR und HUGE Zeiger. Bei 
Harvard-CPUs muß man manchmal auch noch zwischen RAM und Flash 
unterscheiden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dosmo schrieb:
> Bei Harvard-CPUs muß man manchmal auch noch zwischen RAM und Flash
> unterscheiden.

Zum glück ist der MSP430 keine.

von Dieter B. (barth)


Lesenswert?

Danke an die vielen Antworten.
Also es war das Speichermodell. Man muss es auf large umstellen. An 
dieser Stelle vielen Dank an Tx2000.
Funktioniert wunderbar.
Für alle andern die das selbe Problem haben.
Im CodeComposer Studio rechte Maustaste auf das Projekt. Dann 
Properties.
Im Register CCS Build dann MSP430 Compiler und dann Processor Optionnen 
und hier die Optionen auf advanced umstellen und dann bei code memory 
model auf large. Schon sind die Pointer 4 Byte groß und alles 
funktioniert.
Danke
Frohe Weihnachten

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.