在stm32l1x上实现的flash ECC算法(flash纠错码)是如何工作的?
背景:
我想在STM32L151 MCU的程序闪存中对单个字进行多次增量写入,而不在其间执行页擦除如果没有ecc,可以递增地设置位,例如,首先是0x00,然后是0x01,然后是0x03(stm32l1将位擦除为0而不是1),等等。由于stm32l1每个字有8位ecc,此方法不起作用。然而,如果我们知道ECC算法,我们可以很容易地找到一个短的值序列,它可以在不违反ECC的情况下增量写入。
我们可以简单地尝试不同的值序列,看看哪些是有效的(其中一个序列是0x0000001、0x00000101、0x00030101、0x03030101),但是如果我们不知道ECC算法,我们就无法检查序列是否违反ECC,在这种情况下,如果位损坏,错误纠正将不起作用。
[编辑]该功能应用于使用stm32l1的内部程序内存实现简单的文件系统。数据块用包含状态的头标记。多个块可以驻留在一个页面上状态可以随时间变化(首先是“新建”,然后是“已使用”,然后是“已删除”,等等)状态的数目很小,但是如果我们可以覆盖以前的状态而不必首先删除整个页面,这会使事情变得非常容易。
最佳答案
谢谢你的评论!由于到目前为止还没有答案,我将总结一下,到目前为止我发现了什么(根据经验和对这个答案的评论):
根据STM32L1数据表“整个非易失性存储器嵌入了纠错码(ECC)特性”,但参考手册并未说明程序存储器中的ECC。
该数据表符合我们可以发现的经验,当随后写多个字到同一个程序内存位置,而不删除之间的网页在这种情况下,一些价值观序列起作用,而另一些则不起作用。
以下是我个人的结论,基于实证结果,本文的研究和评论有限这不是基于官方文件。不要在上面做任何严肃的工作(我也不会)!
看来,ecc是按32位字计算和持久化的。如果是,则ECC的长度必须至少为7位。
每个单词的ecc可能与单词本身写在同一个非易失性mem中。因此,同样的限制也适用。即在擦除之间,只能设置额外的位。正如斯塔克指出的,我们只能用以下值覆盖程序mem中的单词:
只设置额外的位,但不清除任何位
与前一个ECC相比,ECC也只设置额外的位。
如果我们写一个值,它只设置额外的位,但是ECC需要清除位(因此无法正确写入位),那么:
如果ecc错误一位,则用ecc算法纠正错误,并能正确读取写入的值。但是,如果另一个位失败,ecc将不再工作,因为ecc只能纠正单个位错误。
如果ECC错误超过一位,则ECC算法无法更正错误,并且读取的值将是错误的。
我们无法(很容易)从经验上找出哪些值序列可以正确写入,哪些不能正确读取。如果一个值序列可以正确写入和读取,我们就不知道这是否是由于单位错误的自动更正造成的这方面是这个问题问实际算法的全部原因。
ecc算法本身似乎没有文档记录。汉明码似乎是一种常用的ECC算法,在AN4750中,他们写道,汉明码实际上用于SRAM中的纠错该算法可用于或不用于stm32l1的程序存储器。
STM32L1 reference manual似乎并没有明确地禁止在没有擦除的情况下多次写入程序内存,但也没有说明相反的文档为了不使用未记录的功能,我们将避免在我们的产品中使用此类功能,并找到解决方法。
关于algorithm - STM32L1xx上的Flash ECC算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50585866/