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; }