我试图在已经写入的闪存上写一个已知模式(即0xFFFFFFFF或0x00000000),使原始文件系统的部分无效。但它对STM32L系列不起作用,就像在STM32F系列上一样。
我习惯于STM32F系列微控制器,其中闪存被擦除为0xFFFFFFFF并用0写入。您可以编写任何想要删除内存的内容,即
write 0x00001234 on top of 0xFFFFFFFF -> 0x00001234
你可以在任何东西上写下0x00000000(全零)
write 0x00000000 on top of 0x00001234 -> 0x0000000
我现在正在使用STM32L系列(低功耗),闪存完全不同。它被擦除为0x00000000,并以1写入。但是,我不知道如何可靠地写出所有的。例如,如果我擦除,我可以这样做
write 0x01020304 on top of 0x00000000 -> 0x01020304
但如果我尝试
write 0xFFFFFFFF on top of 0x01020304 -> 0xFFFFFFBF !!!
请注意,最终答案中包含 B 。这不是全部。实际上,如果我将字节0x00到0xFF写入新擦除的内存页面,然后在其上面写入0xFFFFFFFFFF,我会得到非常糟糕的结果:
ff ff ff bf ff ff ff ff ff ff ff ff ff ff ff fb
f7 ff ff ff fd ff ff ff ff ff ff f7 ff ff ff ff
fe ff ff ff ff ff ff ff ff ff ff 7f f7 ff ff ff
ff ff ff fb ff ff ff ef ff ff ff ff ff ff ff df
fe ff ff ff ff ff ff ff ff ff ff 7f f7 ff ff ff
ff ff ff fb ff ff ff ef ff ff ff ff ff ff ff ff
ff ff ff bf ff ff ff ff ff ff ff ff ff ff ff fb
f7 ff ff ff fd ff ff ff ff ff ff f7 ff ff ff df
f7 ff ff ff fd ff ff ff ff ff ff f7 fe ff ff ff
ff ff ff bf ff ff ff ff ff ff ff ff fd ff ff ff
ff ff ff fb ff ff ff ef ff ff ff ff ff ff ff bf
fe ff ff ff ff ff ff ff ff ff ff 7f fb ff ff ff
ff ff ff fb ff ff ff ef ff ff ff ff ff ff ff bf
fe ff ff ff ff ff ff ff ff ff ff 7f ff ff ff ef
f7 ff ff ff fd ff ff ff ff ff ff f7 fe ff ff ff
ff ff ff bf ff ff ff ff ff ff ff ff fb ff ff ff
这是我正在使用的伪代码(FlashWrite是STM std periph库的包装器)。我尝试写一个8次写入的模式,每次移位<<<<<<<<<<<<<<<<&#1
uint32_t pattern = 0x04030201;
FlashErasePage(0x0801E000,FLASH_PASSWORD);
for(int j=0;j<64;j++) {
FlashWriteArray(0x0801E000 + 4*j,(uint8_t*)&pattern,4);
pattern += 0x04040404;
}
for(int j=0;j<64;j++) {
#if 1
// write once
uint32_t pattern = 0xFFFFFFFF;
FlashWriteArray(0x0801E000 + 4*j,(uint8_t*)&pattern,4);
#else
// write shifting bit pattern
uint32_t pattern = 0x01010101;
for(int i=0;i<8;i++) {
FlashWriteArray(0x0801E000 + 4*j,(uint8_t*)&pattern,4);
pattern <<=1;
}
#endif