|
使用內(nèi)部flash保存數(shù)據(jù),不知道樓主是使用的什么單片機(jī),但是如果使用stc89c52rc 或者是STM32F103c8t6這兩個(gè)都是可以的,不需要外加什么東西,代碼就可以實(shí)現(xiàn).
51如下
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
/*--------------------空停頓--------------------*/
void Nop(){}
/*--------------------開ISP,IAP--------------------*/
void ISP_IAP_enable()
{
//EA = 0;
ISP_CONTR = ISP_CONTR & 0x18;
ISP_CONTR = ISP_CONTR | 0x01;
ISP_CONTR = ISP_CONTR | 0x80;
}
/*--------------------關(guān)ISP,IAP--------------------*/
void ISP_IAP_disable()
{
ISP_CONTR = ISP_CONTR & 0x7F;
ISP_TRIG = 0x00;
//EA = 1;
}
/*--------------------觸發(fā)代碼--------------------*/
void ISPgoon()
{
ISP_IAP_enable();
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
Nop();
}
/*--------------------扇區(qū)擦除--------------------*/
void ISP_erase(uchar sector) //扇區(qū)號(0~7)
{
ISP_ADDRL = 0;
ISP_ADDRH = (8192 + 512*(uint)sector)>>8;
ISP_CMD = ISP_CMD & 0xF8;
ISP_CMD = ISP_CMD | 0x03;
ISPgoon();
ISP_IAP_disable();
}
/*--------------------字節(jié)寫(強(qiáng)制操作)--------------------*/ //必須確認(rèn),目標(biāo)區(qū)域的bin值已置11111111,否則在寫入前應(yīng)先擦除該扇區(qū)
void ISP_write(uchar sector,uint offset,uchar ByteData) //扇區(qū)號(0~7),地址偏移量(0~511),8位數(shù)據(jù)
{
offset = 8192 + 512*(uint)sector + offset;
ISP_ADDRL = offset;
ISP_ADDRH = offset>>8;
ISP_CMD = ISP_CMD & 0xF8;
ISP_CMD = ISP_CMD | 0x02;
ISP_DATA = ByteData;
ISPgoon();
ISP_IAP_disable();
}
/*--------------------字節(jié)讀(強(qiáng)制操作)--------------------*/
uchar ISP_read(uchar sector,uint offset) //扇區(qū)號(0~7) ,地址偏移量(0~511)
{
offset = 8192 + 512*(uint)sector + offset;
ISP_ADDRL = offset;
ISP_ADDRH = offset>>8;
ISP_CMD = ISP_CMD & 0xF8;
ISP_CMD = ISP_CMD | 0x01;
ISPgoon();
ISP_IAP_disable();
return (ISP_DATA);
}
/*--------------------空白地址定位--------------------*/
uint ISP_locat(uchar sector) //扇區(qū)號0~7
{
uint offset;
for(offset=0;offset<512&&ISP_read(sector,offset)!=255;offset++);
return (offset); //返回512說明扇區(qū)已滿
}
/*--------------------整型寫(自動(dòng)管理扇區(qū)空間)--------------------*/
void ISP_UintWrite(uchar sector,uint UintData) //扇區(qū)號(0~7),16位數(shù)據(jù)(0~65534,系統(tǒng)定義65535為空)
{
uint offset;
offset=ISP_locat(sector); //低位
if(offset==512) //扇區(qū)已滿
{
ISP_erase(sector); //擦除扇區(qū)
offset=0;
}
ISP_write(sector,offset,UintData);
ISP_write(sector,offset+1,UintData>>8);
}
/*--------------------整型讀(自動(dòng)管理扇區(qū)空間)--------------------*/
uint ISP_UintRead(uchar sector) //扇區(qū)號(0~7)
{
uint offset;
offset=ISP_locat(sector); //比高字節(jié)大1
if(offset<2) //這種情況說明整個(gè)扇區(qū)是空的
offset=2; //取第扇區(qū)上2個(gè)地址,即將第1和第0個(gè)地址位作為讀取區(qū),防止報(bào)錯(cuò)
return (((uint)ISP_read(sector,offset-1)<<8)+ISP_read(sector,offset-2));
}
對于STM32F103我就上傳到附件了
希望能幫到你吧 |
評分
-
查看全部評分
|