Hallo ich habe gesehen dieses Problem wurde schon häufiger diskutiert. Habe aber nicht die Antwort gefunden die ich gesucht habe. Ich habe ein Programm welches nach dem Programmieren einmal in eine spezielle Einstellfunktion springen soll und bei den weiteren starts dies nicht mehr tuen soll. Deshalb brauche ich eine Variable welche ich im Flash beschreiben kann. Habe aufgrund von den Posts folgendes gemacht. const unsigned int FirstStart = 0; // Variable als const deklarieren so im flash speicher if (FirstStart == 0) { einstell(); WriteFlash((unsigned int*)&FirstStart,1); } void WriteFlash( unsigned int *uintAddress, unsigned int uintData) { WDTCTL = WDTPW+0x0c; asm("dint"); while(BUSY & FCTL3); FCTL3 = FWKEY; FCTL1 = FWKEY + WRT; *uintAddress = uintData; FCTL1 = FWKEY; FCTL3 ^= (FXKEY + LOCK); asm("eint"); } die flash Routine ist die wo bei mspgcc dabei ist. Problem ist nun wenn ich das ausführe stürzt mein msp ständig ab und fängt von vorne an. Weis jemand einen Rat... Danke Patrick
Hi Also mit dem mspgcc kenne ich mich ja noch nicht aus, für meine ersten Schritte habe ich bis jetzt die IRA Workbench verwendet. Mein Lösungsvorschlag: Definiere über ein #define eine Konstante, welche die Adresse eines Stücks des für solche Dinge vorgesehenen Informationsspeichers enthält. Dort schreibst du dann hin, ob der MSP schon laufen drufte oder nicht. So würde ich das machen. Gruss Tom
wenn du die manuals aufmerksam gelesen hättest, wäre dir bekannt, das du beim schreiben in's flash bits nur von 1 auf 0 setzen kannst. bei der initieliesierung stehen also alle nicht vom programm genutzten bits auf 1. wenn du nun ein bit von 0 auf 1 setzen willst (oder einen neuen wert an eine bestimmte speicherstelle schreiben willst), mußt du zunächst das betroffenen speichersegment löschen. erst dann kannst du einen neuen wert an eine bestimmte speicheradresse korrekt schreiben. ein weiteres problem wird sein, das du mit dem const nicht definieren kannst an welcher stelle im flash die konstante liegt. würdest du nun mit der adresse der konstanten ein segment (512 byte) löschen, kannst du nicht absehen was du alles löscht. die beste losung meiner meinung nach ist es sie variable in den information memory zu legen. dieser besteht aus 2 128 byte segmenten ab adresse 1000h. dies sind die einzigen segmente die kleiner als 512 byte sind und einzeln gelöscht werden können und sicher nicht vom programm selber genutzt werden. du legst fest, dass deine variable FirstStart zb. an der adresse 1000h liegen soll. nach dem programmieren und 1. systemstart steht an dieser adresse 0xff (wir erinnern uns, ein gelöschter bereich ist mit 1 vollgeschrieben). nach systemstart prüfst du also ob an adresse 1000h 0xff steht. ist dies der fall, schreist du an die adresse einen neuen wert zb. 0x00. (ich incrementiere den wert bei jedem systemstart. somit habe einen startupcounter). solltest du den infomem für weiter variablen (log o. konfig) nutzen wollen, solltest du vor jedem schreiben die entsprechenden werte auslesen, dann das segment löschen und dann die aktualisierten werte wieder reinschreiben.
Danke für die ausführliche Antwort. Ich denke deine vorgehensweise wird wohl so am besten sein. Aber wie definiere ich das meine Variable an 1000h steht das habe ich noch nicht herausgefunden. Zum schreiben muss ich ja die obenstehende Routine verwenden, ist das richtig. Wenn nicht wäre ich für einen Vorschlag sehr dankbar. Patrick
naja, du kannst nich definieren das deine variable an 1000h liegt. du legst eine variable FirstStart an, dieser weist du den wert der speicherstelle 1000h zu. unsigned int FirstStart = *(unsigned int)0x1000; um den wert zu ändern, löscht du zunächst das segment ab 1000h und schreibst dann den neuen wert mit der von dir geseigten routine rein.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.