Hallo,
ich möchte mit dem MSP430i2041 Daten in den Infomemory schreiben. Als
Beispiel wollte ich eine einfache int Zahl speichern. Ich kann diese
zwar auch einmal speichern, aber bei dem Versuch eine weitere Zahl auf
die gleiche Speicheradresse abzulegen, funktioniert es nicht. Es bleibt
einfach die alte Zahl im Speicher.
Wo ist mein Denkfehler?
#define SETUP_FLASH_DATA 0x1060
void EraseInt(int* addr)
{
while(BUSY & FCTL3); // Check if Flash being used
FCTL2 = FWKEY + FSSEL1 + FN0 + FN2 + FN5; // MCLK/42 for Flash Timing
Generator
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*addr = 0; // Dummy write to erase Flash
segment
while(BUSY & FCTL3); // Check if Flash being used
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
void WriteInt(int value)
{
int* addr = (int*)SETUP_FLASH_DATA;
EraseInt(addr);
FCTL2 = FWKEY + FSSEL1 + FN0 + FN2 + FN5;
FCTL3 = FWKEY;
FCTL1 = FWKEY + WRT;
*addr++ = value;
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCKSEG;
}
ich habe auch mal das Beispiel von Texas Instruments ausprobiert. Ich
kann auch hier nur einmal einen Wert schreiben, dann gehts nicht mehr.
Hat keiner eine Idee?
#define SEGSTART 0x1070 // Address of the beginning of the
Flash Information Segment
#define SEG_LEN 0x10 // Number of bytes within segment to
erase/write
unsigned char value = 0xAA; // 8-bit value to write to segment
// Function Prototype
void write_InfoSeg(char value);
void eraseFlash();
void main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop Watchdog Timer
FCTL2 = FWKEY | FSSEL_1 | FN1 | FN3 | FN5; // MCLK/42 for Flash
Timing Generator
//eraseFlash();
write_InfoSeg(value++); // Write value to
Information Segment, increment value
while(1) {
__no_operation(); // SET BREAKPOINT HERE
}
}
void write_InfoSeg(char value) {
unsigned char *Flash_ptr; // Flash pointer
unsigned int i;
Flash_ptr = (unsigned char *)SEGSTART; // Initialize Flash
pointer
if(FCTL3 & LOCKSEG) { // If Info Seg is stil
locked
FCTL3 = FWKEY | LOCKSEG; // Clear LOCKSEG bit
}
FCTL1 = FWKEY | WRT; // Set WRT bit for write
operation
for (i = 0; i < SEG_LEN; i++) {
*Flash_ptr++ = value; // Write value to flash
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY | LOCKSEG; // Set LOCKSEG bit
}
war das nicht beim Flash Speicher so . kann man nur Segmentweise löschen . mfg Erik
Erik schrieb: > war das nicht beim Flash Speicher so . > > kann man nur Segmentweise löschen . > > mfg Erik Ja, das hab ich alles schon probiert. Irgend was übersehe ich da.
Beim TI-Beispiel hast du eraseFlash() auskommentiert. Dein Programm behandelt LOCK und LOCKSEG inkonsistent. (Das LOCKSEG-Bit wird durch Schreiben einer 1 umgeschalter.) (Und ich hoffe, du hast eine Sicherheitskopie der Kalibrierungs-Daten.)
Hallo, ich arbeite mit IAR und dem MSP403i2041. Mit IRA habe ich die Möglichkeit den Infomemory zu sichern. Nun wollte ich den Infomemory wieder herstellen über "Memory Restore". Er zeigt mir auch die Daten richtig an, scheint sie dann aber dann aber nicht in den Speicher zu übertragen. Wenn ich mit den Infomenory nach einem Restore anschaue, sind die Daten nicht mehr vorhanden. Es geht hier speziell um die Kalibrierungsdaten, die ich wieder herstellen möchte. Kann mir hier jemand weiterhelfen?
Lösungsvorschlag:
#include "msp430.h"
#include "driverlib/driverlib.h"
#define SEGSTART 0x1060
#define SEG_LEN 0x10 // Number of bytes within segment to
erase/write
#define SEGSTART_CALB 0x13C0
unsigned char value = 0xC5; // 8-bit value to write to segment
unsigned char vArray[32] = {0x00};
// Function Prototype
void write_InfoSeg(char value);
void vCopyFlashToArray();
void main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop Watchdog Timer
FCTL2 = FWKEY | FSSEL_1 | FN1 | FN3 | FN5;
_NOP();
vCopyFlashToArray(); //Store Calib-Data to Array
write_InfoSeg(value++); // Write value to Information Segment,
while(1) {
__no_operation(); // SET BREAKPOINT HERE
}
}
void write_InfoSeg(char value) {
unsigned char *Flash_ptr; // Flash pointer
unsigned int i;
Flash_ptr = (unsigned char *)SEGSTART; // Initialize Flash
pointer
if(FCTL3 & LOCKSEG) { // If Info Seg is stil locked
FCTL3 = FWKEY | LOCKSEG; // Clear LOCKSEG bit
}
FCTL1 = FWKEY | ERASE; // Set WRT bit for write operation
*Flash_ptr = 0;
FCTL1 = FWKEY &~ ERASE;
FlashCtl_unlockInfo();
FCTL1 = FWKEY | WRT; // Set WRT bit for write operation
for (i = 0; i < SEG_LEN; i++) {
*Flash_ptr++ = value; // Write value to flash
}
Flash_ptr = (unsigned char *)SEGSTART_CALB;
for (i = 0; i < SEG_LEN; i++) {
*Flash_ptr++ = vArray[i]; // Write value to flash
}
FlashCtl_lockInfo();
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY | LOCKSEG; // Set LOCKSEG bit
}
// -----------------------------------------------------------
void vCopyFlashToArray(){
unsigned char *Flash_ptr;
Flash_ptr = (unsigned char *)SEGSTART_CALB;
for(int i = 0; i<32;i++)
vArray[i] = *Flash_ptr++;
_NOP();
}
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.