单片机收集:提高单片机 flash擦写次数
如何提高FLASH的擦写次数
在实际应用中,用户经常需要在程序运行过程中保存或读取一些数据,这些数据在工作中经常会变化,而且掉电后也不能丢失,所以需要及时地进行存储,存储这些数据常用的存储器是EEPROM。HXM6002虽然本身不带EEPROM,但是它支持自编程技术,可以利用FLASH来模拟EEPROM,这样不仅简化了设计,而且降低了成本。
一般情况下,FLASH都是以2的n次方为一页,在执行擦除指令时,一次最少要擦除一页的数据。FLASH支持单字节读写,但每次在更新数据前都必须先擦除原数据,然后才能重新写入数据,而不能在原数据基础上更新内容。
HXM6002模拟EEPROM的FLASH每页为512字节。在实际应用中,即使只需要存储少量的数据,如32字节的数据,也必须以512字节来模拟EEPROM。最简单的存储方法是,在每次更新数据前执行擦除指令,然后写入新数据。该方法适用于更新数据频率不高的应用场合,因为HXM6002的擦写次数典型值为1000次。对于更新数据频率较高的应用场合,如需要1万次的擦写次数,就需要采用“空间换时间”的方法了,擦写的次数和存储数据的大小成反比。所谓“空间换时间”,是指利用相对多的代码空间来换取相对多的擦写时间(次数)。即在一页内,可以依次将数据写入FLASH,当写满一页后,再全部擦除,比如存储32字节的数据块,一页就可以写16个数据块,写满后再全部擦除,这样该页的擦写次数就可以提高15倍,即1.6万次。
下面以32字节的数据块为例,来简要说明“空间换时间”的软件实现方法。首先需要选取数据块中的某一字节作为地址INDEX,更新数据时第一个写入FLASH,该字节必须满足任何时候都不能为FFH,否则会发生错误。
(1)保存数据:每次保存数据时,从低地址到高地址依次(以32为步进)判断INDEX的内容。如果为FFH,表示该地址空间未写过数据,写入需要更新的数据;如果不为FFH,表示该地址空间已写过数据,继续查询;如果所有的INDEX(16个)都不为FFH,表示该页已经写满,执行擦除指令后从首地址写入数据。
(2)读取数据:每次读取数据时,从高地址到低地址依次(以32为步进)判断INDEX的内容,这是为了查询到最新的数据。如果不为FFH,表示该地址已写过数据,读取数据;如果所有的INDEX(16个)都为FFH,表示该页还未写入数据。
前面提到,每次在更新数据前都必须先擦除原数据,然后才能重新写入数据,而不能在原数据基础上更新内容,这并不是绝对的。根据FLASH写操作的特性,只能将‘1’写成‘0’,而不能将‘0’写成‘1’。而1Byte=8Bit,所以,如果每次只是写1比特为‘0’,则一个字节可以写8次。例如,第一次写第0位为‘0’,第二次写第1位为‘0’,……,第八次写第7位为‘0’。在实际应用中,也可以利用该特性,来获取更多的擦写次数。