Part Number: MSP430G2553
Tool/software: Code Composer Studio
Hi Everybody,
about information memory. the memory is byte addressable (i think)
it has 4 segments, each segment has 64 bytes (256 bytes overall).
it starts wth address: 0x1000 (segment D). so if i put a char (byte size) into this address. the next address to be available is 0x1001
and if after that i put a short (2 bytes), the next available address is 0x1003
if what i said is right, so why my code below not working correctly?
#include <msp430g2553.h>
#define END_OF_FLASH 0x0FFFF
void WriteCharToFlash(char* Flashptr, char val);
void WriteLongToFlash(long* Flashptr, long val);
void ReadCharFromFlash(char* address, char* val);
void ReadLongFromFlash(long* address, long* val);
void ClearAllFlash();
int main(void) {
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 = CALBC1_1MHZ; // Set DCO to 1MHz
DCOCTL = CALDCO_1MHZ;
FCTL2 = FWKEY + FSSEL0 + FN1;
long val;
char val2;
ClearAllFlash();
WriteCharToFlash((char *) 0x01000, '2');
ReadCharFromFlash((char *) 0x01000, &val2);
WriteLongToFlash((long *) 0x01001, 1234567);
ReadLongFromFlash((long *) 0x01001, &val);
ReadLongFromFlash((long *) 0x01001, &val);
ReadCharFromFlash((char *) 0x01000, &val2);
return 0;
}
void WriteLongToFlash(long* address, long val)
{
long* flash_ptr;
flash_ptr = address; // Initialize Flash pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*flash_ptr = 0;
while(FCTL3 & BUSY);
FCTL1 = FWKEY + WRT;
*flash_ptr = val;
while(FCTL3 & BUSY);
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
void ReadLongFromFlash(long* address, long* val)
{
long* flash_ptr;
flash_ptr = address;
*val = *flash_ptr;
}
void WriteCharToFlash(char* address, char val)
{
char* flash_ptr;
flash_ptr = address; // Initialize Flash pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*flash_ptr = 0;
FCTL1 = FWKEY + WRT;
*flash_ptr = val;
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
void ReadCharFromFlash(char* address, char* val)
{
char* flash_ptr;
flash_ptr = address;
*val = *flash_ptr;
}
void ClearAllFlash()
{
char *flash_ptr; // Segment D pointer
flash_ptr = (char *) 0x1000; // Initialize Flash segment D pointer
FCTL1 = FWKEY + MERAS; // Set Mass Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*flash_ptr = 0; // Dummy write to erase Flash segment D
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK;
}