Hallo,
hab mir das Entwicklungskit im USB Stickformat besorgt (EZ430).
Komme damit sehr gut zurecht, Watchdog/Timer geht alles Problemlos.
Da ich relativ neu auf dem MSP Sektor bin, habe ich eine Frage:
-
Wie kann ich z.B ein Byte, zur Programmlaufzeit auf dem uC, in das Flash
zu Programmieren?
-
Dabei wuerde mir ein Byte erstmal genuegen, nur um die Logik zu
verstehen, wie dies im MSP realisiert wird.
kann ich die Variablen (mit einem Schluesselwort), schon zur
Programmierzeit eine Flashspeicherstelle zuweisen?
Darum geht es nur eine feste zur Programmierzeit bekannte Anzahl von
"Bytes" zu speichern in etwa so
int iWillInsFlash;
(Mach was mit iWillInsFlash...)
StoreFlash(iWillInsFlash[,iPosFlashByte])
...
und auch anderstrum (Nach Stromweg)
int iWillWasAusFlashHaben;
iWillWasAusFlashHaben = Retr(iPosFlashByte);
(Wieder da freu...)
Ok habs gefunden, in den Codebeispielen...
Nur noch eine Frage...
Wie stelle ich sicher das das FlashSegment nicht schon "belegt" ist
durch mein Programm?
Auch wenn ich mit mir selbst reden, vielleicht hilfts jemand...
fet140_flashwrite_01.c
und laut Datenblatt...
Information memory Size
Flash
256 Byte
010FFh − 01000h
Is ja sehr einfach, gefaellt mir immer mehr ;)
Generell ist der nicht beschriebene Bereich mit 0xFF belegt.
Pass aber auf den letzten Bereich des Flashspeicher auf, denn dort
stehen die Kalibrierungsdaten fuer 1,8,12,16 MHz Taktung.
Naemlich dieser bereich :
010FFh
010FEh
010FDh
010FCh
010FBh
010FAh
010F9h
010F8h
den hab ich auch schon mal geloescht, da lief der gute dann mit 19 MHz
egal was ich fuer Register gesetzt hatte :( , naja beim zweiten F2013
den Bereich wieder ausgelesen und auf den zerstoerten wieder
raufgeschrieben und das Problem war geloest.
Kann ich auch nur ein Byte schreiben, oder muss ich ein Seg mit 128 Byte
erst löschen?
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + WRT; // Set WRT bit for write
operation
*Flash_ptr = DerWert; // Write value to flash
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Reset LOCK bit
}
jo kannst du. wobei ein kollege von mir jeweils eine Funktion fuer byte,
word und dword geschrieben hat. Mit deiner verglichen sieht sie aehnlich
aus nur das er noch wartet bis er schreiben darf.
Wunderbar, lauft bei mir ;)
Kurze Frage noch: Koennt ja auch im Flash wo das Programm eingebrannt
wird, während der Laufzeit "Befehle","Daten" umflashen?
Oder ist diese Speicherstellen (wo das Programm ist) anderst
organisiert?
Koennt ja dann einen ungenutzten FlashProgrammspeicher als Datenspeicher
missbrauchen? Anstatt ~256Bytes sinds ja bei dem 2013er 4KB.
Hab in einem Ti-Dokument gelesen, das man da erst das Programm ins Ram
reinschieben muss, weil sonst die CPU keinen Zugriff, beim Flashen, aufs
Programm hat.
P.S. Fuehl mich gerade an meine C64 Asm Zeit zurueckerinnert ;) Man scho
14Jahre her ;)
Naja einfacher waers ja einfach nen I2C EEprom anzuschliessen, die gibts
ja inner annehmbaren groesse...
Hallo!
Nachdem ich schon viel versucht habe und eigentlich auch schon alles
gelesen habe was die Suche gefunden hat, muss ich jetzt doch mal fragen.
Ich möchte Daten / Variablen im Flash speichern, damit ich diese nach
Strom ausfall wieder laden kann. Diese können sich während der laufzeit
ändern bzw. werden erst während der laufzeit "eingelernt", d.h. es kann
sein das ich diese auch aktualisieren muss.
Dazu möchte ich mir mittels einer #pragma Anweisung Speicherplatz im
Flash "reservieren", nur leider krieg ich das nicht hin.
Am besten wäre ein Array mit z.B. 8 Feldern und eine INT Variable im
Flash oder evtl sogar eine kleine structur, mit einer INT Variable und
einem Array mit 8 Feldern
Mit dieser Anweisung von oben:
#pragma memory=dataseg(INFO) //Sollte INFO nicht im Flash sein???
char array[8]
#pragma memory=default
wird die Variable im Ram bei Adresse 200 abgelegt.
Wie muss ich das anstellen damit ich das ins Flash bekomme?
Daten in absolute Adressen des Flashs zu kopieren ist kein Problem, das
funktioniert, nur eben nicht wenn mich mir Speicher mittels einer
#pragma Anweisung reservieren will.
Ich verwende die neueste IAR Workbench und arbeite mit dem MSP430F149
und der JTAG Tiny von Olimex sowie dem neuem "USB-Stick" mit dem F2013.
Vielen Dank schon mal!
Gruß Andi
Das geht so nicht. Zum Beschreiben des Flashes muss eine bestimmte
Prozedur eingehalten werden. Die kennt der Compiler nicht. Entweder du
kennzeichnest die Variablen als const, dann landen sie zwar im Flash,
aber du kannst sie nur lesen. Oder de beschreibst den Flash wie in den
C-Demos von TI angegeben.
Der Flash kann nur durch den Debugger beim Download des Programm, durch
den Bootloader oder durch die Flash-Routine zur Laufzeit geschrieben
werden.
Desweiteren muss das entsprechende Flash-Segment vorher gelöscht werden,
aber das steht ja alles in den C-Demos und im User Guide.
Hi!
Hmm... das das beschreiben während der Laufzeit nur über die Routine
möglich ist, war mir schon bewusst, dachte nur das ich über #pragma
memory bzw. #pragma location ein "segment" bzw. speicher im Flash
reservieren kann das ich dann über die Routine beschreiben kann.
Die Adresse der Variable hätte ich dann mit & übergeben und dann mittels
Zeiger gemäß C-Demos ins Flash geschrieben.
Gruß Andi
Hallo nochmal.
Also mit #pragma location hab ichs jetzt hinbekommen:
#pragma location=0x1000
__no_init UINT8 anzahl;
#pragma location=0x1080
__no_init UINT8 variable[8];
So kann ich jetzt mit &anzahl die Adresse holen und mit der Routine
mittels Zeiger ins Flash schreiben.
Allerdings muss ich dies jetzt zweimal machen für 2 Variablen.
Falls mir jemand sagen kann wie das evtl elleganter geht, wäre ich sehr
dankbar.
Gruß Andi
Achso...das ist dann also ein Linker-Problem. Na gut, da konnt ich dir
nicht helfen, arbeite mit mspgcc, da hab ich meine Linker-Scripte
angepasst, um solche Sachen zu realisieren.