Forum: Mikrocontroller und Digitale Elektronik MSP430F5438 Info Memory Flash Segment A Probleme


von Rex Gildo jr. (Gast)


Lesenswert?

Hallo !
Ich versuche grade im Zuge meines Projektes den Flash Speicher, im 
einzelnen das 128 Byte große Flash Segment A im info Memory Bereich 
(0x1980 - 0x19FF) zu Beschreiben bzw. zu lesen.

Dazu release ich erstmal den gesamten Info speicher über low setzen des 
LOCKINFO Bits in FCTL4.
Als nächstes wird durch Togglen des LOCKA Bits im FCTL3 Register, das 
Lock Bit für das Segment A ausser Kraft gesetzt. Ein einfaches auf 0 
setzen des Bits im Register funktioniert laut Datenblatt nicht :

Datasheet:

>The state of the LOCKA bit is toggled when a 1 is written to it.
>Writing a 0 to LOCKA has no effect. This
>allows existing flash programming routines to be used unchanged.

Jedes Mal wenn ich jedoch in den Flash ab der Stelle 0x1980 schreiben 
will, bekomme ich ein Access violation interrupt flag :(
Bei den älteren MSP´s läuft meine flashroutine leicht abgeändert ganz 
passabel, ist auch glaub ich zusammengestrick aus TI Code schnipseln.
Jedoch finde ich d nix Zusammenhängendes auf der TI HP.

Vielleicht hat ja von euch jemand nen Tip was ich falsch mache :(



1
#include "flash.h"
2
#include <stdlib.h>
3
4
//* ====================================================================== */
5
//* Funktion um Flash zu beschreiben                                       */
6
//* ====================================================================== */
7
8
void write_SegA(char offset,char *buf, unsigned char length) {
9
  WDTCTL = WDTPW + WDTHOLD;
10
  _DINT();
11
  FCTL4  = FWKEY;
12
  FCTL3  = FWKEY + LOCKA;                         // Toggle(Clear) Lock bit
13
 
14
  unsigned short i;
15
  Flash_ptr = (char *) 0x1980;                    // Initialisierung Flash Pointer
16
  Flash_ptr = Flash_ptr + offset;                 // Offset
17
  
18
  FCTL1 = FWKEY + WRT;                            // Set WRT bit for write operation
19
  for(i=0; i < length; i++)  {
20
      *Flash_ptr++ = buf[i];                      // buffer kopieren
21
      _NOP();                                     // SET BREAKPOINT HERE (DEBUGGER)
22
  }                         
23
24
  FCTL1 = FWKEY;                                  // Clear WRT bit
25
  FCTL3 = FWKEY + LOCKA;                          // Toggle(Set) LOCK bit
26
  FCTL4 = FWKEY + LOCKINFO;                       // Set LOCK bit
27
  _EINT();
28
}
29
30
//* ====================================================================== */
31
//* Funktion um Flash zu lesen                                             */
32
//* ====================================================================== */
33
 
34
void read_SegA(char offset,char *buffer, unsigned short laenge) {
35
36
  unsigned short i=0;
37
  Flash_ptr = (char *) 0x1980;                    // Initialisierung Flash Pointer
38
  
39
  Flash_ptr = Flash_ptr + offset;                 // Offset
40
  while(i < laenge) {                             // Flash lesen
41
    buffer[i] = *Flash_ptr++;
42
    i++;
43
  }
44
45
}


Viele Grüße

Rex

von Rex Gildo jr. (Gast)


Lesenswert?

Keiner eine Idee ?

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.