MSP430讀寫片內(nèi)FLASH保存數(shù)據(jù)
FLASH型的MSP430單片機(jī)都帶有信息存儲(chǔ)器SegmengA及SegmentB,SegmengA及SegmentB各有128字,SegmentB的地址是:0x01000h到0x107F,SegmentA的地址是:0x01080h到0x010FFh。程序被寫入MSP430之后,程序通過SegmengA及SegmentB就可以保存不掉電數(shù)據(jù)。注意:每次程序燒寫到MSP430時(shí),SegmengA及SegmentB都會(huì)被擦除!
接下來貼出本文的程序代碼,以及程序?qū)懭胄畔⒋鎯?chǔ)器之后的FLASH數(shù)據(jù):
#include
voidWriteSegment_256(charindex,char*value,charsize);
charReadSegment_256(charindex);
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//Stopwatchdogtimer
FCTL2=FWKEY+FSSEL0+FN0;//MCLK/2forFlashTimingGenerator
charstr1[3]={0xAA,0xBB,0xCC};
WriteSegment_256(0,str1,3);
for(chari=0;i<255;i++)
_NOP();
charstr2[3]={0xBB,0xAA,0xCC};
WriteSegment_256(0,str2,3);
}
#defineSegmentStart0x01000//Segment=0x01000~0x010FF
#defineSegmentSize255//SegmentA+SegmentB=256
//*********************************************************
//讀取片內(nèi)存儲(chǔ)的數(shù)據(jù)
//*********************************************************
charReadSegment_256(charindex)
{
char*flash_ptr=((char*)SegmentStart)+index;
return*flash_ptr;
}
//*****************************************************
//把數(shù)組寫入數(shù)據(jù)到片內(nèi)FLASH,必須先全部擦除再寫入
//參數(shù)index:保存數(shù)組的位置
//參數(shù)value:數(shù)組的指針
//參數(shù)size:數(shù)組的大小
//*****************************************************
voidWriteSegment_256(charindex,char*value,charsize)
{
charbuffer[SegmentSize],i=0;
char*flash_ptr=(char*)SegmentStart;
//先讀取原FLASH數(shù)組
for(i=0;i
buffer[i]=ReadSegment_256(i);
//擦除FLASH,必須
FCTL1=FWKEY+ERASE;//SetErasebit
FCTL3=FWKEY;//ClearLockbit
*flash_ptr=0;//DummywritetoeraseFlashsegment
//把整個(gè)數(shù)組都寫入FLASH
FCTL1=FWKEY+WRT;//SetWRTbitforwriteoperation
for(i=0;i
buffer[index+i]=value[i];
for(i=0;i
*(flash_ptr++)=buffer[i];
FCTL1=FWKEY;//ClearWRTbit
FCTL3=FWKEY+LOCK;//SetLOCKbit
}