既知のパターン (0xFFFFFFFF または 0x00000000) を書き込み済みのフラッシュ メモリに書き込み、プリミティブ ファイル システムの一部を無効にしようとしています。しかし、STM32FシリーズのようにSTM32Lシリーズではうまくいきません。
私は、フラッシュメモリが 0xFFFFFFFF に消去され、0 が書き込まれる STM32F ファミリのマイクロコントローラに慣れています。メモリを消去したいものは何でも書くことができます。
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 ペリフ ライブラリのラッパーです)。毎回ビットをシフトする<<1で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