打印
[经验分享]

IPA掉电保存数据方法

[复制链接]
641|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
t60yz|  楼主 | 2023-8-21 00:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
IAP为笙泉掉电保存用的数据Flash存储空间,根据MA84G564手册说明,在操作IAP之前,必须先指定IAPLB的空间大小,IAPLB制定了IAP存储空间的起始地址,由于Flash是以扇区为计量单位,每个扇区512B,每次擦除只能擦除一个块的大小。每次写入新的数据前必须先把之前的数据取出来放到RAM中,然后擦除一整个块,因为Flash的存储原理是,数据是0就写,如果是1就不写,所以是不能在未擦除的区域写入数据。否则数据为错误的。

使用特权

评论回复
沙发
t60yz|  楼主 | 2023-8-21 00:33 | 只看该作者
数据擦除代码:


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

使用特权

评论回复
板凳
t60yz|  楼主 | 2023-8-21 00:34 | 只看该作者
数据写入函数:

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

使用特权

评论回复
地板
t60yz|  楼主 | 2023-8-21 00:35 | 只看该作者
可以按字节写入,但是写入前,当前扇区必须先清除;所以最好先开一个512的缓冲区;

使用特权

评论回复
5
t60yz|  楼主 | 2023-8-21 00:36 | 只看该作者
数据读取函数:

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

使用特权

评论回复
6
t60yz|  楼主 | 2023-8-21 00:36 | 只看该作者
读取的时候直接读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<TMP_MAX;i++) //save the value temp
// {
//  tmp_value[i] = IAP_Read(AddrH,i);
// }
IAP_Erase(AddrH,0x00);  //erase the block 512byte
for(i=0;i<TMP_MAX;i++)
{
IAP_Program(AddrH,i,*addr_p);
addr_p++;
}
   return 0;
}

使用特权

评论回复
7
t60yz|  楼主 | 2023-8-21 00:37 | 只看该作者
传入需要保存的数据buffer,我的buffer在之前就读取了,所以,此处只管擦除后,写入整个缓冲去的数据;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

123

主题

951

帖子

0

粉丝