新闻  |   论坛  |   博客  |   在线研讨会
多次擦写FLash单片机编程“续命”方法-单片机开发
英锐恩 | 2019-06-27 17:53:16    阅读:1652   发布文章

英锐恩分享多次擦写FLash单片机编程“续命”方法。在单片机开发应用中,工程师经常会遇到需要在单片机内部Flash的某个区域保存和读取一些数据,而这些数据在应用中可能会经常变化,因而需要对Flash的数据经常更新。需要不断地进行擦写,那么,如何才能延长单片机的Flash擦写寿命呢?

EN Flash 工艺单片机具有1000 K Flash擦除次数,一个Flash Page是512字节,也就是在执行擦除指令时,一次至少擦除512字节的数据。EN Flash 工艺单片机提供了Flash自编程的读、写和擦除函数以及对Flash操作的参考例程。Flash支持单字节读和写,但是每次在更新数据之前必须要先擦除原来的数据,不能在原数据基础上直接写新数据内容。假设每次需要更新的数据长度是16个字节,最简单的方法就是在每次更新数据之前执行擦除指令,然后写入新数据。但是更新数据频率比较高的应用场合,这种方法显然是不行的。此时需要采取“空间换时间”的方法了,擦写的次数和存储数据长度的大小成反比。“空间换时间”就是指利用相对多的Flash空间来换取相对多的擦写时间(次数)。在第一次执行擦除指令后,可以依次将数据写入Flash的这一页,当写满一页后再进行擦除操作。这样的话,一页512字节空间,每次写入16字节长度的数据,一页就可以写32个数据块,写满后再全部擦除,而不用每次写数据前都擦除,该页的擦除次数就可以提高32倍,也就是100K*32=320万次了。

既然思路清晰了,那么单片机软件实现起来就相对比较简单。

首先需要选取数据块中的某一字节作为地址INDEX,更新数据时第一个写入Flash。Flash的编程原理都是只能将1写为0,而不能将0写为1。所以在Flash编程之前,必须将对应的页擦除,而擦除的过程就是把所有位都写为1的过程,页内的所有字节变为0xFF。

写入数据实现过程:

每次写入数据时,从低地址到高地址依次(以16位步进)判断INDEX的内容,为了防止实际数据中包含0xFF内容,从而出现误判的情况,建议判断INDEX和INDEX+1两个地址的内容。如果都为0xFF,表示该地址空间未被写过数据,写入需要更新的数据;如果至少有一个不为0xFF,表示该地址空间已被写过数据,继续查询,直到查到内容都为0xFF为止;如果所有的INDEX(32个)和INDEX+1都至少有一个不为0xFF,表示该页已经写满,执行擦除指令后从首地址写入数据。

读取数据实现过程:

每次读取数据时,从高地址到低地址依次(以16为步进)判断INDEX的内容,这样是为了查询到最新的数据。同样为了防止实际数据中包含0xFF内容,从而出现误判的情况,建议判断INDEX和INDEX+1两个地址的内容。如果至少有一个不为0xFF,表示该地址已写过数据,读取数据;如果所有的INDEX(32个)和INDEX+1都为0xFF,表示该页还未写入数据。



*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客