基于stm32,通过更换数据存储扇区提升w25q128flash芯片使用寿命
从芯片手册中可以得到w25q128单个扇区的写入次数约为10万次。项目中有些数据需要经常的进行读写,如果这些数据只是写在一个扇区,那么到达10W次后,可能就会面临使用扇区损坏的风险,我的解决方案就是更换数据的存储位置。
我这次的代码是基于自己项目写的,只有参考价值,不一定符合你的使用要求。
我的需求:
在机器工作过程中,每次动作都会记录一次数据到flash芯片,然后将当前数据的最高地址写入到特定的某个ADDR,供次写入时,读取出来,作为这条数据的起始地址。
这个位置的需要经常的读写,容易损坏,如果损坏了,那么以后历史数据都无法正常写入了。
解决方案:使用若干个相邻的扇区,数据存储到达一定的条数后,更换扇区继续,开机后先判断数据历史数据位置的ADDR在哪个扇区。
判断条数:(最高位地址-起始地址)/每条数据的位数=条数
u32 addr_highest=0x010000; //写入历史数据最高位的地址的位置
u32 StartAddrToWrite_init(u32 addr_to_read) //这里将addr_highest传入 { u8 i = 0; u8 sector=1; u32 addr; u32 start_addr; u8 tmp_buffer[4]={0}; for(sector=1;sector<4;sector++) //从第一个扇区开始,读取每个扇区 { W25QXX_Read(tmp_buffer, addr_to_read, sizeof(tmp_buffer)); //读取addr_to_read这个位置存的值,如果从来没写入过,是FFFFFFFF,写入过就是这个扇区保存的的最高地址 addr=((tmp_buffer[0]<<24)&0xFF000000)+((tmp_buffer[1]<<16)&0x00FF0000) +((tmp_buffer[2]<<8)&0x0000FF00)+(tmp_buffer[3]&0x000000FF); if(addr==0XFFFFFFFF) //没写过 { if(sector==1) //第一次 { start_addr=BASEADDRESS; //历史数据写入开始地址是自己设置的BASEADDRESS } else { start_addr=ReadStartAddrToWrite(addr_to_read-0x001000); //读取上个扇区保存的地址的值,每个扇区相差0x001000位 } UpdateHighestDataAddr(start_addr,addr_to_read); //赋值给后一个扇区 break; } else //如果写过了 { addr = ReadStartAddrToWrite(addr_to_read); //读取最高位地址 if((addr-BASEADDRESS)/(32*10)>=sector) //判断条数(一条32个字节),测试是使用10条,大于本扇区设定能存的最大条数 { addr_to_read+=0x001000; //换到下个扇区继续读取,判断 } else //没有超过本扇区最大能存的条数,继续在本扇区使用,跳出for()循环 { addr_to_read=addr_to_read; break; } } } return (addr_to_read); }
大概的思路就是这样,如果你直接复制,因为里面嵌套了别的函数,那肯定不能用的了。