Estoy intentando escribir un patrón conocido (es decir, 0xFFFFFFFF o 0x00000000) sobre la memoria flash ya escrita, para invalidar partes de un sistema de archivos primitivo. Pero no me funciona en la serie STM32L como en la serie STM32F.
Estoy acostumbrado a la familia de microcontroladores STM32F, donde la memoria flash se borra a 0xFFFFFFFF y se escribe con 0. Puedes escribir lo que quieras para borrar la memoria, es decir,
write 0x00001234 on top of 0xFFFFFFFF -> 0x00001234
y puedes escribir 0x00000000 (todos ceros) encima de cualquier cosa
write 0x00000000 on top of 0x00001234 -> 0x0000000
Ahora estoy usando la familia STM32L (baja potencia), y la memoria flash es totalmente diferente. Se borra a 0x00000000 y se escribe con 1's. Sin embargo, no sé cómo escribir de forma fiable todos los unos. Por ejemplo, si borro, puedo hacer esto
write 0x01020304 on top of 0x00000000 -> 0x01020304
pero si lo intento
write 0xFFFFFFFF on top of 0x01020304 -> 0xFFFFFFBF !!!
Tenga en cuenta que la respuesta final tiene una B . No son todos unos. De hecho, si escribo bytes 0x00 a 0xFF en una página de memoria recién borrada, y luego escribo 0xFFFFFFFFFF en su totalidad, obtengo resultados muy erróneos:
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
Aquí está el pseudo código que estoy usando (FlashWrite es una envoltura alrededor de la biblioteca de periféricos estándar STM). Intenté escribir un patrón de 8 escrituras con los bits cambiados < < 1 cada vez, y eso me dio lo que quería (todos) pero no estoy seguro de que sea confiable.
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