Как перезаписать флэш-память на микроконтроллеры серии STM32L

Я пытаюсь записать известный шаблон (например, 0xFFFFFFFF или 0x00000000) поверх уже записанной флэш-памяти, чтобы сделать ее часть недействительной для примитивной файловой системы. Но это не работает для меня в серии STM32L, как в серии STM32F.

Я привык к семейству микроконтроллеров STM32F, где флэш-память стирается до 0xFFFFFFFF и записывается с нулями. Вы можете написать что угодно, чтобы стереть память, т.е.

 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). Я пытался написать шаблон из 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

0 ответов

Другие вопросы по тегам