IPA掉电保存数据方法

IAP为笙泉掉电保存用的数据Flash存储空间,根据MA84G564手册说明,在操作IAP之前,必须先指定IAPLB的空间大小,IAPLB制定了IAP存储空间的起始地址,由于Flash是以扇区为计量单位,每个扇区512B,每次擦除只能擦除一个块的大小。每次写入新的数据前必须先把之前的数据取出来放到RAM中,然后擦除一整个块,因为Flash的存储原理是,数据是0就写,如果是1就不写,所以是不能在未擦除的区域写入数据。否则数据为错误的。

数据擦除代码:


void IAP_Erase(u8 AddrH, u8 AddrL)
{
ISPCR = ISP_ENABLE;
IFADRH = AddrH;
IFADRL = AddrL;
IFMT = 0x03; //erase
    SCMD = 0x46;
    SCMD = 0xB9;
    ISPCR = ISP_DISABLE;
}


数据写入函数:

void IAP_Program(u8 AddrH, u8 AddrL, char Dta)
{
ISPCR = ISP_ENABLE;
IFADRH = AddrH;
IFADRL = AddrL;
IFD = Dta;
IFMT = 0x02; //program
    SCMD = 0x46;
    SCMD = 0xB9;
    ISPCR = ISP_DISABLE;
}

可以按字节写入,但是写入前,当前扇区必须先清除;所以最好先开一个512的缓冲区;

数据读取函数:

char IAP_Read(u8 AddrH, u8 AddrL)
{
u8 Dta;
 
  ISPCR = ISP_ENABLE;
IFADRH = AddrH;
IFADRL = AddrL;
IFMT = 0x01; //read
    SCMD = 0x46;
    SCMD = 0xB9;
    ISPCR = ISP_DISABLE;


Dta = IFD;
return Dta;
}

读取的时候直接读IFD的数据,单字节读取;

保存数据函数:

u8 Save_data(u8* value_addr)
{
// char tmp_value[TMP_MAX] = 0;
u8 i = 0,AddrH = 0; 
u8* addr_p = value_addr;
AddrH = 0xF0;//= IAP_Read(0x00,0x03);  //read the value of IAPRL 


// for(i=0;i //save the value temp
// {
//  tmp_value[i] = IAP_Read(AddrH,i);
// }
IAP_Erase(AddrH,0x00);  //erase the block 512byte
for(i=0;i{
IAP_Program(AddrH,i,*addr_p);
addr_p++;
}
   return 0;
}

传入需要保存的数据buffer,我的buffer在之前就读取了,所以,此处只管擦除后,写入整个缓冲去的数据;

你可能感兴趣的:(MCU,FLASH)