MSP430F149內(nèi)部的memory結(jié)構(gòu),60K Flash+2K RAM。Flash分為主存儲區(qū)和信息存儲區(qū),操作都一樣,只是主存儲區(qū)每個段512字節(jié),而信息存儲區(qū)為128字節(jié),方便擦寫。本文引用地址:http://www.ex-cimer.com/article/201611/320875.htm
當(dāng)我們有數(shù)據(jù)要保存到Flash存儲器時,要先對目標(biāo)段進行整段擦除操作,擦除操作使的對應(yīng)段FLASH存儲器變成全“1”。應(yīng)當(dāng)注意的是,此flash的操作頻率為257 kHz到 476 kHz,時鐘源可選擇,因此我們做時鐘分頻時應(yīng)當(dāng)保證頻率在這之間,以下為我編寫的參考程序。
void Flash_erase(uint addr)
{//段擦除,512bytes一段
uchar s;
s=__get_interrupt_state();//保存當(dāng)前中斷狀態(tài)
__disable_interrupt();
while(FCTL3&BUSY);
FCTL3=FWKEY;
FCTL1=FWKEY+ERASE;
*(uchar*)addr=0;
while(FCTL3&BUSY);
FCTL3=FWKEY+LOCK;
__set_interrupt_state(s);//恢復(fù)中斷狀態(tài)
}
void Flash_write(uint addr,uchar dat)
{//單字節(jié)寫入
uchar s;
s=__get_interrupt_state();
__disable_interrupt();
while(FCTL3&BUSY);
FCTL3=FWKEY;
FCTL1=FWKEY+WRT;
*(uchar*)addr=dat;
while(FCTL3&BUSY);
FCTL1=FWKEY;
FCTL3=FWKEY+LOCK;
__set_interrupt_state(s);
}
void Flash_read(uint addr,uint len)
{//讀取到數(shù)組,此處堆棧應(yīng)改大
uint i;
for(i=0;i *(R+i)=*(uchar*)(addr+i);
}
評論