0

我正在尝试在已写入的闪存之上编写一个已知模式(即 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
4

0 回答 0