Sí, hay que borrar una página entera (ponerla a 0xFF) antes de poder empezar a escribir en ella.
En la mayoría de las memorias flash externas se puede escribir en una página varias veces sin necesidad de borrarla, siempre y cuando se escriba en ubicaciones de bytes no utilizadas anteriormente. Consulte esta respuesta .
Sin embargo, el controlador de la memoria flash interna en los STM32 no permitirá ninguna escritura a menos que se borre toda la página.
Si quieres ir por el camino fácil, ST tiene una solución de software disponible gratuitamente que proporciona una capa de emulación de EEPROM utilizando un área de memoria flash interna. Proporciona un conjunto sencillo de funciones y maneja todas las complejidades "bajo el capó". Permite la lectura y escritura de un solo byte, y maneja el borrado por ti.
No sé qué microcontrolador estás utilizando. Aquí están los documentos de emulación de EEPROM para el STM32F0xx y STM32F10x microcontroladores.
Por ejemplo, se escribe un byte con EE_WriteVariable()
. El software asigna esta ubicación a una página flash, lee esa página, inserta su byte donde corresponda, y luego programa una página nueva completa en otra página flash . Va de un lado a otro de las páginas, y te oculta todo esto.
Sin embargo, esto requiere mucho tiempo. No sólo se tarda un poco, sino que el bus de memoria puede bloquearse mientras se espera a que se complete la escritura en la memoria flash, por lo que no se puede hacer esto en aplicaciones de tiempo crítico.
Si este software no funciona para tu aplicación, puedes construir una solución tan compleja como necesites. Una vez escribí un gran sistema para manejar datos de configuración de misión crítica, cuyos datos podían cambiar sobre la marcha. Utilizaba múltiples sectores, ubicaciones redundantes, verificación de crc, nivelación de desgaste, etc. No podía confiar en una tabla de contenidos, porque ¿qué pasaba si el sistema se apagaba en medio de la actualización de la tabla de contenidos? Así que tenía una rutina para descubrir el banco de configuración flash "activo" (léase: "más recientemente escrito") en la inicialización... etc.